Repository: svix/svix-webhooks (language: rust)

Issue:
Feature request [rust]: allow specifying TLS flavour to use
## Feature Request

### Motivation

We are building our application against musl, cross-compiling it from regular libc Ubuntu. However, we are having issues with svix client, because it depends on system OpenSSL, which in our case would be linked against libc. There [are workarounds](https://github.com/sfackler/rust-openssl/issues/603), but they are a bit involved.

### Proposal
Allow user to choose whether `openssl` or `rustls` version of `reqwest` will be used by the svix client

### Alternatives

Alternative is to either vendor openssl, comiling it each time, or to use a pre-made Docker image with openssl compiled against musl included. However, we are already using reqwest with `rustls`, and would like to avoid having both flavours in the dependency tree, as well as extra complexity in the build pipeline.

[Go SDK] MessageAttemptListOptions doesn't support "endpoint_id" parameter
## Bug Report

### Version

v0.85.1 of Golang SDK

### Platform

Irrelevant

### Description

In API docs for [List Attempts By Msg](https://api.svix.com/docs#tag/Message-Attempt/operation/v1.message-attempt.list-by-msg) it says that it is possible to pass `endpoint_id` parameter (including UID), but I’m struggling to find that parameter in Golang SDK - see the following [structure](https://github.com/svix/svix-webhooks/blob/main/go/messageattempt.go#LL28C3-L28C3).
JS SDK missing `with_content` parameter on `v1.message.list` endpoint
## Bug Report


https://api.svix.com/docs#tag/Message/operation/v1.message.list

### Version

`0.85.1`

### Platform

All

### Description

I tried this code:

```
const messages = await svix.message.list(
      "app_...",
      {
        withContent: true
      }
    );
```

I expected to see this happen see the `messages` contain the webhook `payload` but they did not.




Discussion / hints:

Fix patch:
diff --git a/.github/workflows/bridge-ci.yml b/.github/workflows/bridge-ci.yml
new file mode 100644
index 000000000..99c44e7ba
--- /dev/null
+++ b/.github/workflows/bridge-ci.yml
@@ -0,0 +1,88 @@
+name: Bridge CI
+
+on:
+  push:
+    branches:
+      - main
+    paths:
+      - 'bridge/**'
+      - '.github/workflows/bridge-ci.yml'
+  pull_request:
+    paths:
+      - 'bridge/**'
+      - '.github/workflows/bridge-ci.yml'
+
+jobs:
+  test-versions:
+    name: Webhook Bridge CI
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        rust: [stable, beta]
+    steps:
+    - uses: actions/checkout@master
+    - uses: actions-rs/toolchain@v1
+      with:
+        toolchain: ${{ matrix.rust }}
+        override: true
+        profile: minimal
+        components: clippy, rustfmt
+    - uses: Swatinem/rust-cache@v1
+      with:
+        working-directory: bridge
+
+    - name: rustfmt
+      uses: actions-rs/cargo@v1
+      with:
+        command: fmt
+        args: --manifest-path bridge/Cargo.toml --all -- --check
+
+    - name: Install dependencies
+      # Packages should align with whatever is in the bridge/Dockerfile
+      run: |
+        sudo apt-get install -y \
+          build-essential=12.* \
+          checkinstall=1.* \
+          curl \
+          libssl-dev=* \
+          pkg-config=0.29.* \
+          protobuf-compiler=* \
+          zlib1g-dev=1:*
+
+    - name: Build
+      uses: actions-rs/cargo@v1
+      with:
+        command: build
+        args: --manifest-path bridge/Cargo.toml --all --locked
+
+    - name: Start dependencies
+      run: docker-compose -f "bridge/testing-docker-compose.yml" up -d
+
+    - name: Clippy
+      uses: actions-rs/cargo@v1
+      with:
+        command: clippy
+        args: --manifest-path bridge/Cargo.toml --all --all-targets --all-features -- -D warnings
+
+    - name: Run tests
+      working-directory: ./bridge
+      run: ./run-tests.sh
+
+    - name: Stop dependencies
+      run: docker-compose -f "bridge/testing-docker-compose.yml" down
+
+#  deny-check:
+#    name: cargo-deny check
+#    runs-on: ubuntu-latest
+#    continue-on-error: ${{ matrix.checks == 'advisories' }}
+#    strategy:
+#      matrix:
+#        checks:
+#          - advisories
+#          - bans licenses sources
+#    steps:
+#      - uses: actions/checkout@v2
+#      - uses: EmbarkStudios/cargo-deny-action@v1
+#        with:
+#          command: check ${{ matrix.checks }}
+#          arguments: --all-features --manifest-path axum/Cargo.toml
diff --git a/.github/workflows/bridge-release.yml b/.github/workflows/bridge-release.yml
new file mode 100644
index 000000000..dbdb34252
--- /dev/null
+++ b/.github/workflows/bridge-release.yml
@@ -0,0 +1,89 @@
+name: Bridge Release
+
+on:
+  release:
+    types: [published]
+
+jobs:
+  release:
+    name: release ${{ matrix.target }}
+    runs-on: ${{ matrix.os }}
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - target: x86_64-pc-windows-gnu
+            os: windows-latest
+            extension: ".exe"
+
+          - target: x86_64-unknown-linux-gnu
+            os: ubuntu-latest
+            extension: ""
+
+          - target: x86_64-apple-darwin
+            os: macos-latest
+            extension: ""
+
+          - target: aarch64-apple-darwin
+            os: macos-latest
+            extension: ""
+    steps:
+      - uses: actions/checkout@master
+
+      - name: Install Rust toolchain
+        uses: actions-rs/toolchain@v1
+        with:
+          toolchain: stable
+          override: true
+          profile: minimal
+          target: ${{ matrix.target }}
+
+      - name: Install musl for x86_64-unknown-linux-musl
+        if: ${{ matrix.target == 'x86_64-unknown-linux-musl' }}
+        run: sudo apt-get install -y musl-dev musl-tools
+
+      - name: Compile bridge
+        uses: actions-rs/cargo@v1
+        with:
+          command: build
+          args: --target ${{ matrix.target }} --release --manifest-path bridge/svix-bridge/Cargo.toml
+
+      - name: Release
+        uses: actions/upload-artifact@v3
+        with:
+          name: svix-bridge-${{ matrix.target }}
+          path: bridge/target/${{ matrix.target }}/release/svix-bridge${{ matrix.extension }}
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+  docker:
+    name: release docker
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@master
+
+      - name: Setup QEMU
+        uses: docker/setup-qemu-action@v2
+
+      - name: Login Docker
+        uses: docker/login-action@v1
+        with:
+          username: ${{ secrets.DOCKERHUB_USERNAME }}
+          password: ${{ secrets.DOCKERHUB_TOKEN }}
+
+      - name: Setup Docker Buildx
+        uses: docker/setup-buildx-action@v2
+
+      - name: Derive Version Numbers
+        run: |
+          export REPO="${{ secrets.DOCKERHUB_USERNAME }}/svix-bridge"
+          echo DOCKER_TAGS="$(echo "${{ github.event.release.tag_name }}" | sed -E "s#v([0-9]+)\.([0-9]+)\.([0-9]+)#${REPO}:latest,${REPO}:v\1.\2.\3,${REPO}:v\1.\2,${REPO}:v\1#")" >> "$GITHUB_ENV"
+
+      - name: Build and push Docker image
+        uses: docker/build-push-action@v2
+        with:
+          context: ./bridge
+          file: ./bridge/Dockerfile
+          push: true
+          tags: ${{ env.DOCKER_TAGS }}
+          platforms: linux/amd64
diff --git a/.github/workflows/bridge-security.yml b/.github/workflows/bridge-security.yml
new file mode 100644
index 000000000..6edd78380
--- /dev/null
+++ b/.github/workflows/bridge-security.yml
@@ -0,0 +1,24 @@
+name: Bridge Security
+
+on:
+  push:
+    branches:
+    - main
+    paths:
+      - 'bridge/**/Cargo.toml'
+      - 'bridge/**/Cargo.lock'
+      - '.github/workflows/bridge-security.yml'
+  pull_request:
+    paths:
+      - 'bridge/**/Cargo.toml'
+      - 'bridge/**/Cargo.lock'
+      - '.github/workflows/bridge-security.yml'
+
+jobs:
+  security_audit:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+      - uses: EmbarkStudios/cargo-deny-action@v1
+        with:
+            arguments: --manifest-path=bridge/Cargo.toml
diff --git a/.github/workflows/server-ci.yml b/.github/workflows/server-ci.yml
index 7d94b76bb..74afe46f6 100644
--- a/.github/workflows/server-ci.yml
+++ b/.github/workflows/server-ci.yml
@@ -43,6 +43,13 @@ jobs:
         command: build
         args: --manifest-path server/Cargo.toml --all --locked
 
+    - name: Install dependencies
+      run: sudo apt-get install -y jq
+
+    - name: Check for uncommited OpenAPI changes
+      working-directory: ./server
+      run: ./generate-openapi.sh --check
+
     - name: Start dependencies
       run: docker-compose -f "server/testing-docker-compose.yml" up -d
 
diff --git a/.version b/.version
index c85a67dc1..89755f3ee 100644
--- a/.version
+++ b/.version
@@ -1,1 +1,1 @@
-0.81.0
\ No newline at end of file
+1.4.12
\ No newline at end of file
diff --git a/ChangeLog.md b/ChangeLog.md
index 028214172..c86906ae6 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,7 +1,54 @@
 # Changelog
 
 ## Next
-* Server: refactor expired message cleaner to be incremental
+*
+
+## Version 1.4.12
+* Sync OSS package version with our internal version.
+* Server: support comma separated array query params
+* Bridge: initial release
+* Libs: update OpenAPI spec
+* Libs: add support for "Background Task" endpoints
+* Libs: add support for since/until to endpoint stats
+* Libs/Go: add missing `endpoint_id` option to list attempts by msg.
+* Libs/JavaScript: add missing `withContent` field to `MessageListOptions`.
+* Libs/Rust: fix typo in error handling message
+
+## Version 0.85.1
+* Libs: update OpenAPI spec
+
+## Version 0.85.0
+* Server: add a missing migration for operational webhooks event types.
+* Libs/Ruby: fix the library failing to load due to missing dependency.
+* Libs: **[Semi-breaking]** we changed the return value of the transformation simulation endpoint. It's technically a breaking page, though the API is private so it shouldn't affect people.
+
+## Version 0.84.1
+* Libs: regenerate libs from the correct openapi spec (could have caused potential authentication issues)
+
+## Version 0.84.0
+* Server: add (beta) RabbitMQ implementation
+* Server: upgrade redis-rs and a few other dependencies
+* Server: improve OpenAPI generation
+* Server: fix issue with Redis being required in the docker image
+* Libs/Rust: support choosing the wanted TLS implementation
+
+## Version 0.83.1
+* Libs: update OpenAPI spec
+
+## Version 0.83.0
+* Server: bump deps
+* Libs: Add `send-example` wrapper to libraries
+* Libs/Go: alias missing types from internal dir / openapi package
+
+## Version 0.82.1
+* Libs/Java: serialize nulls when making HTTP requests
+
+## Version 0.82.0
+* Server: refactor expired message cleaner to be incremental (prevent locks)
+* Server: improve OpenAPI generation
+* Server: Fix handling of very large numbers in json (larger than i64)
+* Server: do not throw error on missing payload in worker
+* Server: update dependencies
 
 ## Version 0.81.0
 * Libs: add support for creating application when creating a message
diff --git a/bridge/.dockerignore b/bridge/.dockerignore
new file mode 100644
index 000000000..2f7896d1d
--- /dev/null
+++ b/bridge/.dockerignore
@@ -0,0 +1,1 @@
+target/
diff --git a/bridge/.gitignore b/bridge/.gitignore
new file mode 100644
index 000000000..ea8c4bf7f
--- /dev/null
+++ b/bridge/.gitignore
@@ -0,0 +1,1 @@
+/target
diff --git a/bridge/Cargo.lock b/bridge/Cargo.lock
new file mode 100644
index 000000000..274ae3ac8
--- /dev/null
+++ b/bridge/Cargo.lock
@@ -0,0 +1,4184 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "adler"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67fc08ce920c31afb70f013dcce1bfc3a3195de6a228474e45e1f145b36f8d04"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "amq-protocol"
+version = "7.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d40d8b2465c7959dd40cee32ba6ac334b5de57e9fca0cc756759894a4152a5d"
+dependencies = [
+ "amq-protocol-tcp",
+ "amq-protocol-types",
+ "amq-protocol-uri",
+ "cookie-factory",
+ "nom",
+ "serde",
+]
+
+[[package]]
+name = "amq-protocol-tcp"
+version = "7.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9cb2100adae7da61953a2c3a01935d86caae13329fadce3333f524d6d6ce12e2"
+dependencies = [
+ "amq-protocol-uri",
+ "tcp-stream",
+ "tracing",
+]
+
+[[package]]
+name = "amq-protocol-types"
+version = "7.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "156ff13c8a3ced600b4e54ed826a2ae6242b6069d00dd98466827cef07d3daff"
+dependencies = [
+ "cookie-factory",
+ "nom",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "amq-protocol-uri"
+version = "7.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "751bbd7d440576066233e740576f1b31fdc6ab86cfabfbd48c548de77eca73e4"
+dependencies = [
+ "amq-protocol-types",
+ "percent-encoding",
+ "url",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anstream"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is-terminal",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.71"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8"
+
+[[package]]
+name = "assert-json-diff"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb"
+dependencies = [
+ "async-lock",
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-global-executor"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "blocking",
+ "futures-lite",
+ "once_cell",
+]
+
+[[package]]
+name = "async-global-executor-trait"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75"
+dependencies = [
+ "async-global-executor",
+ "async-trait",
+ "executor-trait",
+]
+
+[[package]]
+name = "async-io"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
+dependencies = [
+ "async-lock",
+ "autocfg",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-lite",
+ "log",
+ "parking",
+ "polling",
+ "rustix",
+ "slab",
+ "socket2",
+ "waker-fn",
+]
+
+[[package]]
+name = "async-lock"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "async-reactor-trait"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e"
+dependencies = [
+ "async-io",
+ "async-trait",
+ "futures-core",
+ "reactor-trait",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "async-task"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
+
+[[package]]
+name = "async-trait"
+version = "0.1.68"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "aws-config"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc00553f5f3c06ffd4510a9d576f92143618706c45ea6ff81e84ad9be9588abd"
+dependencies = [
+ "aws-credential-types",
+ "aws-http",
+ "aws-sdk-sso",
+ "aws-sdk-sts",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "fastrand",
+ "hex",
+ "http",
+ "hyper",
+ "ring",
+ "time 0.3.21",
+ "tokio",
+ "tower",
+ "tracing",
+ "zeroize",
+]
+
+[[package]]
+name = "aws-credential-types"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cb57ac6088805821f78d282c0ba8aec809f11cbee10dda19a97b03ab040ccc2"
+dependencies = [
+ "aws-smithy-async",
+ "aws-smithy-types",
+ "fastrand",
+ "tokio",
+ "tracing",
+ "zeroize",
+]
+
+[[package]]
+name = "aws-endpoint"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c5f6f84a4f46f95a9bb71d9300b73cd67eb868bc43ae84f66ad34752299f4ac"
+dependencies = [
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "aws-types",
+ "http",
+ "regex",
+ "tracing",
+]
+
+[[package]]
+name = "aws-http"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a754683c322f7dc5167484266489fdebdcd04d26e53c162cad1f3f949f2c5671"
+dependencies = [
+ "aws-credential-types",
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "http",
+ "http-body",
+ "lazy_static",
+ "percent-encoding",
+ "pin-project-lite",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sdk-sqs"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "455c218364c68bde3229be8eea1b93535f9efe8e521875f33a8541da6d278099"
+dependencies = [
+ "aws-credential-types",
+ "aws-endpoint",
+ "aws-http",
+ "aws-sig-auth",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-query",
+ "aws-smithy-types",
+ "aws-smithy-xml",
+ "aws-types",
+ "bytes",
+ "http",
+ "regex",
+ "tokio-stream",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sdk-sso"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "babfd626348836a31785775e3c08a4c345a5ab4c6e06dfd9167f2bee0e6295d6"
+dependencies = [
+ "aws-credential-types",
+ "aws-endpoint",
+ "aws-http",
+ "aws-sig-auth",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-types",
+ "aws-types",
+ "bytes",
+ "http",
+ "regex",
+ "tokio-stream",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sdk-sts"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d0fbe3c2c342bc8dfea4bb43937405a8ec06f99140a0dcb9c7b59e54dfa93a1"
+dependencies = [
+ "aws-credential-types",
+ "aws-endpoint",
+ "aws-http",
+ "aws-sig-auth",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-json",
+ "aws-smithy-query",
+ "aws-smithy-types",
+ "aws-smithy-xml",
+ "aws-types",
+ "bytes",
+ "http",
+ "regex",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sig-auth"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84dc92a63ede3c2cbe43529cb87ffa58763520c96c6a46ca1ced80417afba845"
+dependencies = [
+ "aws-credential-types",
+ "aws-sigv4",
+ "aws-smithy-http",
+ "aws-types",
+ "http",
+ "tracing",
+]
+
+[[package]]
+name = "aws-sigv4"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "392fefab9d6fcbd76d518eb3b1c040b84728ab50f58df0c3c53ada4bea9d327e"
+dependencies = [
+ "aws-smithy-http",
+ "form_urlencoded",
+ "hex",
+ "hmac",
+ "http",
+ "once_cell",
+ "percent-encoding",
+ "regex",
+ "sha2",
+ "time 0.3.21",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-async"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13bda3996044c202d75b91afeb11a9afae9db9a721c6a7a427410018e286b880"
+dependencies = [
+ "futures-util",
+ "pin-project-lite",
+ "tokio",
+ "tokio-stream",
+]
+
+[[package]]
+name = "aws-smithy-client"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a86aa6e21e86c4252ad6a0e3e74da9617295d8d6e374d552be7d3059c41cedd"
+dependencies = [
+ "aws-smithy-async",
+ "aws-smithy-http",
+ "aws-smithy-http-tower",
+ "aws-smithy-types",
+ "bytes",
+ "fastrand",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-rustls",
+ "lazy_static",
+ "pin-project-lite",
+ "rustls 0.20.8",
+ "tokio",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-http"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b3b693869133551f135e1f2c77cb0b8277d9e3e17feaf2213f735857c4f0d28"
+dependencies = [
+ "aws-smithy-types",
+ "bytes",
+ "bytes-utils",
+ "futures-core",
+ "http",
+ "http-body",
+ "hyper",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "pin-utils",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-http-tower"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ae4f6c5798a247fac98a867698197d9ac22643596dc3777f0c76b91917616b9"
+dependencies = [
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "bytes",
+ "http",
+ "http-body",
+ "pin-project-lite",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "aws-smithy-json"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23f9f42fbfa96d095194a632fbac19f60077748eba536eb0b9fecc28659807f8"
+dependencies = [
+ "aws-smithy-types",
+]
+
+[[package]]
+name = "aws-smithy-query"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98819eb0b04020a1c791903533b638534ae6c12e2aceda3e6e6fba015608d51d"
+dependencies = [
+ "aws-smithy-types",
+ "urlencoding",
+]
+
+[[package]]
+name = "aws-smithy-types"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16a3d0bf4f324f4ef9793b86a1701d9700fbcdbd12a846da45eed104c634c6e8"
+dependencies = [
+ "base64-simd",
+ "itoa",
+ "num-integer",
+ "ryu",
+ "time 0.3.21",
+]
+
+[[package]]
+name = "aws-smithy-xml"
+version = "0.55.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1b9d12875731bd07e767be7baad95700c3137b56730ec9ddeedb52a5e5ca63b"
+dependencies = [
+ "xmlparser",
+]
+
+[[package]]
+name = "aws-types"
+version = "0.55.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de0869598bfe46ec44ffe17e063ed33336e59df90356ca8ff0e8da6f7c1d994b"
+dependencies = [
+ "aws-credential-types",
+ "aws-smithy-async",
+ "aws-smithy-client",
+ "aws-smithy-http",
+ "aws-smithy-types",
+ "http",
+ "rustc_version 0.4.0",
+ "tracing",
+]
+
+[[package]]
+name = "axum"
+version = "0.6.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39"
+dependencies = [
+ "async-trait",
+ "axum-core",
+ "axum-macros",
+ "bitflags",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustversion",
+ "serde",
+ "serde_json",
+ "serde_path_to_error",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "tokio",
+ "tower",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-core"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ "rustversion",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "axum-macros"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bb524613be645939e280b7279f7b017f98cf7f5ef084ec374df373530e73277"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "base-encode"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a17bd29f7c70f32e9387f4d4acfa5ea7b7749ef784fb78cf382df97069337b8c"
+
+[[package]]
+name = "base64"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7"
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f1e31e207a6b8fb791a38ea3105e6cb541f55e4d029902d3039a4ad07cc4105"
+
+[[package]]
+name = "base64-simd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
+dependencies = [
+ "outref",
+ "vsimd",
+]
+
+[[package]]
+name = "bb8"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e9f4fa9768efd269499d8fba693260cfc670891cf6de3adc935588447a77cc8"
+dependencies = [
+ "async-trait",
+ "futures-channel",
+ "futures-util",
+ "parking_lot 0.11.2",
+ "tokio",
+]
+
+[[package]]
+name = "bb8-redis"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c440295545cb69b3cec992ae8844fbb1de1c84f2f90248438af287e14bb09bde"
+dependencies = [
+ "async-trait",
+ "bb8",
+ "redis",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block-padding"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "blocking"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
+dependencies = [
+ "async-channel",
+ "async-lock",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+ "log",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1"
+
+[[package]]
+name = "byteorder"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+
+[[package]]
+name = "bytes"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
+
+[[package]]
+name = "bytes-utils"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9"
+dependencies = [
+ "bytes",
+ "either",
+]
+
+[[package]]
+name = "cbc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-integer",
+ "num-traits",
+ "time 0.1.45",
+ "wasm-bindgen",
+ "winapi",
+]
+
+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
+[[package]]
+name = "clap"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93aae7a4192245f70fe75dd9157fc7b4a5bf53e88d30bd4396f7d8f9284d5acc"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+ "once_cell",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f423e341edefb78c9caba2d9c7f7687d0e72e89df3ce3394554754393ac3990"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "bitflags",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "191d9573962933b4027f932c600cd252ce27a8ad5979418fe78e43c07996f27b"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "combine"
+version = "4.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "convert_case"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
+
+[[package]]
+name = "cookie-factory"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b"
+
+[[package]]
+name = "core-foundation"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc16"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff"
+
+[[package]]
+name = "crc32fast"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "dashmap"
+version = "5.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc"
+dependencies = [
+ "cfg-if",
+ "hashbrown",
+ "lock_api",
+ "once_cell",
+ "parking_lot_core 0.9.7",
+]
+
+[[package]]
+name = "deadpool"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "421fe0f90f2ab22016f32a9881be5134fdd71c65298917084b0c7477cbc3856e"
+dependencies = [
+ "async-trait",
+ "deadpool-runtime",
+ "num_cpus",
+ "retain_mut",
+ "tokio",
+]
+
+[[package]]
+name = "deadpool-runtime"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eaa37046cc0f6c3cc6090fbdbf73ef0b8ef4cfcc37f6befc0020f63e8cf121e1"
+
+[[package]]
+name = "deno_core"
+version = "0.142.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65c902448001f76f4112341c226456d20ecffe4266051495c2181ad60144b38c"
+dependencies = [
+ "anyhow",
+ "deno_ops",
+ "futures",
+ "indexmap",
+ "libc",
+ "log",
+ "once_cell",
+ "parking_lot 0.12.1",
+ "pin-project",
+ "serde",
+ "serde_json",
+ "serde_v8",
+ "sourcemap",
+ "url",
+ "v8",
+]
+
+[[package]]
+name = "deno_ops"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a66c12cd4ed52c7a96b4ab4663d4b2a0098489986316bb2e36dcdaffe7ae6e3d"
+dependencies = [
+ "once_cell",
+ "proc-macro-crate",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version 0.4.0",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "des"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
+[[package]]
+name = "either"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "enum_dispatch"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2"
+dependencies = [
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
+
+[[package]]
+name = "executor-trait"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08"
+dependencies = [
+ "async-trait",
+]
+
+[[package]]
+name = "fastrand"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "flate2"
+version = "1.0.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide",
+]
+
+[[package]]
+name = "flume"
+version = "0.10.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "pin-project",
+ "spin 0.9.8",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "fslock"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57eafdd0c16f57161105ae1b98a1238f97645f2f588438b2949c99a2af9616bf"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964"
+
+[[package]]
+name = "futures-lite"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
+
+[[package]]
+name = "futures-task"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
+
+[[package]]
+name = "futures-timer"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
+
+[[package]]
+name = "futures-util"
+version = "0.3.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "pin-utils",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "generic_queue"
+version = "0.1.0"
+dependencies = [
+ "async-trait",
+ "aws-config",
+ "aws-sdk-sqs",
+ "bb8",
+ "bb8-redis",
+ "futures",
+ "futures-util",
+ "google-cloud-auth",
+ "google-cloud-default",
+ "google-cloud-gax",
+ "google-cloud-googleapis",
+ "google-cloud-pubsub",
+ "lapin",
+ "redis",
+ "redis_cluster_async",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "google-cloud-auth"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54bbf625af612872d711647cedbc2e64c40b52f4cc8abc9013f6b23bc63a7d6a"
+dependencies = [
+ "async-trait",
+ "base64 0.21.1",
+ "google-cloud-metadata",
+ "google-cloud-token",
+ "home",
+ "jsonwebtoken",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "time 0.3.21",
+ "tokio",
+ "tracing",
+ "urlencoding",
+]
+
+[[package]]
+name = "google-cloud-default"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9337fa3a20c33cdd8edcbba5471e865da406206f5f67ba47ac89590030b1ba9"
+dependencies = [
+ "async-trait",
+ "google-cloud-auth",
+ "google-cloud-gax",
+ "google-cloud-pubsub",
+]
+
+[[package]]
+name = "google-cloud-gax"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c15ce5fa8244676a83e84422c980e39963a8620d010949f0a8f2ce53f53a32ff"
+dependencies = [
+ "google-cloud-token",
+ "http",
+ "thiserror",
+ "tokio",
+ "tokio-retry",
+ "tonic",
+ "tower",
+ "tracing",
+]
+
+[[package]]
+name = "google-cloud-googleapis"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "629f516672e1d057d76070f8ae59469a9a88ed5bfbe7076883da216f2d14a491"
+dependencies = [
+ "prost",
+ "prost-types",
+ "tonic",
+]
+
+[[package]]
+name = "google-cloud-metadata"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96e4ad0802d3f416f62e7ce01ac1460898ee0efc98f8b45cd4aab7611607012f"
+dependencies = [
+ "reqwest",
+ "thiserror",
+ "tokio",
+]
+
+[[package]]
+name = "google-cloud-pubsub"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37e003dba63baafcfdf003c9813a6b66077c69a41dcfaee2058ca0d0d3011e68"
+dependencies = [
+ "async-channel",
+ "async-stream",
+ "google-cloud-gax",
+ "google-cloud-googleapis",
+ "google-cloud-token",
+ "prost-types",
+ "thiserror",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "google-cloud-token"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fcd62eb34e3de2f085bcc33a09c3e17c4f65650f36d53eb328b00d63bcb536a"
+dependencies = [
+ "async-trait",
+]
+
+[[package]]
+name = "h2"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http",
+ "indexmap",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tracing",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "hermit-abi"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest",
+]
+
+[[package]]
+name = "hmac-sha256"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc736091aacb31ddaa4cd5f6988b3c21e99913ac846b41f32538c5fae5d71bfe"
+
+[[package]]
+name = "home"
+version = "0.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
+dependencies = [
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "http"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
+dependencies = [
+ "bytes",
+ "http",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "http-range-header"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
+
+[[package]]
+name = "http-types"
+version = "2.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9b187a72d63adbfba487f48095306ac823049cb504ee195541e91c7775f5ad"
+dependencies = [
+ "anyhow",
+ "async-channel",
+ "base64 0.13.1",
+ "futures-lite",
+ "http",
+ "infer",
+ "pin-project-lite",
+ "rand 0.7.3",
+ "serde",
+ "serde_json",
+ "serde_qs",
+ "serde_urlencoded",
+ "url",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
+
+[[package]]
+name = "hyper"
+version = "0.14.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-rustls"
+version = "0.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c"
+dependencies = [
+ "http",
+ "hyper",
+ "log",
+ "rustls 0.20.8",
+ "rustls-native-certs",
+ "tokio",
+ "tokio-rustls",
+]
+
+[[package]]
+name = "hyper-timeout"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+dependencies = [
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tokio-io-timeout",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.56"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "idna"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "if_chain"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
+name = "infer"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac"
+
+[[package]]
+name = "inout"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+dependencies = [
+ "block-padding",
+ "generic-array",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f"
+dependencies = [
+ "hermit-abi 0.3.1",
+ "io-lifetimes",
+ "rustix",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
+
+[[package]]
+name = "js-sys"
+version = "0.3.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "jsonwebtoken"
+version = "8.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378"
+dependencies = [
+ "base64 0.21.1",
+ "pem",
+ "ring",
+ "serde",
+ "serde_json",
+ "simple_asn1",
+]
+
+[[package]]
+name = "lapin"
+version = "2.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acc13beaa09eed710f406201f46b961345b4d061dd90ec3d3ccc70721e70342a"
+dependencies = [
+ "amq-protocol",
+ "async-global-executor-trait",
+ "async-reactor-trait",
+ "async-trait",
+ "executor-trait",
+ "flume",
+ "futures-core",
+ "futures-io",
+ "parking_lot 0.12.1",
+ "pinky-swear",
+ "reactor-trait",
+ "serde",
+ "tracing",
+ "waker-fn",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.144"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+
+[[package]]
+name = "lock_api"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
+dependencies = [
+ "autocfg",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "matchit"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "mime_guess"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef"
+dependencies = [
+ "mime",
+ "unicase",
+]
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "multimap"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+dependencies = [
+ "overload",
+ "winapi",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
+dependencies = [
+ "hermit-abi 0.2.6",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
+
+[[package]]
+name = "openssl"
+version = "0.10.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01b8574602df80f7b85fdfc5392fa884a4e3b3f4f35402c070ab34c3d3f78d56"
+dependencies = [
+ "bitflags",
+ "cfg-if",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.87"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e17f59264b2809d77ae94f0e1ebabc434773f370d6ca667bd223ea10e06cc7e"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "opentelemetry"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69d6c3d7288a106c0a363e4b0e8d308058d56902adefb16f4936f417ffef086e"
+dependencies = [
+ "opentelemetry_api",
+ "opentelemetry_sdk",
+]
+
+[[package]]
+name = "opentelemetry-http"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1edc79add46364183ece1a4542592ca593e6421c60807232f5b8f7a31703825d"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "http",
+ "opentelemetry_api",
+ "reqwest",
+]
+
+[[package]]
+name = "opentelemetry-otlp"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1c928609d087790fc936a1067bdc310ae702bdf3b090c3f281b713622c8bbde"
+dependencies = [
+ "async-trait",
+ "futures",
+ "futures-util",
+ "http",
+ "opentelemetry",
+ "opentelemetry-http",
+ "opentelemetry-proto",
+ "prost",
+ "reqwest",
+ "thiserror",
+ "tokio",
+ "tonic",
+]
+
+[[package]]
+name = "opentelemetry-proto"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61a2f56df5574508dd86aaca016c917489e589ece4141df1b5e349af8d66c28"
+dependencies = [
+ "futures",
+ "futures-util",
+ "opentelemetry",
+ "prost",
+ "tonic",
+ "tonic-build",
+]
+
+[[package]]
+name = "opentelemetry_api"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c24f96e21e7acc813c7a8394ee94978929db2bcc46cf6b5014fc612bf7760c22"
+dependencies = [
+ "fnv",
+ "futures-channel",
+ "futures-util",
+ "indexmap",
+ "js-sys",
+ "once_cell",
+ "pin-project-lite",
+ "thiserror",
+]
+
+[[package]]
+name = "opentelemetry_sdk"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ca41c4933371b61c2a2f214bf16931499af4ec90543604ec828f7a625c09113"
+dependencies = [
+ "async-trait",
+ "crossbeam-channel",
+ "dashmap",
+ "fnv",
+ "futures-channel",
+ "futures-executor",
+ "futures-util",
+ "once_cell",
+ "opentelemetry_api",
+ "percent-encoding",
+ "rand 0.8.5",
+ "thiserror",
+ "tokio",
+ "tokio-stream",
+]
+
+[[package]]
+name = "outref"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a"
+
+[[package]]
+name = "overload"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+[[package]]
+name = "p12"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224"
+dependencies = [
+ "cbc",
+ "cipher",
+ "des",
+ "getrandom 0.2.9",
+ "hmac",
+ "lazy_static",
+ "rc2",
+ "sha1 0.10.5",
+ "yasna",
+]
+
+[[package]]
+name = "parking"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api",
+ "parking_lot_core 0.8.6",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+dependencies = [
+ "lock_api",
+ "parking_lot_core 0.9.7",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if",
+ "instant",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall 0.2.16",
+ "smallvec",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "pem"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8"
+dependencies = [
+ "base64 0.13.1",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+
+[[package]]
+name = "petgraph"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4"
+dependencies = [
+ "fixedbitset",
+ "indexmap",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c95a7476719eab1e366eaf73d0260af3021184f18177925b07f54b30089ceead"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39407670928234ebc5e6e580247dd567ad73a3578460c5990f9503df207e8f07"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "pinky-swear"
+version = "6.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d894b67aa7a4bf295db5e85349078c604edaa6fa5c8721e8eca3c7729a27f2ac"
+dependencies = [
+ "doc-comment",
+ "flume",
+ "parking_lot 0.12.1",
+ "tracing",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
+
+[[package]]
+name = "polling"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
+dependencies = [
+ "autocfg",
+ "bitflags",
+ "cfg-if",
+ "concurrent-queue",
+ "libc",
+ "log",
+ "pin-project-lite",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
+
+[[package]]
+name = "prettyplease"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86"
+dependencies = [
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.58"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "prost"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-build"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270"
+dependencies = [
+ "bytes",
+ "heck",
+ "itertools",
+ "lazy_static",
+ "log",
+ "multimap",
+ "petgraph",
+ "prettyplease",
+ "prost",
+ "prost-types",
+ "regex",
+ "syn 1.0.109",
+ "tempfile",
+ "which",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4"
+dependencies = [
+ "anyhow",
+ "itertools",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13"
+dependencies = [
+ "prost",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.9",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rc2"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "reactor-trait"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "438a4293e4d097556730f4711998189416232f009c137389e0f961d2bc0ddc58"
+dependencies = [
+ "async-trait",
+ "futures-core",
+ "futures-io",
+]
+
+[[package]]
+name = "redis"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "152f3863635cbb76b73bc247845781098302c6c9ad2060e1a9a7de56840346b6"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "combine",
+ "futures-util",
+ "itoa",
+ "native-tls",
+ "percent-encoding",
+ "pin-project-lite",
+ "ryu",
+ "sha1 0.6.1",
+ "tokio",
+ "tokio-native-tls",
+ "tokio-util",
+ "url",
+]
+
+[[package]]
+name = "redis_cluster_async"
+version = "0.7.1-alpha.0"
+source = "git+https://github.com/redis-rs/redis-cluster-async.git?rev=e6fe168#e6fe168276faf0049061eb98ba1aa3ad68f7fd04"
+dependencies = [
+ "crc16",
+ "futures",
+ "log",
+ "pin-project-lite",
+ "rand 0.8.5",
+ "redis",
+ "tokio",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1a59b5d8e97dee33696bf13c5ba8ab85341c002922fba050069326b9c498974"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax 0.7.2",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78"
+
+[[package]]
+name = "reqwest"
+version = "0.11.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55"
+dependencies = [
+ "base64 0.21.1",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "mime_guess",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+ "tokio-native-tls",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "retain_mut"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0"
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin 0.5.2",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver 0.9.0",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver 1.0.17",
+]
+
+[[package]]
+name = "rustix"
+version = "0.37.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d"
+dependencies = [
+ "bitflags",
+ "errno",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustls"
+version = "0.20.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f"
+dependencies = [
+ "log",
+ "ring",
+ "sct",
+ "webpki",
+]
+
+[[package]]
+name = "rustls"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c911ba11bc8433e811ce56fde130ccf32f5127cab0e0194e9c68c5a5b671791e"
+dependencies = [
+ "log",
+ "ring",
+ "rustls-webpki",
+ "sct",
+]
+
+[[package]]
+name = "rustls-connector"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67c8d6cf0e464eff7cee6ba0419f56a65d29999fc164dd719c8633fbb401365f"
+dependencies = [
+ "log",
+ "rustls 0.21.1",
+ "rustls-native-certs",
+ "rustls-webpki",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile",
+ "schannel",
+ "security-framework",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b"
+dependencies = [
+ "base64 0.21.1",
+]
+
+[[package]]
+name = "rustls-webpki"
+version = "0.100.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6207cd5ed3d8dca7816f8f3725513a34609c0c765bf652b8c3cb4cfd87db46b"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
+
+[[package]]
+name = "ryu"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041"
+
+[[package]]
+name = "schannel"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3"
+dependencies = [
+ "windows-sys 0.42.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "sct"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fc758eb7bffce5b308734e9b0c1468893cae9ff70ebf13e7090be8dcbcc83a8"
+dependencies = [
+ "bitflags",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f51d0c0d83bec45f16480d0ce0058397a69e48fcdc52d1dc8855fb68acbd31a7"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed"
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.163"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.96"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1"
+dependencies = [
+ "indexmap",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_path_to_error"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_qs"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6"
+dependencies = [
+ "percent-encoding",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_v8"
+version = "0.53.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b0c0792ac64702a8aba4f6520b190ea5651db42266136636ad2a6d04811686f"
+dependencies = [
+ "bytes",
+ "derive_more",
+ "serde",
+ "smallvec",
+ "v8",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.9.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9d684e3ec7de3bf5466b32bd75303ac16f0736426e5a4e0d6e489559ce1249c"
+dependencies = [
+ "indexmap",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
+[[package]]
+name = "sha1"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770"
+dependencies = [
+ "sha1_smol",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sha1_smol"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+
+[[package]]
+name = "sha2"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simple_asn1"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085"
+dependencies = [
+ "num-bigint",
+ "num-traits",
+ "thiserror",
+ "time 0.3.21",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "smallvec"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
+
+[[package]]
+name = "socket2"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "sourcemap"
+version = "6.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e031f2463ecbdd5f34c950f89f5c1e1032f22c0f8e3dc4bdb2e8b6658cf61eb"
+dependencies = [
+ "base64 0.11.0",
+ "if_chain",
+ "lazy_static",
+ "regex",
+ "rustc_version 0.2.3",
+ "serde",
+ "serde_json",
+ "url",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "subtle"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
+
+[[package]]
+name = "svix"
+version = "0.85.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c45973542067ffeb8fa7d89b24ee920a9e36ad96ef2873a7e60fe4b09cec4f8"
+dependencies = [
+ "base64 0.13.1",
+ "hmac-sha256",
+ "http",
+ "reqwest",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "thiserror",
+ "time 0.3.21",
+ "url",
+]
+
+[[package]]
+name = "svix-bridge"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "axum",
+ "chrono",
+ "clap",
+ "deno_core",
+ "enum_dispatch",
+ "http",
+ "hyper",
+ "lazy_static",
+ "opentelemetry",
+ "opentelemetry-http",
+ "opentelemetry-otlp",
+ "serde",
+ "serde_json",
+ "serde_yaml",
+ "svix-bridge-plugin-queue",
+ "svix-bridge-types",
+ "svix-ksuid",
+ "threadpool",
+ "tokio",
+ "tower",
+ "tower-http",
+ "tracing",
+ "tracing-opentelemetry",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "svix-bridge-plugin-queue"
+version = "0.1.0"
+dependencies = [
+ "aws-config",
+ "aws-sdk-sqs",
+ "fastrand",
+ "futures-lite",
+ "generic_queue",
+ "google-cloud-auth",
+ "google-cloud-default",
+ "google-cloud-gax",
+ "google-cloud-googleapis",
+ "google-cloud-pubsub",
+ "lapin",
+ "redis",
+ "serde",
+ "serde_json",
+ "svix-bridge-types",
+ "tokio",
+ "tokio-executor-trait",
+ "tokio-reactor-trait",
+ "tracing",
+ "tracing-subscriber",
+ "wiremock",
+]
+
+[[package]]
+name = "svix-bridge-types"
+version = "0.1.0"
+dependencies = [
+ "async-trait",
+ "serde",
+ "serde_json",
+ "svix",
+ "tokio",
+]
+
+[[package]]
+name = "svix-ksuid"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75d773122e48817eb6eb74605cf799574a855bf4c7eb0c1bb06c005067123b13"
+dependencies = [
+ "base-encode",
+ "byteorder",
+ "getrandom 0.2.9",
+ "time 0.3.21",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
+name = "tcp-stream"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1322b18a9e329ba45e4430b19543045b85cd1dcb2892e77d27ab471ba2039bd1"
+dependencies = [
+ "cfg-if",
+ "p12",
+ "rustls-connector",
+ "rustls-pemfile",
+]
+
+[[package]]
+name = "tempfile"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
+dependencies = [
+ "cfg-if",
+ "fastrand",
+ "redox_syscall 0.3.5",
+ "rustix",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+]
+
+[[package]]
+name = "threadpool"
+version = "1.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa"
+dependencies = [
+ "num_cpus",
+]
+
+[[package]]
+name = "time"
+version = "0.1.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.3.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc"
+dependencies = [
+ "itoa",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb"
+
+[[package]]
+name = "time-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b"
+dependencies = [
+ "time-core",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
+
+[[package]]
+name = "tokio"
+version = "1.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105"
+dependencies = [
+ "autocfg",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "parking_lot 0.12.1",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-executor-trait"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "802ccf58e108fe16561f35348fabe15ff38218968f033d587e399a84937533cc"
+dependencies = [
+ "async-trait",
+ "executor-trait",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-io-timeout"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+dependencies = [
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-reactor-trait"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9481a72f36bd9cbb8d6dd349227c4783e234e4332cfe806225bc929c4b92486"
+dependencies = [
+ "async-trait",
+ "futures-core",
+ "futures-io",
+ "reactor-trait",
+ "tokio",
+ "tokio-stream",
+]
+
+[[package]]
+name = "tokio-retry"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f"
+dependencies = [
+ "pin-project",
+ "rand 0.8.5",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-rustls"
+version = "0.23.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59"
+dependencies = [
+ "rustls 0.20.8",
+ "tokio",
+ "webpki",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f"
+
+[[package]]
+name = "toml_edit"
+version = "0.19.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739"
+dependencies = [
+ "indexmap",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tonic"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "axum",
+ "base64 0.13.1",
+ "bytes",
+ "flate2",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http",
+ "http-body",
+ "hyper",
+ "hyper-timeout",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "prost-derive",
+ "rustls-pemfile",
+ "tokio",
+ "tokio-rustls",
+ "tokio-stream",
+ "tokio-util",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+ "tracing-futures",
+ "webpki-roots",
+]
+
+[[package]]
+name = "tonic-build"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4"
+dependencies = [
+ "prettyplease",
+ "proc-macro2",
+ "prost-build",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "indexmap",
+ "pin-project",
+ "pin-project-lite",
+ "rand 0.8.5",
+ "slab",
+ "tokio",
+ "tokio-util",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"
+dependencies = [
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tracing"
+version = "0.1.37"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
+dependencies = [
+ "cfg-if",
+ "log",
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
+dependencies = [
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
+dependencies = [
+ "lazy_static",
+ "log",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-opentelemetry"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21ebb87a95ea13271332df069020513ab70bdb5637ca42d6e492dc3bbbad48de"
+dependencies = [
+ "once_cell",
+ "opentelemetry",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-serde"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1"
+dependencies = [
+ "serde",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+ "tracing-serde",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
+
+[[package]]
+name = "typenum"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
+
+[[package]]
+name = "unicase"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1865806a559042e51ab5414598446a5871b561d21b6764f2eabb0dd481d880a6"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "urlencoding"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "v8"
+version = "0.44.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3f92c29dd66c7342443280695afc5bb79d773c3aa3eb02978cf24f058ae2b3d"
+dependencies = [
+ "bitflags",
+ "fslock",
+ "lazy_static",
+ "libc",
+ "which",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "vsimd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
+[[package]]
+name = "want"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0"
+dependencies = [
+ "log",
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73"
+dependencies = [
+ "cfg-if",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb"
+dependencies = [
+ "bumpalo",
+ "log",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2d1985d03709c53167ce907ff394f5316aa22cb4e12761295c5dc57dacb6297e"
+dependencies = [
+ "cfg-if",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.16",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.86"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93"
+
+[[package]]
+name = "web-sys"
+version = "0.3.63"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "webpki"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd"
+dependencies = [
+ "ring",
+ "untrusted",
+]
+
+[[package]]
+name = "webpki-roots"
+version = "0.22.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87"
+dependencies = [
+ "webpki",
+]
+
+[[package]]
+name = "which"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "windows"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
+dependencies = [
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
+
+[[package]]
+name = "winnow"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "wiremock"
+version = "0.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd7b0b5b253ebc0240d6aac6dd671c495c467420577bf634d3064ae7e6fa2b4c"
+dependencies = [
+ "assert-json-diff",
+ "async-trait",
+ "base64 0.21.1",
+ "deadpool",
+ "futures",
+ "futures-timer",
+ "http-types",
+ "hyper",
+ "log",
+ "once_cell",
+ "regex",
+ "serde",
+ "serde_json",
+ "tokio",
+]
+
+[[package]]
+name = "xmlparser"
+version = "0.13.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d25c75bf9ea12c4040a97f829154768bbbce366287e2dc044af160cd79a13fd"
+
+[[package]]
+name = "yasna"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"
+
+[[package]]
+name = "zeroize"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9"
diff --git a/bridge/Cargo.toml b/bridge/Cargo.toml
new file mode 100644
index 000000000..801e5c759
--- /dev/null
+++ b/bridge/Cargo.toml
@@ -0,0 +1,13 @@
+[workspace]
+# Earlier versions of deno fail to compile in a workspace because of wgpu-hal
+# The "fix" is to enable resolver 2 at the workspace. Crates with edition 2021
+# use this by default, but workspaces are set independently for some reason.
+# <https://stackoverflow.com/questions/73967574/dependency-fails-to-compile-in-workspace-but-not-in-package>
+resolver = "2"
+
+members = [
+    "generic-queue",
+    "svix-bridge-types",
+    "svix-bridge",
+    "svix-bridge-plugin-queue",
+]
diff --git a/bridge/Dockerfile b/bridge/Dockerfile
new file mode 100644
index 000000000..fa557860a
--- /dev/null
+++ b/bridge/Dockerfile
@@ -0,0 +1,73 @@
+# Base build
+FROM rust:1.69-slim-bullseye AS build
+
+RUN apt-get update && apt-get install -y \
+    build-essential=12.* \
+    checkinstall=1.* \
+    curl=7.* \
+    libssl-dev=* \
+    pkg-config=0.29.* \
+    protobuf-compiler=* \
+    zlib1g-dev=1:* \
+    --no-install-recommends
+
+RUN set -ex ; \
+        mkdir -p /app ;\
+        useradd appuser ;\
+        chown -R appuser: /app ;\
+        mkdir -p /home/appuser ;\
+        chown -R appuser: /home/appuser
+
+WORKDIR /app
+
+# Hack to enable docker caching
+COPY Cargo.toml .
+COPY Cargo.lock .
+COPY generic-queue/Cargo.toml generic-queue/
+COPY svix-bridge-types/Cargo.toml svix-bridge-types/
+COPY svix-bridge-plugin-queue/Cargo.toml svix-bridge-plugin-queue/
+COPY svix-bridge/Cargo.toml svix-bridge/
+RUN set -ex ;\
+        mkdir generic-queue/src ;\
+        mkdir svix-bridge-plugin-queue/src ;\
+        mkdir svix-bridge-types/src ;\
+        mkdir svix-bridge/src ;\
+        echo '' > generic-queue/src/lib.rs ;\
+        echo '' > svix-bridge-plugin-queue/src/lib.rs ;\
+        echo '' > svix-bridge-types/src/lib.rs ;\
+        echo 'fn main() { println!("Dummy!"); }' > svix-bridge/src/main.rs ;\
+        cargo build --release ;\
+        rm -rf \
+          generic-queue/src \
+          svix-bridge-plugin-queue/src \
+          svix-bridge-types/src \
+          svix-bridge/src
+
+COPY . .
+# touching the lib.rs/main.rs ensures cargo rebuilds them instead of considering them already built.
+RUN touch */src/lib.rs && touch */src/main.rs
+RUN cargo build --release --frozen
+
+# Production
+FROM debian:11.2-slim AS prod
+
+RUN set -ex ; \
+        mkdir -p /app ;\
+        useradd appuser ;\
+        chown -R appuser: /app ;\
+        mkdir -p /home/appuser ;\
+        chown -R appuser: /home/appuser
+
+RUN apt-get update ;\
+    apt-get install --no-install-recommends -y ca-certificates=20210119; \
+    update-ca-certificates; \
+    rm -rf /var/lib/apt/lists/*
+
+USER appuser
+
+COPY --from=build /app/target/release/svix-bridge /usr/local/bin/svix-bridge
+EXPOSE 5000
+
+# Will fail if there's no `svix-bridge.yaml` in the CWD or `SVIX_BRIDGE_CFG` is not set to a valid
+# path to a config.
+CMD ["svix-bridge"]
diff --git a/bridge/LICENSE b/bridge/LICENSE
new file mode 100644
index 000000000..954e47172
--- /dev/null
+++ b/bridge/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2021-2023 Svix Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bridge/README.md b/bridge/README.md
new file mode 100644
index 000000000..836d97ee8
--- /dev/null
+++ b/bridge/README.md
@@ -0,0 +1,120 @@
+<h1 align="center">
+  <a href="https://www.svix.com">
+    <img width="120" src="https://avatars.githubusercontent.com/u/80175132?s=200&v=4" />
+    <p align="center">Svix - Webhooks as a service</p>
+  </a>
+</h1>
+
+![GitHub tag](https://img.shields.io/github/tag/svix/svix-webhooks.svg)
+[![Build Status](https://github.com/svix/svix-webhooks/workflows/Bridge%20CI/badge.svg)](https://github.com/svix/svix-webhooks/actions)
+[![Bridge Security](https://github.com/svix/svix-webhooks/actions/workflows/bridge-security.yml/badge.svg)](https://github.com/svix/svix-webhooks/actions/workflows/bridge-security.yml)
+[![License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE)
+[![Join our slack](https://img.shields.io/badge/Slack-join%20the%20community-blue?logo=slack&style=social)](https://www.svix.com/slack/)
+
+# Svix Bridge (beta)
+
+Bridge is an agent to help integrate webhooks into your existing messaging infrastructure.
+
+Bridge is organized in terms of **senders** and **receivers**.
+
+**Senders** are useful when you have a data source (an "input") such as a
+message queue and want to generate Svix webhooks from those messages.
+
+**Receivers** act as HTTP endpoints which wait for Svix webhooks to arrive, then
+publish the payload on to a specified "output."
+
+**Receivers** also (optionally) perform validation of the webhooks using Svix's signature verification.
+
+Both **senders** and **receivers** are defined in terms of their input, and optional JavaScript transformation, and their output.
+
+Currently the supported Sender inputs and Receiver outputs are the following
+messaging systems:
+
+- GCP Pub/Sub
+- RabbitMQ
+- Redis
+- SQS
+
+> Important to note that queues, exchanges, topics, etc should be created and configured independently,
+> prior to using launching Bridge. Bridge will not automatically attempt to create these resources, it will only try
+> (and fail) to read from or publish to the stream/queue in this case.
+
+
+## Installation
+
+Docker images are available on [docker hub](https://registry.hub.docker.com/r/svix/svix-bridge)
+
+```
+$ docker pull svix/svix-bridge
+```
+
+If you don't want to use docker, see [Building from Source](../README.md#building-from-source).
+
+
+
+# Usage and Configuration
+
+```
+$ svix-bridge -c path/to/svix-bridge.yaml
+```
+
+The CLI itself exposes only a single flag (`-c`, `--cfg`) used to set the path for the config file.
+The location of the config file can also be set with the `SVIX_BRIDGE_CFG` env var.
+The config file itself does the heavy lifting.
+
+When unset, the current working directory is checked for a file named `svix-bridge.yaml`.
+
+Each sender and receiver can optionally specify a `transformation`.
+Transformations should define a function called `handler` that accepts an object and returns an object.
+
+Senders should produce JSON following an expected shape:
+```
+{
+    // This indicates which Svix application to send the message to
+    "app_id": "app_XYZ",
+    
+    // The `message` field has the same requirements as the standard `MessageIn`
+    // used for Create Message API requests
+    "message": {
+        "eventType": "my.event",
+        "payload": {"abc": 123}
+    }
+}
+```
+
+> The comments in the above JSON are for illustrative purposes only ;)
+> That's not valid JSON! Sorry!
+
+For detail on the `message` field, see: <https://api.svix.com/docs#tag/Message/operation/v1.message.create>
+
+See the example configs for how to configure each input and output in more detail:
+- [senders](./svix-bridge.example.senders.yaml)
+- [receivers](./svix-bridge.example.receivers.yaml)
+
+# Building from source
+
+You would need a working Rust compiler in order to build Svix Bridge.
+The easiest way is to use [rustup](https://rustup.rs/).
+
+```
+# Clone the repository
+git clone https://github.com/svix/svix-webhooks
+# Change to the source directory
+cd svix-webhooks/bridge/
+# Build
+cargo install --path svix-bridge
+```
+
+Some system dependencies are required for Bridge to build successfully.
+Consult the [Dockerfile](./Dockerfile) for a good reference of what's required at build time.
+
+# Building with Docker
+
+```
+# Clone the repository
+git clone https://github.com/svix/svix-webhooks
+# Change to the source directory
+cd svix-webhooks/bridge/
+# Build
+docker build --tag svix-bridge:local .
+```
diff --git a/bridge/generic-queue/Cargo.toml b/bridge/generic-queue/Cargo.toml
new file mode 100644
index 000000000..ebb51b838
--- /dev/null
+++ b/bridge/generic-queue/Cargo.toml
@@ -0,0 +1,38 @@
+[package]
+name = "generic_queue"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+async-trait = "0.1"
+aws-config = { version = "0.55", optional = true }
+aws-sdk-sqs = { version = "0.25", optional = true }
+bb8 = { version = "0.7.1", optional = true }
+bb8-redis = { version = "0.10.1", optional = true }
+futures = { version = "0.3", default-features = false, features = ["async-await", "std"] }
+lapin = { version = "2", optional = true }
+redis = { version = "0.21.5", features = ["tokio-comp", "tokio-native-tls-comp", "streams"], optional = true }
+redis_cluster_async = { git = "https://github.com/redis-rs/redis-cluster-async.git", rev = "e6fe168", optional = true }
+google-cloud-pubsub = { version="0.14.1", optional = true }
+google-cloud-googleapis = { version = "0.8.0", optional = true }
+google-cloud-gax = { version = "0.14.1", optional = true }
+google-cloud-default = { version = "0.2.0", features = ["pubsub"], optional = true }
+google-cloud-auth = { version = "0.9.2", optional = true }
+serde = { version = "1", features = ["derive", "rc"] }
+serde_json = "1"
+thiserror = "1"
+tokio = { version = "1", features = ["full"] }
+tokio-util = { version = "0.7", optional = true }
+futures-util = { version = "0.3.28", optional = true }
+tracing = "0.1"
+
+[features]
+default = ["gcp_pubsub", "memory_queue", "rabbitmq", "redis", "redis_cluster", "sqs"]
+gcp_pubsub = ["dep:google-cloud-pubsub", "dep:google-cloud-googleapis", "dep:google-cloud-gax", "dep:tokio-util", "dep:futures-util", "dep:google-cloud-default", "dep:google-cloud-auth"]
+memory_queue = []
+rabbitmq = ["dep:lapin"]
+redis = ["dep:bb8", "dep:bb8-redis", "dep:redis"]
+redis_cluster = ["redis", "dep:redis_cluster_async"]
+sqs = ["dep:aws-config", "dep:aws-sdk-sqs"]
diff --git a/bridge/generic-queue/LICENSE b/bridge/generic-queue/LICENSE
new file mode 100644
index 000000000..954e47172
--- /dev/null
+++ b/bridge/generic-queue/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2021-2023 Svix Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bridge/generic-queue/src/gcp_pubsub.rs b/bridge/generic-queue/src/gcp_pubsub.rs
new file mode 100644
index 000000000..cb1ea30a0
--- /dev/null
+++ b/bridge/generic-queue/src/gcp_pubsub.rs
@@ -0,0 +1,308 @@
+//! Support for Google Cloud Pub/Sub.
+//!
+//! In this system subscriptions are like queue bindings to topics.
+//! Consumers need a subscription id to start receiving messages.
+//! We don't have any public API for managing/creating/deleting subscriptions in this module, so
+//! this is left to the user to do via whatever method they like.
+//!
+//! - <https://cloud.google.com/pubsub/docs/create-topic>
+//! - <https://cloud.google.com/pubsub/docs/create-subscription#pubsub_create_push_subscription-gcloud>
+//! - <https://cloud.google.com/pubsub/docs/publisher> (how to publish messages ad hoc, helpful for debugging)
+//!
+//! Don't have a better place to mention this just yet.
+//! When testing against the gcloud emulator, you need to set `PUBSUB_EMULATOR_HOST` to the bind
+//! address, and `PUBSUB_PROJECT_ID` (matching however the emulator was configured).
+//! This should bypass the need for credentials and so on.
+//! ```sh
+//! export PUBSUB_EMULATOR_HOST=localhost:8085
+//! export PUBSUB_PROJECT_ID=local-project
+//! ```
+//! > N.b. the rust client hardcodes the project id to `local-project` when it sees the
+//! > `PUBSUB_EMULATOR_HOST` env var in use, so if you see errors about resources not found etc, it
+//! > might be because of a project mismatch.
+//!
+//! To use the `gcloud` CLI with the emulator (useful for creating topics/subscriptions), you have
+//! to configure an override for the pubsub API:
+//!
+//! ```sh
+//! gcloud config set api_endpoint_overrides/pubsub "http://${PUBSUB_EMULATOR_HOST}/"
+//! ```
+//! Note that you'll also have to manually set it back to the default as needed:
+//! ```sh
+//! gcloud config unset api_endpoint_overrides/pubsub
+//! ```
+//! h/t <https://stackoverflow.com/a/73059126>
+//!
+//! Also note, and this is odd, `gcloud` will prompt you to login even though you're trying to
+//! connect to a local process.
+//! Go ahead and follow the prompts to get your CLI working.
+//!
+//! I guess it still wants to talk to GCP for other interactions other than the pubsub API.
+//!
+//! ## Example `gcloud` usage:
+//! ```sh
+//! gcloud --project=local-project pubsub topics create tester
+//! gcloud --project=local-project pubsub topics create dead-letters
+//! gcloud --project=local-project pubsub subscriptions create local-1 \
+//!   --topic=tester \
+//!   --dead-letter-topic=dead-letters \
+//!   --max-delivery-attempts=5
+//! gcloud --project local-project pubsub topics publish tester --message='{"my message": 1234}'
+//! ```
+//!
+use crate::{Delivery, QueueError, TaskQueueBackend, TaskQueueReceive, TaskQueueSend};
+use async_trait::async_trait;
+use futures_util::StreamExt;
+use google_cloud_auth::credentials::CredentialsFile;
+use google_cloud_default::WithAuthExt;
+use google_cloud_googleapis::pubsub::v1::PubsubMessage;
+use google_cloud_pubsub::client::{Client, ClientConfig};
+use google_cloud_pubsub::subscriber::ReceivedMessage;
+use google_cloud_pubsub::subscription::Subscription;
+use serde::{de::DeserializeOwned, Serialize};
+use std::path::{Path, PathBuf};
+use std::time::Instant;
+use std::{marker::PhantomData, time::Duration};
+
+pub struct GCPPubSubConfig {
+    pub topic: String,
+    pub subscription_id: String,
+    pub credentials_file: Option<PathBuf>,
+}
+
+pub struct GCPPubSubQueueBackend;
+
+/// Make a `ClientConfig` from a `CredentialsFile` on disk.
+async fn configure_client_from_file<P: AsRef<Path>>(
+    cred_file_path: P,
+) -> Result<ClientConfig, QueueError> {
+    let bytes = std::fs::read(cred_file_path).map_err(QueueError::generic)?;
+    let creds: CredentialsFile = serde_json::from_slice(&bytes).map_err(QueueError::generic)?;
+    ClientConfig::default()
+        .with_credentials(creds)
+        .await
+        .map_err(QueueError::generic)
+}
+
+/// Making a `ClientConfig` via env vars is possible in two ways:
+/// - setting `GOOGLE_APPLICATION_CREDENTIALS` to the file path to have it loaded automatically
+/// - setting `GOOGLE_APPLICATION_CREDENTIALS_JSON` to the file contents (avoiding the need for a
+///   file on disk).
+///
+/// Naturally relying on env vars for configuration means it's difficult to have
+async fn configure_client_from_env() -> Result<ClientConfig, QueueError> {
+    ClientConfig::default()
+        .with_auth()
+        .await
+        .map_err(QueueError::generic)
+}
+
+async fn get_client(cfg: &GCPPubSubConfig) -> Result<Client, QueueError> {
+    let config = {
+        if let Some(fp) = &cfg.credentials_file {
+            tracing::trace!("reading gcp creds from file: {}", fp.display());
+            configure_client_from_file(&fp).await?
+        } else {
+            tracing::trace!("reading gcp creds from env");
+            configure_client_from_env().await?
+        }
+    };
+    Client::new(config).await.map_err(QueueError::generic)
+}
+
+async fn get_consumer(
+    client: Client,
+    cfg: &GCPPubSubConfig,
+) -> Result<GCPPubSubQueueConsumer, QueueError> {
+    Ok(GCPPubSubQueueConsumer {
+        client,
+        subscription_id: cfg.subscription_id.clone(),
+    })
+}
+async fn get_producer(
+    client: Client,
+    cfg: &GCPPubSubConfig,
+) -> Result<GCPPubSubQueueProducer, QueueError> {
+    let topic = client.topic(&cfg.topic);
+    // Only warn on startup, if the topic doesn't exist. If it gets created after the fact, we
+    // should be able to still use it when available, otherwise if it's still missing at that time, error.
+    if !topic.exists(None).await.map_err(QueueError::generic)? {
+        tracing::warn!("topic {} does not exist", &cfg.topic);
+    }
+    Ok(GCPPubSubQueueProducer {
+        client,
+        topic: cfg.topic.clone(),
+    })
+}
+
+#[async_trait]
+impl<T: 'static + DeserializeOwned + Send + Serialize + Sync> TaskQueueBackend<T>
+    for GCPPubSubQueueBackend
+{
+    type PairConfig = GCPPubSubConfig;
+    type Delivery = GCPPubSubDelivery<T>;
+    type Producer = GCPPubSubQueueProducer;
+    type Consumer = GCPPubSubQueueConsumer;
+
+    async fn new_pair(
+        cfg: GCPPubSubConfig,
+    ) -> Result<(GCPPubSubQueueProducer, GCPPubSubQueueConsumer), QueueError> {
+        let client = get_client(&cfg).await?;
+        let producer = get_producer(client.clone(), &cfg).await?;
+        let consumer = get_consumer(client, &cfg).await?;
+        Ok((producer, consumer))
+    }
+
+    async fn producing_half(cfg: GCPPubSubConfig) -> Result<GCPPubSubQueueProducer, QueueError> {
+        let client = get_client(&cfg).await?;
+        let producer = get_producer(client, &cfg).await?;
+        Ok(producer)
+    }
+
+    async fn consuming_half(cfg: GCPPubSubConfig) -> Result<GCPPubSubQueueConsumer, QueueError> {
+        let client = get_client(&cfg).await?;
+        let consumer = get_consumer(client, &cfg).await?;
+        Ok(consumer)
+    }
+}
+
+pub struct GCPPubSubDelivery<T: DeserializeOwned> {
+    message: ReceivedMessage,
+    _pd: PhantomData<T>,
+}
+
+impl<T: DeserializeOwned> std::fmt::Debug for GCPPubSubDelivery<T> {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("GCPPubSubDelivery")
+            .field("ack_id", &self.message.ack_id())
+            .field("message_id", &self.message.message.message_id)
+            .finish()
+    }
+}
+
+#[async_trait]
+impl<T: DeserializeOwned + Send + Serialize + Sync> Delivery<T> for GCPPubSubDelivery<T> {
+    fn payload(&self) -> Result<T, QueueError> {
+        serde_json::from_slice(&self.message.message.data).map_err(Into::into)
+    }
+
+    async fn ack(self) -> Result<(), QueueError> {
+        self.message.ack().await.map_err(QueueError::generic)
+    }
+
+    async fn nack(self) -> Result<(), QueueError> {
+        self.message.nack().await.map_err(QueueError::generic)
+    }
+}
+
+pub struct GCPPubSubQueueProducer {
+    client: Client,
+    topic: String,
+}
+
+impl std::fmt::Debug for GCPPubSubQueueProducer {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("GCPPubSubQueueProducer")
+            .field("topic", &self.topic)
+            .finish()
+    }
+}
+
+#[async_trait]
+impl<T: 'static + Serialize + Send + Sync> TaskQueueSend<T> for GCPPubSubQueueProducer {
+    async fn send(&self, payload: T) -> Result<(), QueueError> {
+        let msg = PubsubMessage {
+            data: serde_json::to_string(&payload)?.into(),
+            ..Default::default()
+        };
+
+        // N.b. defer the creation of a publisher/topic until needed. Helps recover when
+        // the topic does not yet exist, but will soon.
+        // Might be more expensive to recreate each time, but overall more reliable.
+        let topic = self.client.topic(&self.topic);
+
+        // Publishing to a non-existent topic will cause the publisher to wait (forever?)
+        // Giving this error will allow dependents like `svix-webhook-bridge-plugin-webhook-receiver` to
+        // respond 500 immediately when this happens, instead of holding the connection open
+        // indefinitely.
+        if !topic.exists(None).await.map_err(QueueError::generic)? {
+            return Err(QueueError::Generic(
+                format!("topic {} does not exist", &topic.id()).into(),
+            ));
+        }
+        // FIXME: may need to expose `PublisherConfig` to caller so they can tweak this
+        let publisher = topic.new_publisher(None);
+        let awaiter = publisher.publish(msg).await;
+        awaiter.get().await.map_err(QueueError::generic)?;
+        Ok(())
+    }
+}
+
+pub struct GCPPubSubQueueConsumer {
+    client: Client,
+    subscription_id: String,
+}
+
+impl GCPPubSubQueueConsumer {
+    async fn subscription(&self) -> Result<Subscription, QueueError> {
+        let subscription = self.client.subscription(&self.subscription_id);
+        if !subscription
+            .exists(None)
+            .await
+            .map_err(QueueError::generic)?
+        {
+            return Err(QueueError::Generic(
+                format!("subscription {} does not exist", &self.subscription_id).into(),
+            ));
+        }
+        Ok(subscription)
+    }
+}
+
+impl std::fmt::Debug for GCPPubSubQueueConsumer {
+    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
+        f.debug_struct("GCPPubSubQueueConsumer")
+            .field("subscription_id", &self.subscription_id)
+            .finish()
+    }
+}
+
+#[async_trait]
+impl<T: 'static + DeserializeOwned + Send + Serialize + Sync>
+    TaskQueueReceive<T, GCPPubSubDelivery<T>> for GCPPubSubQueueConsumer
+{
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<GCPPubSubDelivery<T>>, QueueError> {
+        let start = Instant::now();
+        let subscription = self.subscription().await?;
+        let mut stream = subscription
+            .subscribe(None)
+            .await
+            .map_err(QueueError::generic)?;
+
+        let mut out = Vec::with_capacity(max_batch_size);
+
+        loop {
+            if let Some(message) = stream.next().await {
+                tracing::trace!(
+                    "Got Message: id={}, ack_id={} ",
+                    &message.message.message_id,
+                    &message.ack_id()
+                );
+
+                out.push(GCPPubSubDelivery {
+                    message,
+                    _pd: PhantomData,
+                });
+            }
+
+            if out.len() >= max_batch_size || (!out.is_empty() && start.elapsed() > timeout) {
+                break;
+            }
+        }
+        Ok(out)
+    }
+}
diff --git a/bridge/generic-queue/src/lib.rs b/bridge/generic-queue/src/lib.rs
new file mode 100644
index 000000000..0229b1d10
--- /dev/null
+++ b/bridge/generic-queue/src/lib.rs
@@ -0,0 +1,148 @@
+//! This crate is meant to act as an abstraction layer over many concrete queue implementations such
+//! as to allow supporting multiple backends from your library or application.
+
+use std::time::Duration;
+
+use async_trait::async_trait;
+use thiserror::Error;
+
+#[cfg(feature = "gcp_pubsub")]
+pub mod gcp_pubsub;
+#[cfg(feature = "memory_queue")]
+pub mod memory_queue;
+#[cfg(feature = "rabbitmq")]
+pub mod rabbitmq;
+#[cfg(feature = "redis")]
+pub mod redis;
+#[cfg(feature = "sqs")]
+pub mod sqs;
+
+#[derive(Debug, Error)]
+pub enum QueueError {
+    #[error("no data was returned in the specified timeframe")]
+    NoData,
+    #[error("cannot create this type without matching half")]
+    CannotCreateHalf,
+    #[error("error serializing or deserializing type: {0}")]
+    Serde(#[from] serde_json::Error),
+    #[error("unknown error: {0}")]
+    Generic(Box<dyn std::error::Error + Send + Sync>),
+}
+
+impl QueueError {
+    fn generic<E: 'static + std::error::Error + Send + Sync>(e: E) -> Self {
+        Self::Generic(Box::new(e))
+    }
+}
+
+/// This trait is simply used to define basic types associated with a queue backend, as well as to
+/// allow the simple creation of a [`TaskQueueBackend::new_pair`] from the associated configuration
+/// type.
+///
+/// This trait is generic over the type sent and/or received through the queue, but it tends to be
+/// defined with blanket implementations allowing you to send and receive multiple types through a
+/// single [`Self::Producer`], [`Self::Consumer`] pair. The notable exception to this is the in-
+/// memory queue which is implemented via [`tokio::broadcast`] channels, which accept only items of
+/// the preselected type.
+#[async_trait]
+pub trait TaskQueueBackend<T: Send + Sync> {
+    /// All necessary configuration for creating a sending/receiving pair should be contained in this
+    /// configuration type.
+    type PairConfig;
+
+    /// Because the actual type delivered by a queue tends to include a lot of metadata, and becaue
+    /// connection handles often have to be cloned into a delivery type to allow ACKing and NACKing,
+    /// this associated type defines what is actually output by the [`Self::Consumer`].
+    ///
+    /// This type must implement [`Delivery`] which contains a method for accessing the inner body and
+    /// relevant metadata.
+    type Delivery: Delivery<T> + Send + Sync;
+
+    /// This type is what actually allows sending messages down the queue.
+    ///
+    /// This type must implement [`TaskQueueSend`] which contains a method for dispatching an event
+    /// down the queue -- [`TaskQueueSend::send`].
+    type Producer: TaskQueueSend<T>;
+
+    /// This type is what actually allows receiving messages from the queue.
+    ///
+    /// This type must implement [`TaskQueueReceive`] which contains a method for receiving a batch
+    /// of events with a maximum batch size and timeout -- [`TaskQueueReceive::receive_all`].
+    type Consumer: TaskQueueReceive<T, Self::Delivery>;
+
+    /// Creates a new [`Self::Producer`], [`Self::Consumer`] pair of the types associated with the
+    /// implementor of this trait.
+    ///
+    /// This takes a configuration type as a parameter ([`Self::PairConfig`]) which is unique depending
+    /// on the implementor of this trait.
+    async fn new_pair(
+        cfg: Self::PairConfig,
+    ) -> Result<(Self::Producer, Self::Consumer), QueueError>;
+
+    /// Creates just the [`Self::Producer`] compared to [`Self::new_pair`].
+    async fn producing_half(cfg: Self::PairConfig) -> Result<Self::Producer, QueueError>;
+
+    /// Creates just the [`Self::Consumer`] comapared to [`Self::new_pair`].
+    async fn consuming_half(cfg: Self::PairConfig) -> Result<Self::Consumer, QueueError>;
+}
+
+/// This trait is used to interface with deliveries for a specific queue. Implementors of this trait
+/// will often contain, in addition to the payload and metadata, members necessary for ACKing or
+/// NACKing a delivery.
+///
+/// As ACKing and NACKing is done from the delivery (such as to allow [`Send`]ing deliveries across
+/// threads without also needing a handle to the consumer that produced this delivery), any
+/// implementations of this trait should *avoid* implementing [`Clone`]. This will ensure that a
+/// single delivery is not both ACKed and NACKed.
+#[async_trait]
+pub trait Delivery<T: Send + Sync> {
+    /// Returns a freshly deserialized instance of the contained payload.
+    fn payload(&self) -> Result<T, QueueError>;
+
+    /// ACKs this message, which, depending on what backend you are using, may be a NOOP, or it may
+    /// explicity acknowledge the successful processing the message.
+    ///
+    /// When ACKed, consumers will not see this exact message again.
+    async fn ack(self) -> Result<(), QueueError>;
+    /// NACKs this message, which, depending on what backend you are using, may be a NOOP, it may
+    /// explicitly mark a messaege as not acknowledged, or it may reinsert the message back into the
+    /// end of the queue.
+    ///
+    /// When NACKed, consumers of this queue will process the message again at some point.
+    async fn nack(self) -> Result<(), QueueError>;
+}
+
+/// This trait is implemented for the sending/transmitting/producing side of the queue -- the side
+/// which takes a payload, and sends it such that it is eventually received by a matching impl of
+/// [`TaskQueueReceive`].
+///
+/// It contains one method: [`TaskQueueSend::send`] which does as expected.
+#[async_trait]
+pub trait TaskQueueSend<T>: Send + Sync {
+    /// Sends a payload through the queue associated with this producer.
+    async fn send(&self, payload: T) -> Result<(), QueueError>;
+}
+
+/// This trait is implemented for the receiving/consuming side of the queue -- the side which
+/// receives batches of [`Delivery`] instances.
+///
+/// NOTE that some backends don't support batching by default, in which case they will attempt to
+/// read until the timeout duration is met or the batch is full.
+///
+/// It contains one method [`TaskQueueReceive::receive_all`] which does as expected.
+#[async_trait]
+pub trait TaskQueueReceive<T: Send + Sync, D: Delivery<T>>: Send + Sync {
+    /// Receives a batch of deliveries from the queue.
+    ///
+    /// This function will not return an empty [`Vec`], instead it will await the moment of at least
+    /// one event being received to return.
+    ///
+    /// After the inital event is received (in a queue that does not natively support batching), the
+    /// queue is read from in a loop until either the maximum batch size has been met or the timeout
+    /// duration has been exceeded.
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<D>, QueueError>;
+}
diff --git a/bridge/generic-queue/src/memory_queue.rs b/bridge/generic-queue/src/memory_queue.rs
new file mode 100644
index 000000000..0ff7c81ad
--- /dev/null
+++ b/bridge/generic-queue/src/memory_queue.rs
@@ -0,0 +1,148 @@
+use std::{fmt::Debug, marker::PhantomData, time::Duration};
+
+use async_trait::async_trait;
+use serde::{de::DeserializeOwned, Serialize};
+use tokio::sync::broadcast;
+
+use crate::{Delivery, QueueError, TaskQueueBackend, TaskQueueReceive, TaskQueueSend};
+
+pub struct MemoryQueueBackend<
+    T: 'static + Clone + Debug + DeserializeOwned + Send + Serialize + Sync,
+>(PhantomData<T>);
+
+#[async_trait]
+impl<T: 'static + Clone + Debug + DeserializeOwned + Send + Serialize + Sync> TaskQueueBackend<T>
+    for MemoryQueueBackend<T>
+{
+    type PairConfig = usize;
+
+    type Delivery = MemoryQueueDelivery<T>;
+
+    type Producer = MemoryQueueProducer<T>;
+    type Consumer = MemoryQueueConsumer<T>;
+
+    async fn new_pair(
+        cfg: usize,
+    ) -> Result<(MemoryQueueProducer<T>, MemoryQueueConsumer<T>), QueueError> {
+        let (tx, rx) = broadcast::channel(cfg);
+
+        let producer = MemoryQueueProducer { tx: tx.clone() };
+        let consumer = MemoryQueueConsumer { tx, rx };
+
+        Ok((producer, consumer))
+    }
+
+    async fn producing_half(_cfg: usize) -> Result<MemoryQueueProducer<T>, QueueError> {
+        Err(QueueError::CannotCreateHalf)
+    }
+
+    async fn consuming_half(_cfg: usize) -> Result<MemoryQueueConsumer<T>, QueueError> {
+        Err(QueueError::CannotCreateHalf)
+    }
+}
+
+#[derive(Clone)]
+pub struct MemoryQueueDelivery<T> {
+    payload: T,
+    ack_tx: broadcast::Sender<T>,
+}
+
+#[async_trait]
+impl<T: 'static + Clone + Debug + DeserializeOwned + Send + Serialize + Sync> Delivery<T>
+    for MemoryQueueDelivery<T>
+{
+    fn payload(&self) -> Result<T, QueueError> {
+        Ok(self.payload.clone())
+    }
+
+    async fn ack(self) -> Result<(), QueueError> {
+        Ok(())
+    }
+
+    async fn nack(self) -> Result<(), QueueError> {
+        self.ack_tx
+            .send(self.payload)
+            .map_err(QueueError::generic)?;
+        Ok(())
+    }
+}
+
+#[derive(Clone)]
+pub struct MemoryQueueProducer<T: Send + Serialize + Sync> {
+    tx: broadcast::Sender<T>,
+}
+
+#[async_trait]
+impl<T: 'static + Clone + Debug + Send + Serialize + Sync> TaskQueueSend<T>
+    for MemoryQueueProducer<T>
+{
+    async fn send(&self, payload: T) -> Result<(), QueueError> {
+        self.tx.send(payload).map_err(QueueError::generic)?;
+        Ok(())
+    }
+}
+
+pub struct MemoryQueueConsumer<T: DeserializeOwned + Serialize + Send + Sync> {
+    tx: broadcast::Sender<T>,
+    rx: broadcast::Receiver<T>,
+}
+
+#[async_trait]
+impl<T: 'static + Clone + Debug + DeserializeOwned + Serialize + Send + Sync>
+    TaskQueueReceive<T, MemoryQueueDelivery<T>> for MemoryQueueConsumer<T>
+{
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<MemoryQueueDelivery<T>>, QueueError> {
+        let mut out = Vec::with_capacity(max_batch_size);
+
+        // Await at least one delivery before starting the clock
+        out.push(
+            self.rx
+                .recv()
+                .await
+                .map(|payload| MemoryQueueDelivery {
+                    payload,
+                    ack_tx: self.tx.clone(),
+                })
+                .map_err(QueueError::generic)?,
+        );
+
+        let mut interval = tokio::time::interval(timeout);
+
+        // Skip the first tick which is instantaneous
+        interval.tick().await;
+
+        loop {
+            tokio::select! {
+                _ = interval.tick() => break,
+                msg = self.rx.recv() => {
+                    out.push(
+                        msg.map(|payload| MemoryQueueDelivery {
+                            payload,
+                            ack_tx: self.tx.clone(),
+                        })
+                        .map_err(QueueError::generic)?,
+                    );
+
+                    if out.len() >= max_batch_size {
+                        break;
+                    }
+                }
+            }
+        }
+
+        Ok(out)
+    }
+}
+
+impl<T: DeserializeOwned + Serialize + Send + Sync> Clone for MemoryQueueConsumer<T> {
+    fn clone(&self) -> Self {
+        Self {
+            rx: self.tx.subscribe(),
+            tx: self.tx.clone(),
+        }
+    }
+}
diff --git a/bridge/generic-queue/src/rabbitmq.rs b/bridge/generic-queue/src/rabbitmq.rs
new file mode 100644
index 000000000..698b75c83
--- /dev/null
+++ b/bridge/generic-queue/src/rabbitmq.rs
@@ -0,0 +1,228 @@
+use std::{marker::PhantomData, time::Duration};
+
+use async_trait::async_trait;
+use futures::StreamExt;
+use lapin::{acker::Acker, Channel, Connection, Consumer};
+use serde::{de::DeserializeOwned, Serialize};
+
+use crate::{Delivery, QueueError, TaskQueueBackend, TaskQueueReceive, TaskQueueSend};
+
+pub use lapin::{
+    options::{BasicAckOptions, BasicConsumeOptions, BasicNackOptions, BasicPublishOptions},
+    types::FieldTable,
+    BasicProperties, ConnectionProperties,
+};
+
+pub struct RabbitMqConfig {
+    pub uri: String,
+    pub connection_properties: ConnectionProperties,
+
+    pub publish_exchange: String,
+    pub publish_routing_key: String,
+    pub publish_options: BasicPublishOptions,
+    pub publish_properites: BasicProperties,
+
+    pub consume_queue: String,
+    pub consumer_tag: String,
+    pub consume_options: BasicConsumeOptions,
+    pub consume_arguments: FieldTable,
+
+    pub requeue_on_nack: bool,
+}
+
+pub struct RabbitMqBackend;
+
+#[async_trait]
+impl<T: 'static + DeserializeOwned + Send + Serialize + Sync> TaskQueueBackend<T>
+    for RabbitMqBackend
+{
+    type PairConfig = RabbitMqConfig;
+
+    type Delivery = RabbitMqDelivery<T>;
+
+    type Producer = RabbitMqProducer;
+    type Consumer = RabbitMqConsumer;
+
+    async fn new_pair(
+        cfg: RabbitMqConfig,
+    ) -> Result<(RabbitMqProducer, RabbitMqConsumer), QueueError> {
+        let conn = Connection::connect(&cfg.uri, cfg.connection_properties)
+            .await
+            .map_err(QueueError::generic)?;
+
+        let channel_tx = conn.create_channel().await.map_err(QueueError::generic)?;
+        let channel_rx = conn.create_channel().await.map_err(QueueError::generic)?;
+
+        Ok((
+            RabbitMqProducer {
+                channel: channel_tx,
+                exchange: cfg.publish_exchange,
+                routing_key: cfg.publish_routing_key,
+                options: cfg.publish_options,
+                properties: cfg.publish_properites,
+            },
+            RabbitMqConsumer {
+                consumer: channel_rx
+                    .basic_consume(
+                        &cfg.consume_queue,
+                        &cfg.consumer_tag,
+                        cfg.consume_options,
+                        cfg.consume_arguments,
+                    )
+                    .await
+                    .map_err(QueueError::generic)?,
+                requeue_on_nack: cfg.requeue_on_nack,
+            },
+        ))
+    }
+
+    async fn producing_half(cfg: RabbitMqConfig) -> Result<RabbitMqProducer, QueueError> {
+        let conn = Connection::connect(&cfg.uri, cfg.connection_properties)
+            .await
+            .map_err(QueueError::generic)?;
+
+        let channel_tx = conn.create_channel().await.map_err(QueueError::generic)?;
+
+        Ok(RabbitMqProducer {
+            channel: channel_tx,
+            exchange: cfg.publish_exchange,
+            routing_key: cfg.publish_routing_key,
+            options: cfg.publish_options,
+            properties: cfg.publish_properites,
+        })
+    }
+
+    async fn consuming_half(cfg: RabbitMqConfig) -> Result<RabbitMqConsumer, QueueError> {
+        let conn = Connection::connect(&cfg.uri, cfg.connection_properties)
+            .await
+            .map_err(QueueError::generic)?;
+
+        let channel_rx = conn.create_channel().await.map_err(QueueError::generic)?;
+
+        Ok(RabbitMqConsumer {
+            consumer: channel_rx
+                .basic_consume(
+                    &cfg.consume_queue,
+                    &cfg.consumer_tag,
+                    cfg.consume_options,
+                    cfg.consume_arguments,
+                )
+                .await
+                .map_err(QueueError::generic)?,
+            requeue_on_nack: cfg.requeue_on_nack,
+        })
+    }
+}
+
+pub struct RabbitMqDelivery<T: DeserializeOwned> {
+    requeue_on_nack: bool,
+    acker: Acker,
+    body: Vec<u8>,
+
+    _pd: PhantomData<T>,
+}
+
+#[async_trait]
+impl<T: DeserializeOwned + Send + Serialize + Sync> Delivery<T> for RabbitMqDelivery<T> {
+    fn payload(&self) -> Result<T, QueueError> {
+        serde_json::from_slice(&self.body).map_err(Into::into)
+    }
+
+    async fn ack(self) -> Result<(), QueueError> {
+        self.acker
+            .ack(BasicAckOptions { multiple: false })
+            .await
+            .map_err(QueueError::generic)
+    }
+
+    async fn nack(self) -> Result<(), QueueError> {
+        self.acker
+            .nack(BasicNackOptions {
+                multiple: false,
+                requeue: self.requeue_on_nack,
+            })
+            .await
+            .map_err(QueueError::generic)
+    }
+}
+
+pub struct RabbitMqProducer {
+    channel: Channel,
+    exchange: String,
+    routing_key: String,
+    options: BasicPublishOptions,
+    properties: BasicProperties,
+}
+
+#[async_trait]
+impl<T: 'static + Send + Serialize + Sync> TaskQueueSend<T> for RabbitMqProducer {
+    async fn send(&self, payload: T) -> Result<(), QueueError> {
+        self.channel
+            .basic_publish(
+                &self.exchange,
+                &self.routing_key,
+                self.options,
+                &serde_json::to_vec(&payload)?,
+                self.properties.clone(),
+            )
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok(())
+    }
+}
+
+pub struct RabbitMqConsumer {
+    consumer: Consumer,
+    requeue_on_nack: bool,
+}
+
+#[async_trait]
+impl<T: DeserializeOwned + Send + Serialize + Sync> TaskQueueReceive<T, RabbitMqDelivery<T>>
+    for RabbitMqConsumer
+{
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<RabbitMqDelivery<T>>, QueueError> {
+        let mut stream = self
+            .consumer
+            .clone()
+            .map(|l: Result<lapin::message::Delivery, lapin::Error>| -> Result<RabbitMqDelivery<T>, QueueError> {
+                let l = l.map_err(QueueError::generic)?;
+                Ok(RabbitMqDelivery {
+                    acker: l.acker,
+                    body: l.data,
+                    requeue_on_nack: self.requeue_on_nack,
+                    _pd: PhantomData,
+                })
+            });
+        let mut out = Vec::new();
+
+        if let Some(delivery) = stream.next().await {
+            out.push(delivery?);
+
+            let mut interval = tokio::time::interval(timeout);
+            // Skip the instant first period
+            interval.tick().await;
+
+            loop {
+                tokio::select! {
+                    _ = interval.tick() => break,
+                    delivery = stream.next() => {
+                        if let Some(delivery) = delivery {
+                            out.push(delivery?);
+
+                            if out.len() >= max_batch_size {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        Ok(out)
+    }
+}
diff --git a/bridge/generic-queue/src/redis.rs b/bridge/generic-queue/src/redis.rs
new file mode 100644
index 000000000..2bc1e4ae2
--- /dev/null
+++ b/bridge/generic-queue/src/redis.rs
@@ -0,0 +1,310 @@
+use std::{collections::HashMap, marker::PhantomData, time::Duration};
+
+use async_trait::async_trait;
+use bb8_redis::RedisConnectionManager;
+use redis::streams::{StreamId, StreamKey, StreamReadOptions, StreamReadReply};
+use serde::{
+    de::{DeserializeOwned, Error, Unexpected},
+    Serialize,
+};
+
+use crate::{Delivery, QueueError, TaskQueueBackend, TaskQueueReceive, TaskQueueSend};
+
+pub struct RedisConfig {
+    pub dsn: String,
+    pub max_connections: u16,
+    pub reinsert_on_nack: bool,
+    pub queue_key: String,
+    pub consumer_group: String,
+    pub consumer_name: String,
+}
+
+pub struct RedisQueueBackend<S: RedisStreamSerdeScheme = RedisStreamJsonSerde> {
+    _pd_serde: PhantomData<S>,
+}
+
+#[async_trait]
+impl<
+        S: RedisStreamSerdeScheme,
+        T: 'static + RedisStreamDeserialize<S> + RedisStreamSerialize<S> + Send + Sync,
+    > TaskQueueBackend<T> for RedisQueueBackend<S>
+{
+    type PairConfig = RedisConfig;
+
+    type Delivery = RedisStreamDelivery<T, S>;
+
+    type Producer = RedisStreamProducer<S>;
+    type Consumer = RedisStreamConsumer<S>;
+
+    async fn new_pair(
+        cfg: RedisConfig,
+    ) -> Result<(RedisStreamProducer<S>, RedisStreamConsumer<S>), QueueError> {
+        let redis = RedisConnectionManager::new(cfg.dsn).map_err(QueueError::generic)?;
+        let redis = bb8::Pool::builder()
+            .max_size(cfg.max_connections.into())
+            .build(redis)
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok((
+            RedisStreamProducer {
+                redis: redis.clone(),
+                queue_key: cfg.queue_key.clone(),
+                _pd_serde: PhantomData,
+            },
+            RedisStreamConsumer {
+                redis,
+                queue_key: cfg.queue_key,
+                consumer_group: cfg.consumer_group,
+                consumer_name: cfg.consumer_name,
+                reinsert_on_nack: cfg.reinsert_on_nack,
+                _pd_serde: PhantomData,
+            },
+        ))
+    }
+
+    async fn producing_half(cfg: RedisConfig) -> Result<RedisStreamProducer<S>, QueueError> {
+        let redis = RedisConnectionManager::new(cfg.dsn).map_err(QueueError::generic)?;
+        let redis = bb8::Pool::builder()
+            .max_size(cfg.max_connections.into())
+            .build(redis)
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok(RedisStreamProducer {
+            redis,
+            queue_key: cfg.queue_key,
+            _pd_serde: PhantomData,
+        })
+    }
+
+    async fn consuming_half(cfg: RedisConfig) -> Result<RedisStreamConsumer<S>, QueueError> {
+        let redis = RedisConnectionManager::new(cfg.dsn).map_err(QueueError::generic)?;
+        let redis = bb8::Pool::builder()
+            .max_size(cfg.max_connections.into())
+            .build(redis)
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok(RedisStreamConsumer {
+            redis,
+            queue_key: cfg.queue_key,
+            consumer_group: cfg.consumer_group,
+            consumer_name: cfg.consumer_name,
+            reinsert_on_nack: cfg.reinsert_on_nack,
+            _pd_serde: PhantomData,
+        })
+    }
+}
+
+pub trait RedisStreamSerdeScheme: Send + Sized + Sync {}
+pub trait RedisStreamSerialize<S: RedisStreamSerdeScheme> {
+    fn into_redis_stream_map(self) -> Result<Vec<(String, String)>, QueueError>;
+}
+pub trait RedisStreamDeserialize<S: RedisStreamSerdeScheme>: Sized {
+    fn from_redis_stream_map(map: &HashMap<String, redis::Value>) -> Result<Self, QueueError>;
+}
+
+pub struct RedisStreamJsonSerde;
+impl RedisStreamSerdeScheme for RedisStreamJsonSerde {}
+
+impl<T: Serialize> RedisStreamSerialize<RedisStreamJsonSerde> for T {
+    fn into_redis_stream_map(self) -> Result<Vec<(String, String)>, QueueError> {
+        Ok(vec![("payload".to_owned(), serde_json::to_string(&self)?)])
+    }
+}
+
+impl<T: DeserializeOwned> RedisStreamDeserialize<RedisStreamJsonSerde> for T {
+    fn from_redis_stream_map(map: &HashMap<String, redis::Value>) -> Result<Self, QueueError> {
+        let Some(payload) = map.get("payload") else {
+            return Err(QueueError::Serde(serde_json::Error::missing_field(
+                "payload",
+            )))
+        };
+
+        match payload {
+            redis::Value::Data(bytes) => {
+                let s = std::str::from_utf8(bytes).map_err(|_| {
+                    QueueError::Serde(serde_json::Error::invalid_type(
+                        Unexpected::Other("unknown"),
+                        &"string",
+                    ))
+                })?;
+
+                Ok(serde_json::from_str(s)?)
+            }
+            redis::Value::Nil => Err(QueueError::Serde(serde_json::Error::invalid_type(
+                Unexpected::Other("nil"),
+                &"string",
+            ))),
+            redis::Value::Int(i) => Err(QueueError::Serde(serde_json::Error::invalid_type(
+                Unexpected::Signed(*i),
+                &"string",
+            ))),
+            redis::Value::Bulk(_) => Err(QueueError::Serde(serde_json::Error::invalid_type(
+                Unexpected::Seq,
+                &"string",
+            ))),
+            redis::Value::Status(_) => Err(QueueError::Serde(serde_json::Error::invalid_type(
+                Unexpected::Other("status"),
+                &"string",
+            ))),
+            redis::Value::Okay => Err(QueueError::Serde(serde_json::Error::invalid_type(
+                Unexpected::Other("okay"),
+                &"string",
+            ))),
+        }
+    }
+}
+
+pub struct RedisStreamDelivery<T, U: RedisStreamSerdeScheme> {
+    body: StreamId,
+
+    reinsert_on_nack: bool,
+
+    redis: bb8::Pool<RedisConnectionManager>,
+    queue_key: String,
+    consumer_group: String,
+    entry_id: String,
+
+    _pd_payload: PhantomData<T>,
+    _pd_serde: PhantomData<U>,
+}
+
+#[async_trait]
+impl<
+        S: RedisStreamSerdeScheme,
+        T: RedisStreamDeserialize<S> + RedisStreamSerialize<S> + Send + Sync,
+    > Delivery<T> for RedisStreamDelivery<T, S>
+{
+    fn payload(&self) -> Result<T, QueueError> {
+        T::from_redis_stream_map(&self.body.map).map_err(Into::into)
+    }
+
+    async fn ack(self) -> Result<(), QueueError> {
+        let mut conn = self.redis.get().await.map_err(QueueError::generic)?;
+        redis::Cmd::xack(self.queue_key, self.consumer_group, &[self.entry_id])
+            .query_async(&mut *conn)
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok(())
+    }
+
+    async fn nack(self) -> Result<(), QueueError> {
+        if self.reinsert_on_nack {
+            let mut conn = self.redis.get().await.map_err(QueueError::generic)?;
+
+            // FIXME: Transaction?
+            redis::Cmd::xadd(
+                &self.queue_key,
+                "*",
+                &T::from_redis_stream_map(&self.body.map)?.into_redis_stream_map()?,
+            )
+            .query_async(&mut *conn)
+            .await
+            .map_err(QueueError::generic)?;
+
+            redis::Cmd::xack(self.queue_key, self.consumer_group, &[self.entry_id])
+                .query_async(&mut *conn)
+                .await
+                .map_err(QueueError::generic)?;
+
+            Ok(())
+        } else {
+            Ok(())
+        }
+    }
+}
+
+pub struct RedisStreamProducer<S: RedisStreamSerdeScheme> {
+    redis: bb8::Pool<RedisConnectionManager>,
+    queue_key: String,
+
+    _pd_serde: PhantomData<S>,
+}
+
+#[async_trait]
+impl<S: RedisStreamSerdeScheme, T: 'static + RedisStreamSerialize<S> + Send + Sync> TaskQueueSend<T>
+    for RedisStreamProducer<S>
+{
+    async fn send(&self, payload: T) -> Result<(), QueueError> {
+        let mut conn = self.redis.get().await.map_err(QueueError::generic)?;
+        redis::Cmd::xadd(&self.queue_key, "*", &payload.into_redis_stream_map()?)
+            .query_async(&mut *conn)
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok(())
+    }
+}
+
+pub struct RedisStreamConsumer<U: RedisStreamSerdeScheme> {
+    redis: bb8::Pool<RedisConnectionManager>,
+    queue_key: String,
+    consumer_group: String,
+    consumer_name: String,
+    reinsert_on_nack: bool,
+
+    _pd_serde: PhantomData<U>,
+}
+
+#[async_trait]
+impl<
+        S: RedisStreamSerdeScheme,
+        T: RedisStreamDeserialize<S> + RedisStreamSerialize<S> + Send + Sync,
+    > TaskQueueReceive<T, RedisStreamDelivery<T, S>> for RedisStreamConsumer<S>
+{
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<RedisStreamDelivery<T, S>>, QueueError> {
+        let mut conn = self.redis.get().await.map_err(QueueError::generic)?;
+
+        // Ensure an empty vec is never returned
+        let queue: StreamKey = loop {
+            let read_out: StreamReadReply = redis::Cmd::xread_options(
+                &[&self.queue_key],
+                &[">"],
+                &StreamReadOptions::default()
+                    .group(&self.consumer_group, &self.consumer_name)
+                    .block(
+                        timeout
+                            .as_millis()
+                            .try_into()
+                            .map_err(QueueError::generic)?,
+                    )
+                    .count(max_batch_size),
+            )
+            .query_async(&mut *conn)
+            .await
+            .map_err(QueueError::generic)?;
+
+            let queue = read_out.keys.into_iter().next().ok_or(QueueError::NoData)?;
+
+            if !queue.ids.is_empty() {
+                break queue;
+            }
+        };
+
+        Ok(queue
+            .ids
+            .into_iter()
+            .map(|stream_id| {
+                Ok(RedisStreamDelivery {
+                    entry_id: stream_id.id.clone(),
+                    body: stream_id,
+                    reinsert_on_nack: self.reinsert_on_nack,
+                    redis: self.redis.clone(),
+                    queue_key: self.queue_key.clone(),
+                    consumer_group: self.consumer_group.clone(),
+                    _pd_serde: PhantomData,
+                    _pd_payload: PhantomData,
+                })
+            })
+            .collect::<Result<Vec<_>, QueueError>>()?)
+    }
+}
+
+// TODO: Test that the pending entries list doesn't fill
diff --git a/bridge/generic-queue/src/sqs.rs b/bridge/generic-queue/src/sqs.rs
new file mode 100644
index 000000000..f72ff0a88
--- /dev/null
+++ b/bridge/generic-queue/src/sqs.rs
@@ -0,0 +1,206 @@
+use std::{marker::PhantomData, time::Duration};
+
+use async_trait::async_trait;
+use aws_sdk_sqs::{
+    operation::delete_message::DeleteMessageError, types::error::ReceiptHandleIsInvalid, Client,
+};
+use serde::{de::DeserializeOwned, Serialize};
+
+use crate::{Delivery, QueueError, TaskQueueBackend, TaskQueueReceive, TaskQueueSend};
+
+pub struct SqsConfig {
+    pub queue_dsn: String,
+    pub override_endpoint: bool,
+}
+
+pub struct SqsQueueBackend;
+
+#[async_trait]
+impl<T: 'static + DeserializeOwned + Send + Serialize + Sync> TaskQueueBackend<T>
+    for SqsQueueBackend
+{
+    type PairConfig = SqsConfig;
+
+    type Delivery = SqsDelivery<T>;
+
+    type Producer = SqsQueueProducer;
+    type Consumer = SqsQueueConsumer;
+
+    async fn new_pair(cfg: SqsConfig) -> Result<(SqsQueueProducer, SqsQueueConsumer), QueueError> {
+        let aws_cfg = if cfg.override_endpoint {
+            aws_config::from_env()
+                .endpoint_url(&cfg.queue_dsn)
+                .load()
+                .await
+        } else {
+            aws_config::load_from_env().await
+        };
+
+        let client = Client::new(&aws_cfg);
+
+        let producer = SqsQueueProducer {
+            client: client.clone(),
+            queue_dsn: cfg.queue_dsn.clone(),
+        };
+        let consumer = SqsQueueConsumer {
+            client,
+            queue_dsn: cfg.queue_dsn,
+        };
+
+        Ok((producer, consumer))
+    }
+
+    async fn producing_half(cfg: SqsConfig) -> Result<SqsQueueProducer, QueueError> {
+        let aws_cfg = if cfg.override_endpoint {
+            aws_config::from_env()
+                .endpoint_url(&cfg.queue_dsn)
+                .load()
+                .await
+        } else {
+            aws_config::load_from_env().await
+        };
+
+        let client = Client::new(&aws_cfg);
+
+        let producer = SqsQueueProducer {
+            client,
+            queue_dsn: cfg.queue_dsn,
+        };
+
+        Ok(producer)
+    }
+
+    async fn consuming_half(cfg: SqsConfig) -> Result<SqsQueueConsumer, QueueError> {
+        let aws_cfg = if cfg.override_endpoint {
+            aws_config::from_env()
+                .endpoint_url(&cfg.queue_dsn)
+                .load()
+                .await
+        } else {
+            aws_config::load_from_env().await
+        };
+
+        let client = Client::new(&aws_cfg);
+
+        let consumer = SqsQueueConsumer {
+            client,
+            queue_dsn: cfg.queue_dsn,
+        };
+
+        Ok(consumer)
+    }
+}
+
+pub struct SqsDelivery<T: DeserializeOwned> {
+    ack_client: Client,
+    // FIXME: Cow/Arc this stuff?
+    queue_dsn: String,
+    body: String,
+    receipt_handle: Option<String>,
+    _pd: PhantomData<T>,
+}
+
+#[async_trait]
+impl<T: DeserializeOwned + Send + Serialize + Sync> Delivery<T> for SqsDelivery<T> {
+    fn payload(&self) -> Result<T, QueueError> {
+        serde_json::from_str(&self.body).map_err(Into::into)
+    }
+
+    async fn ack(self) -> Result<(), QueueError> {
+        if let Some(receipt_handle) = self.receipt_handle {
+            self.ack_client
+                .delete_message()
+                .queue_url(&self.queue_dsn)
+                .receipt_handle(receipt_handle)
+                .send()
+                .await
+                .map_err(QueueError::generic)?;
+
+            Ok(())
+        } else {
+            Err(QueueError::generic(
+                DeleteMessageError::ReceiptHandleIsInvalid(
+                    ReceiptHandleIsInvalid::builder()
+                        .message("receipt handle must be Some to be acked")
+                        .build(),
+                ),
+            ))
+        }
+    }
+
+    async fn nack(self) -> Result<(), QueueError> {
+        Ok(())
+    }
+}
+
+pub struct SqsQueueProducer {
+    client: Client,
+    queue_dsn: String,
+}
+
+#[async_trait]
+impl<T: 'static + Serialize + Send + Sync> TaskQueueSend<T> for SqsQueueProducer {
+    async fn send(&self, payload: T) -> Result<(), QueueError> {
+        self.client
+            .send_message()
+            .queue_url(&self.queue_dsn)
+            .message_body(serde_json::to_string(&payload)?)
+            .send()
+            .await
+            .map_err(QueueError::generic)?;
+
+        Ok(())
+    }
+}
+
+pub struct SqsQueueConsumer {
+    client: Client,
+    queue_dsn: String,
+}
+
+#[async_trait]
+impl<T: 'static + DeserializeOwned + Send + Serialize + Sync> TaskQueueReceive<T, SqsDelivery<T>>
+    for SqsQueueConsumer
+{
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<SqsDelivery<T>>, QueueError> {
+        // Ensure that there's at least one message before returning regardless of timeout
+        let out = loop {
+            let out = self
+                .client
+                .receive_message()
+                .set_wait_time_seconds(Some(
+                    timeout.as_secs().try_into().map_err(QueueError::generic)?,
+                ))
+                .set_max_number_of_messages(Some(
+                    max_batch_size.try_into().map_err(QueueError::generic)?,
+                ))
+                .queue_url(&self.queue_dsn)
+                .send()
+                .await
+                .map_err(QueueError::generic)?;
+
+            if !out.messages().unwrap_or_default().is_empty() {
+                break out;
+            }
+        };
+
+        Ok(out
+            .messages()
+            .unwrap_or_default()
+            .iter()
+            .map(|message| -> Result<SqsDelivery<T>, QueueError> {
+                Ok(SqsDelivery {
+                    ack_client: self.client.clone(),
+                    queue_dsn: self.queue_dsn.clone(),
+                    body: message.body().unwrap_or_default().to_owned(),
+                    receipt_handle: message.receipt_handle().map(ToOwned::to_owned),
+                    _pd: PhantomData,
+                })
+            })
+            .collect::<Result<Vec<_>, _>>()?)
+    }
+}
diff --git a/bridge/svix-bridge-plugin-queue/Cargo.toml b/bridge/svix-bridge-plugin-queue/Cargo.toml
new file mode 100644
index 000000000..f86f54f34
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/Cargo.toml
@@ -0,0 +1,31 @@
+[package]
+name = "svix-bridge-plugin-queue"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+futures-lite = "1.12.0"
+generic_queue = { path = "../generic-queue" }
+serde_json = "1.0"
+serde = { version = "1.0", features = ["derive"] }
+svix-bridge-types = { path = "../svix-bridge-types" }
+tokio = { version = "1", features = ["full"] }
+tokio-executor-trait = "2.1"
+tokio-reactor-trait = "1.1"
+tracing = "0.1"
+
+[dev-dependencies]
+aws-config = "0.55"
+aws-sdk-sqs = "0.25"
+fastrand = "1.9"
+google-cloud-auth = { version = "0.9.2" }
+google-cloud-default = { version = "0.2.0", features = ["pubsub"]}
+google-cloud-gax = { version = "0.14.1" }
+google-cloud-googleapis = { version = "0.8.0" }
+google-cloud-pubsub = { version="0.14.1" }
+lapin = "2"
+redis = { version = "0.21", features = ["tokio-comp", "streams"] }
+tracing-subscriber = "0.3"
+wiremock = "0.5.18"
\ No newline at end of file
diff --git a/bridge/svix-bridge-plugin-queue/LICENSE b/bridge/svix-bridge-plugin-queue/LICENSE
new file mode 100644
index 000000000..954e47172
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2021-2023 Svix Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bridge/svix-bridge-plugin-queue/src/config.rs b/bridge/svix-bridge-plugin-queue/src/config.rs
new file mode 100644
index 000000000..d3ca805b4
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/config.rs
@@ -0,0 +1,86 @@
+pub use crate::gcp_pubsub::{GCPPubSubInputOpts, GCPPubSubOutputOpts};
+pub use crate::rabbitmq::{RabbitMqInputOpts, RabbitMqOutputOpts};
+pub use crate::receiver_output::QueueForwarder;
+pub use crate::redis::{RedisInputOpts, RedisOutputOpts};
+pub use crate::sqs::{SqsInputOpts, SqsOutputOpts};
+use crate::{
+    GCPPubSubConsumerPlugin, RabbitMqConsumerPlugin, RedisConsumerPlugin, SqsConsumerPlugin,
+};
+use serde::Deserialize;
+use svix_bridge_types::{ReceiverOutput, SenderInput, SenderOutputOpts};
+
+#[derive(Deserialize)]
+pub struct QueueConsumerConfig {
+    pub name: String,
+    pub input: SenderInputOpts,
+    #[serde(default)]
+    pub transformation: Option<String>,
+    pub output: SenderOutputOpts,
+}
+
+impl QueueConsumerConfig {
+    pub fn into_sender_input(self) -> Box<dyn SenderInput> {
+        match self.input {
+            SenderInputOpts::GCPPubSub(input) => Box::new(GCPPubSubConsumerPlugin::new(
+                self.name,
+                input,
+                self.transformation,
+                self.output,
+            )),
+            SenderInputOpts::RabbitMQ(input) => Box::new(RabbitMqConsumerPlugin::new(
+                self.name,
+                input,
+                self.transformation,
+                self.output,
+            )),
+            SenderInputOpts::Redis(input) => Box::new(RedisConsumerPlugin::new(
+                self.name,
+                input,
+                self.transformation,
+                self.output,
+            )),
+            SenderInputOpts::SQS(input) => Box::new(SqsConsumerPlugin::new(
+                self.name,
+                input,
+                self.transformation,
+                self.output,
+            )),
+        }
+    }
+}
+
+pub async fn into_receiver_output(
+    name: String,
+    opts: ReceiverOutputOpts,
+) -> Result<Box<dyn ReceiverOutput>, crate::Error> {
+    let forwarder = match opts {
+        ReceiverOutputOpts::GCPPubSub(opts) => {
+            QueueForwarder::from_gcp_pupsub_cfg(name, opts).await?
+        }
+        ReceiverOutputOpts::RabbitMQ(opts) => QueueForwarder::from_rabbitmq_cfg(name, opts).await?,
+        ReceiverOutputOpts::Redis(opts) => QueueForwarder::from_redis_cfg(name, opts).await?,
+        ReceiverOutputOpts::SQS(opts) => QueueForwarder::from_sqs_cfg(name, opts).await?,
+    };
+    Ok(Box::new(forwarder))
+}
+
+// TODO: feature flag the variants, thread the features down through to generic-queue
+#[derive(Debug, Deserialize)]
+#[serde(tag = "type", rename_all = "lowercase")]
+pub enum SenderInputOpts {
+    #[serde(rename = "gcp-pubsub")]
+    GCPPubSub(GCPPubSubInputOpts),
+    RabbitMQ(RabbitMqInputOpts),
+    Redis(RedisInputOpts),
+    SQS(SqsInputOpts),
+}
+
+#[derive(Clone, Debug, Deserialize)]
+#[serde(tag = "type", rename_all = "lowercase")]
+pub enum ReceiverOutputOpts {
+    #[serde(rename = "gcp-pubsub")]
+    GCPPubSub(GCPPubSubOutputOpts),
+    RabbitMQ(RabbitMqOutputOpts),
+    Redis(RedisOutputOpts),
+    SQS(SqsOutputOpts),
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/error.rs b/bridge/svix-bridge-plugin-queue/src/error.rs
new file mode 100644
index 000000000..c3c1f5b28
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/error.rs
@@ -0,0 +1,46 @@
+pub use generic_queue::QueueError;
+use svix_bridge_types::svix;
+
+pub enum Error {
+    Payload(String),
+    Json(serde_json::Error),
+    Queue(QueueError),
+    Svix(svix::error::Error),
+    Generic(String),
+}
+
+impl From<svix::error::Error> for Error {
+    fn from(value: svix::error::Error) -> Self {
+        Error::Svix(value)
+    }
+}
+
+impl From<serde_json::Error> for Error {
+    fn from(value: serde_json::Error) -> Self {
+        Error::Json(value)
+    }
+}
+
+impl From<QueueError> for Error {
+    fn from(value: QueueError) -> Self {
+        Error::Queue(value)
+    }
+}
+
+impl From<String> for Error {
+    fn from(value: String) -> Self {
+        Self::Generic(value)
+    }
+}
+
+impl From<Error> for std::io::Error {
+    fn from(value: Error) -> Self {
+        match value {
+            Error::Payload(e) => std::io::Error::new(std::io::ErrorKind::Other, e),
+            Error::Json(e) => std::io::Error::new(std::io::ErrorKind::Other, e),
+            Error::Queue(e) => std::io::Error::new(std::io::ErrorKind::Other, e),
+            Error::Svix(e) => std::io::Error::new(std::io::ErrorKind::Other, e),
+            Error::Generic(e) => std::io::Error::new(std::io::ErrorKind::Other, e),
+        }
+    }
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/gcp_pubsub/mod.rs b/bridge/svix-bridge-plugin-queue/src/gcp_pubsub/mod.rs
new file mode 100644
index 000000000..4c872ef4d
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/gcp_pubsub/mod.rs
@@ -0,0 +1,101 @@
+use crate::error::Error;
+use crate::ConsumerWrapper;
+use crate::{run_inner, Consumer};
+use generic_queue::gcp_pubsub::{GCPPubSubConfig, GCPPubSubQueueBackend};
+use generic_queue::TaskQueueBackend;
+use serde::Deserialize;
+use std::path::PathBuf;
+use svix_bridge_types::{
+    async_trait, svix::api::Svix, JsObject, SenderInput, SenderOutputOpts, TransformerTx,
+};
+
+#[derive(Debug, Default, Deserialize)]
+pub struct GCPPubSubInputOpts {
+    pub subscription_id: String,
+    pub credentials_file: Option<PathBuf>,
+}
+
+pub struct GCPPubSubConsumerPlugin {
+    name: String,
+    input_options: GCPPubSubInputOpts,
+    svix_client: Svix,
+    transformer_tx: Option<TransformerTx>,
+    transformation: Option<String>,
+}
+
+impl GCPPubSubConsumerPlugin {
+    pub fn new(
+        name: String,
+        input: GCPPubSubInputOpts,
+        transformation: Option<String>,
+        output: SenderOutputOpts,
+    ) -> Self {
+        Self {
+            name,
+            input_options: input,
+            svix_client: match output {
+                SenderOutputOpts::Svix(output) => {
+                    Svix::new(output.token, output.options.map(Into::into))
+                }
+            },
+            transformer_tx: None,
+            transformation,
+        }
+    }
+}
+
+#[async_trait]
+impl Consumer for GCPPubSubConsumerPlugin {
+    fn source(&self) -> &str {
+        &self.input_options.subscription_id
+    }
+
+    fn system(&self) -> &str {
+        "gcp-pubsub"
+    }
+
+    fn transformer_tx(&self) -> &Option<TransformerTx> {
+        &self.transformer_tx
+    }
+
+    fn transformation(&self) -> &Option<String> {
+        &self.transformation
+    }
+
+    fn svix_client(&self) -> &Svix {
+        &self.svix_client
+    }
+
+    async fn consumer(&self) -> std::io::Result<ConsumerWrapper> {
+        let consumer = <GCPPubSubQueueBackend as TaskQueueBackend<JsObject>>::consuming_half(
+            GCPPubSubConfig {
+                subscription_id: self.input_options.subscription_id.clone(),
+                credentials_file: self.input_options.credentials_file.clone(),
+                // Topics are for producers so we don't care
+                topic: String::new(),
+            },
+        )
+        .await
+        .map_err(Error::from)?;
+        Ok(ConsumerWrapper::GCPPubSub(consumer))
+    }
+}
+
+#[async_trait]
+impl SenderInput for GCPPubSubConsumerPlugin {
+    fn name(&self) -> &str {
+        &self.name
+    }
+    fn set_transformer(&mut self, tx: Option<TransformerTx>) {
+        self.transformer_tx = tx;
+    }
+    async fn run(&self) -> std::io::Result<()> {
+        run_inner(self).await
+    }
+}
+
+#[derive(Clone, Debug, Deserialize)]
+pub struct GCPPubSubOutputOpts {
+    pub topic: String,
+    pub credentials_file: Option<PathBuf>,
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/lib.rs b/bridge/svix-bridge-plugin-queue/src/lib.rs
new file mode 100644
index 000000000..5e5153dbb
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/lib.rs
@@ -0,0 +1,298 @@
+use generic_queue::gcp_pubsub::{GCPPubSubDelivery, GCPPubSubQueueConsumer};
+use generic_queue::rabbitmq::{RabbitMqConsumer, RabbitMqDelivery};
+use generic_queue::redis::{RedisStreamConsumer, RedisStreamDelivery, RedisStreamJsonSerde};
+use generic_queue::sqs::{SqsDelivery, SqsQueueConsumer};
+use generic_queue::{Delivery, QueueError, TaskQueueReceive};
+use serde::{Deserialize, Serialize};
+use std::time::{Duration, Instant};
+use svix_bridge_types::{
+    async_trait,
+    svix::api::{MessageIn, PostOptions as PostOptions_, Svix},
+    JsObject, JsReturn, TransformerJob, TransformerTx,
+};
+use tracing::instrument;
+
+pub const PLUGIN_NAME: &str = env!("CARGO_PKG_NAME");
+pub const PLUGIN_VERS: &str = env!("CARGO_PKG_VERSION");
+
+pub mod config;
+mod error;
+mod gcp_pubsub;
+mod rabbitmq;
+mod receiver_output;
+mod redis;
+mod sqs;
+pub use self::{
+    error::Error, gcp_pubsub::GCPPubSubConsumerPlugin, rabbitmq::RabbitMqConsumerPlugin,
+    redis::RedisConsumerPlugin, sqs::SqsConsumerPlugin,
+};
+
+/// Each queue backend has a different delivery type which is also generic by the type of the
+/// payload (or more).
+/// This wrapper hides the inner types so the calling code can be generalized more trivially.
+pub enum DeliveryWrapper {
+    GCPPubSub(GCPPubSubDelivery<JsObject>),
+    RabbitMQ(RabbitMqDelivery<JsObject>),
+    Redis(RedisStreamDelivery<JsObject, RedisStreamJsonSerde>),
+    SQS(SqsDelivery<JsObject>),
+}
+
+impl DeliveryWrapper {
+    /// Delegates to the inner delivery types ack method.
+    async fn ack(self) -> Result<(), QueueError> {
+        match self {
+            DeliveryWrapper::GCPPubSub(x) => x.ack().await,
+            DeliveryWrapper::RabbitMQ(x) => x.ack().await,
+            DeliveryWrapper::Redis(x) => x.ack().await,
+            DeliveryWrapper::SQS(x) => x.ack().await,
+        }
+    }
+    /// Delegates to the inner delivery types nack method.
+    async fn nack(self) -> Result<(), QueueError> {
+        match self {
+            DeliveryWrapper::GCPPubSub(x) => x.nack().await,
+            DeliveryWrapper::RabbitMQ(x) => x.nack().await,
+            DeliveryWrapper::Redis(x) => x.nack().await,
+            DeliveryWrapper::SQS(x) => x.nack().await,
+        }
+    }
+
+    /// Decodes the inner delivery as JsObject.
+    fn payload(&self) -> Result<JsObject, QueueError> {
+        match self {
+            DeliveryWrapper::GCPPubSub(x) => Delivery::<JsObject>::payload(x),
+            DeliveryWrapper::RabbitMQ(x) => Delivery::<JsObject>::payload(x),
+            DeliveryWrapper::Redis(x) => Delivery::<JsObject>::payload(x),
+            DeliveryWrapper::SQS(x) => Delivery::<JsObject>::payload(x),
+        }
+    }
+}
+
+/// Each queue backend has a different consumer type which is also generic by the type of the
+/// payload (or more).
+/// This wrapper hides the inner types so the calling code can be generalized more trivially.
+pub enum ConsumerWrapper {
+    GCPPubSub(GCPPubSubQueueConsumer),
+    RabbitMQ(RabbitMqConsumer),
+    Redis(RedisStreamConsumer<RedisStreamJsonSerde>),
+    SQS(SqsQueueConsumer),
+}
+
+impl ConsumerWrapper {
+    async fn receive_all(
+        &mut self,
+        max_batch_size: usize,
+        timeout: Duration,
+    ) -> Result<Vec<DeliveryWrapper>, QueueError> {
+        Ok(match self {
+            ConsumerWrapper::GCPPubSub(x) => x
+                .receive_all(max_batch_size, timeout)
+                .await?
+                .into_iter()
+                .map(DeliveryWrapper::GCPPubSub)
+                .collect(),
+            ConsumerWrapper::RabbitMQ(x) => x
+                .receive_all(max_batch_size, timeout)
+                .await?
+                .into_iter()
+                .map(DeliveryWrapper::RabbitMQ)
+                .collect(),
+            ConsumerWrapper::Redis(x) => x
+                .receive_all(max_batch_size, timeout)
+                .await?
+                .into_iter()
+                .map(DeliveryWrapper::Redis)
+                .collect(),
+            ConsumerWrapper::SQS(x) => x
+                .receive_all(max_batch_size, timeout)
+                .await?
+                .into_iter()
+                .map(DeliveryWrapper::SQS)
+                .collect(),
+        })
+    }
+}
+
+#[async_trait]
+trait Consumer {
+    /// The source of the stream of messages.
+    /// The name/identifier for the queue or subscription or whatever.
+    fn source(&self) -> &str;
+
+    /// The name of the messaging system.
+    fn system(&self) -> &str;
+
+    /// Gets the channel sender for running transformations.
+    fn transformer_tx(&self) -> &Option<TransformerTx>;
+    /// The js source for the transformation to run on each payload.
+    fn transformation(&self) -> &Option<String>;
+
+    /// The client to use when creating messages in svix.
+    fn svix_client(&self) -> &Svix;
+
+    async fn transform(&self, script: String, payload: JsObject) -> std::io::Result<JsObject> {
+        let (job, rx) = TransformerJob::new(script.clone(), payload);
+        self.transformer_tx()
+            .as_ref()
+            .expect("transformations not configured")
+            .send(job)
+            .map_err(|e| Error::Generic(e.to_string()))?;
+
+        let ret = rx
+            .await
+            .map_err(|_e| Error::Generic("transformation rx failed".to_string()))
+            .and_then(|x| {
+                x.map_err(|_e| Error::Generic("transformation execution failed".to_string()))
+            })?;
+
+        match ret {
+            JsReturn::Object(v) => Ok(v),
+            JsReturn::Invalid => {
+                Err(Error::Generic("transformation produced unexpected value".to_string()).into())
+            }
+        }
+    }
+
+    /// Gets a "wrapped" consumer, called by [`consume`].
+    async fn consumer(&self) -> std::io::Result<ConsumerWrapper>;
+
+    /// Main consumer loop
+    async fn consume(&self) -> std::io::Result<()> {
+        let mut consumer = self.consumer().await?;
+        tracing::debug!("{} consuming: {}", self.system(), self.source(),);
+        loop {
+            self.receive(&mut consumer).await?;
+        }
+    }
+
+    /// Pulls N messages off the queue and feeds them to [`Self::process`].
+    #[instrument(skip_all,
+    fields(
+        otel.kind = "CONSUMER",
+        messaging.system = self.system(),
+        messaging.operation = "receive",
+        messaging.source = self.source(),
+        svix_bridge_plugin.name = crate::PLUGIN_NAME,
+        svix_bridge_plugin.vers = crate::PLUGIN_VERS,
+    )
+    )]
+    async fn receive(&self, consumer: &mut ConsumerWrapper) -> std::io::Result<()> {
+        let deliveries = consumer
+            .receive_all(1, Duration::from_millis(10))
+            .await
+            .map_err(Error::from)?;
+        tracing::trace!("received: {}", deliveries.len());
+        for delivery in deliveries {
+            self.process(delivery).await?;
+        }
+        Ok(())
+    }
+
+    /// Parses the delivery as JSON and feeds it into [`create_svix_message`].
+    /// Will nack the delivery if either the JSON parse, transformation, or the request to svix fails.
+    #[instrument(skip_all, fields(messaging.operation = "process"))]
+    async fn process(&self, delivery: DeliveryWrapper) -> std::io::Result<()> {
+        let payload = match delivery.payload() {
+            Ok(p) => p,
+            Err(e) => {
+                tracing::warn!("{e}");
+                delivery.nack().await.map_err(Error::from)?;
+                return Ok(());
+            }
+        };
+
+        let payload = if let Some(script) = self.transformation() {
+            match self.transform(script.clone(), payload).await {
+                Err(e) => {
+                    tracing::error!("nack: {e}");
+                    delivery.nack().await.map_err(Error::from)?;
+                    return Ok(());
+                }
+                Ok(x) => x,
+            }
+        } else {
+            payload
+        };
+
+        match create_svix_message(self.svix_client(), payload).await {
+            Ok(_) => {
+                tracing::trace!("ack");
+                delivery.ack().await.map_err(Error::from)?
+            }
+            Err(e) => {
+                tracing::error!("nack: {e}");
+                delivery.nack().await.map_err(Error::from)?
+            }
+        }
+        Ok(())
+    }
+}
+
+async fn run_inner(consumer: &(impl Consumer + Send + Sync)) -> std::io::Result<()> {
+    let mut fails: u64 = 0;
+    let mut last_fail = Instant::now();
+    let system_name = consumer.system();
+    let source = consumer.source();
+
+    tracing::info!("{system_name} starting: {source}");
+
+    loop {
+        if let Err(e) = consumer.consume().await {
+            tracing::error!("{e}");
+        }
+
+        tracing::error!("{system_name} disconnected: {source}");
+
+        if last_fail.elapsed() > Duration::from_secs(10) {
+            // reset the fail count if we didn't have a hiccup in the past short while.
+            tracing::trace!("been a while since last fail, resetting count");
+            fails = 0;
+        } else {
+            fails += 1;
+        }
+
+        last_fail = Instant::now();
+        tokio::time::sleep(Duration::from_millis((300 * fails).min(3000))).await;
+    }
+}
+
+#[derive(Clone, Default, Deserialize, Serialize)]
+pub struct PostOptions {
+    idempotency_key: Option<String>,
+}
+
+impl From<PostOptions> for PostOptions_ {
+    fn from(value: PostOptions) -> Self {
+        PostOptions_ {
+            idempotency_key: value.idempotency_key,
+        }
+    }
+}
+
+#[derive(Clone, Deserialize, Serialize)]
+pub struct CreateMessageRequest {
+    pub app_id: String,
+    pub message: MessageIn,
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub post_options: Option<PostOptions>,
+}
+
+async fn create_svix_message(svix: &Svix, value: JsObject) -> std::io::Result<()> {
+    let CreateMessageRequest {
+        app_id,
+        message,
+        post_options,
+    }: CreateMessageRequest = serde_json::from_value(value.into())?;
+    let span = tracing::error_span!(
+        "create_svix_message",
+        app_id = app_id,
+        event_type = message.event_type
+    );
+    let _enter = span.enter();
+
+    svix.message()
+        .create(app_id, message, post_options.map(Into::into))
+        .await
+        .map_err(Error::from)?;
+    Ok(())
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/rabbitmq/mod.rs b/bridge/svix-bridge-plugin-queue/src/rabbitmq/mod.rs
new file mode 100644
index 000000000..17d759bb3
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/rabbitmq/mod.rs
@@ -0,0 +1,136 @@
+use crate::error::Error;
+use crate::run_inner;
+use crate::Consumer;
+use crate::ConsumerWrapper;
+use generic_queue::{
+    rabbitmq::{
+        BasicConsumeOptions, BasicProperties, BasicPublishOptions, ConnectionProperties,
+        FieldTable, RabbitMqBackend, RabbitMqConfig,
+    },
+    TaskQueueBackend,
+};
+use serde::Deserialize;
+use svix_bridge_types::{
+    async_trait, svix::api::Svix, JsObject, SenderInput, SenderOutputOpts, TransformerTx,
+};
+
+#[derive(Debug, Deserialize)]
+pub struct RabbitMqInputOpts {
+    /// Connection string for RabbitMQ.
+    pub uri: String,
+    /// The name of the queue to consume from.
+    /// N.b. the queue must be declared before the consumer can connect to it.
+    pub queue_name: String,
+    /// Identifier for the consumer.
+    #[serde(default)]
+    pub consumer_tag: Option<String>,
+    #[serde(default)]
+    pub consume_opts: Option<BasicConsumeOptions>,
+    #[serde(default)]
+    pub consume_args: Option<FieldTable>,
+    #[serde(default = "default_requeue")]
+    pub requeue_on_nack: bool,
+}
+
+fn default_requeue() -> bool {
+    true
+}
+
+pub struct RabbitMqConsumerPlugin {
+    name: String,
+    input_options: RabbitMqInputOpts,
+    svix_client: Svix,
+    transformer_tx: Option<TransformerTx>,
+    transformation: Option<String>,
+}
+
+impl RabbitMqConsumerPlugin {
+    pub fn new(
+        name: String,
+        input: RabbitMqInputOpts,
+        transformation: Option<String>,
+        output: SenderOutputOpts,
+    ) -> Self {
+        Self {
+            name,
+            input_options: input,
+            svix_client: match output {
+                SenderOutputOpts::Svix(output) => {
+                    Svix::new(output.token, output.options.map(Into::into))
+                }
+            },
+            transformer_tx: None,
+            transformation,
+        }
+    }
+}
+
+#[async_trait]
+impl Consumer for RabbitMqConsumerPlugin {
+    fn source(&self) -> &str {
+        &self.input_options.queue_name
+    }
+
+    fn system(&self) -> &str {
+        "rabbitmq"
+    }
+
+    fn transformer_tx(&self) -> &Option<TransformerTx> {
+        &self.transformer_tx
+    }
+
+    fn transformation(&self) -> &Option<String> {
+        &self.transformation
+    }
+
+    fn svix_client(&self) -> &Svix {
+        &self.svix_client
+    }
+
+    async fn consumer(&self) -> std::io::Result<ConsumerWrapper> {
+        let consumer =
+            <RabbitMqBackend as TaskQueueBackend<JsObject>>::consuming_half(RabbitMqConfig {
+                uri: self.input_options.uri.clone(),
+                connection_properties: ConnectionProperties::default(),
+                publish_exchange: String::new(),
+                publish_routing_key: String::new(),
+                publish_options: BasicPublishOptions::default(),
+                publish_properites: BasicProperties::default(),
+                consume_queue: self.input_options.queue_name.clone(),
+                consumer_tag: self.input_options.consumer_tag.clone().unwrap_or_default(),
+                consume_options: self.input_options.consume_opts.unwrap_or_default(),
+                consume_arguments: self.input_options.consume_args.clone().unwrap_or_default(),
+                requeue_on_nack: self.input_options.requeue_on_nack,
+            })
+            .await
+            .map_err(Error::from)?;
+        Ok(ConsumerWrapper::RabbitMQ(consumer))
+    }
+}
+
+#[async_trait]
+impl SenderInput for RabbitMqConsumerPlugin {
+    fn name(&self) -> &str {
+        &self.name
+    }
+    fn set_transformer(&mut self, tx: Option<TransformerTx>) {
+        self.transformer_tx = tx;
+    }
+    async fn run(&self) -> std::io::Result<()> {
+        run_inner(self).await
+    }
+}
+
+#[derive(Clone, Debug, Deserialize)]
+pub struct RabbitMqOutputOpts {
+    /// Connection string for RabbitMQ.
+    pub uri: String,
+    /// The exchange to publish messages to.
+    pub exchange: String,
+    /// The routing key to publish messages to.
+    pub routing_key: String,
+    #[serde(default)]
+    pub publish_options: BasicPublishOptions,
+    #[serde(default)]
+    pub publish_properties: BasicProperties,
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/receiver_output/mod.rs b/bridge/svix-bridge-plugin-queue/src/receiver_output/mod.rs
new file mode 100644
index 000000000..c8d2b6bbe
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/receiver_output/mod.rs
@@ -0,0 +1,125 @@
+use crate::gcp_pubsub::GCPPubSubOutputOpts;
+use crate::rabbitmq::RabbitMqOutputOpts;
+use crate::redis::RedisOutputOpts;
+use crate::sqs::SqsOutputOpts;
+use crate::Error;
+use generic_queue::gcp_pubsub::{GCPPubSubConfig, GCPPubSubQueueBackend};
+use generic_queue::rabbitmq::{RabbitMqBackend, RabbitMqConfig};
+use generic_queue::redis::{RedisConfig, RedisQueueBackend};
+use generic_queue::sqs::{SqsConfig, SqsQueueBackend};
+use generic_queue::{TaskQueueBackend, TaskQueueSend};
+use std::sync::Arc;
+use svix_bridge_types::{async_trait, JsObject, ReceiverOutput};
+
+type Result<T> = std::result::Result<T, Error>;
+
+#[derive(Clone)]
+pub struct QueueForwarder {
+    name: String,
+    // FIXME: if we retain things like the queue name we can show this in the Debug impl
+    sender: Arc<Box<dyn TaskQueueSend<JsObject>>>,
+}
+
+impl QueueForwarder {
+    pub async fn from_rabbitmq_cfg(
+        name: String,
+        cfg: RabbitMqOutputOpts,
+    ) -> Result<QueueForwarder> {
+        let sender =
+            <RabbitMqBackend as TaskQueueBackend<JsObject>>::producing_half(RabbitMqConfig {
+                uri: cfg.uri,
+                // N.b the connection properties type is not serde-friendly. If we want to expose some
+                // of these settings we'll probably need to provide our own type and build the real one
+                // here from cfg.
+                connection_properties: Default::default(),
+                publish_exchange: cfg.exchange,
+                publish_routing_key: cfg.routing_key,
+                publish_options: cfg.publish_options,
+                publish_properites: cfg.publish_properties,
+                // consumer stuff we don't care about
+                consume_queue: "".to_string(),
+                consumer_tag: "".to_string(),
+                consume_options: Default::default(),
+                consume_arguments: Default::default(),
+                requeue_on_nack: false,
+            })
+            .await?;
+
+        Ok(QueueForwarder {
+            name,
+            sender: Arc::new(Box::new(sender)),
+        })
+    }
+
+    pub async fn from_redis_cfg(name: String, cfg: RedisOutputOpts) -> Result<QueueForwarder> {
+        let sender =
+            <RedisQueueBackend as TaskQueueBackend<JsObject>>::producing_half(RedisConfig {
+                dsn: cfg.dsn,
+                max_connections: cfg.max_connections,
+                queue_key: cfg.queue_key,
+                // consumer stuff we don't really care about
+                reinsert_on_nack: false,
+                consumer_group: "".to_string(),
+                consumer_name: "".to_string(),
+            })
+            .await?;
+
+        Ok(QueueForwarder {
+            name,
+            sender: Arc::new(Box::new(sender)),
+        })
+    }
+
+    pub async fn from_sqs_cfg(name: String, cfg: SqsOutputOpts) -> Result<QueueForwarder> {
+        let sender = <SqsQueueBackend as TaskQueueBackend<JsObject>>::producing_half(SqsConfig {
+            queue_dsn: cfg.queue_dsn,
+            override_endpoint: cfg.override_endpoint,
+        })
+        .await?;
+
+        Ok(QueueForwarder {
+            name,
+            sender: Arc::new(Box::new(sender)),
+        })
+    }
+
+    pub async fn from_gcp_pupsub_cfg(
+        name: String,
+        cfg: GCPPubSubOutputOpts,
+    ) -> Result<QueueForwarder> {
+        let sender = <GCPPubSubQueueBackend as TaskQueueBackend<JsObject>>::producing_half(
+            GCPPubSubConfig {
+                topic: cfg.topic,
+                credentials_file: cfg.credentials_file,
+                // Don't need this. Subscriptions are for consumers only.
+                subscription_id: String::new(),
+            },
+        )
+        .await?;
+
+        Ok(QueueForwarder {
+            name,
+            sender: Arc::new(Box::new(sender)),
+        })
+    }
+}
+
+impl std::fmt::Debug for QueueForwarder {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("QueueForwarder").finish()
+    }
+}
+
+#[async_trait]
+impl ReceiverOutput for QueueForwarder {
+    fn name(&self) -> &str {
+        &self.name
+    }
+    async fn handle(&self, payload: JsObject) -> std::io::Result<()> {
+        self.sender
+            .send(payload)
+            .await
+            .map_err(crate::Error::from)?;
+        Ok(())
+    }
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/redis/mod.rs b/bridge/svix-bridge-plugin-queue/src/redis/mod.rs
new file mode 100644
index 000000000..8496c76aa
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/redis/mod.rs
@@ -0,0 +1,112 @@
+use crate::error::Error;
+use crate::run_inner;
+use crate::Consumer;
+use crate::ConsumerWrapper;
+use generic_queue::redis::RedisConfig;
+use generic_queue::{redis::RedisQueueBackend, TaskQueueBackend};
+use serde::Deserialize;
+use svix_bridge_types::{
+    async_trait, svix::api::Svix, JsObject, SenderInput, SenderOutputOpts, TransformerTx,
+};
+
+#[derive(Debug, Default, Deserialize)]
+pub struct RedisInputOpts {
+    pub dsn: String,
+    pub max_connections: u16,
+    #[serde(default = "default_reinsert_on_nack")]
+    pub reinsert_on_nack: bool,
+    pub queue_key: String,
+    pub consumer_group: String,
+    pub consumer_name: String,
+}
+
+fn default_reinsert_on_nack() -> bool {
+    true
+}
+
+pub struct RedisConsumerPlugin {
+    name: String,
+    input_options: RedisInputOpts,
+    svix_client: Svix,
+    transformer_tx: Option<TransformerTx>,
+    transformation: Option<String>,
+}
+
+impl RedisConsumerPlugin {
+    pub fn new(
+        name: String,
+        input: RedisInputOpts,
+        transformation: Option<String>,
+        output: SenderOutputOpts,
+    ) -> Self {
+        Self {
+            name,
+            input_options: input,
+            svix_client: match output {
+                SenderOutputOpts::Svix(output) => {
+                    Svix::new(output.token, output.options.map(Into::into))
+                }
+            },
+            transformer_tx: None,
+            transformation,
+        }
+    }
+}
+
+#[async_trait]
+impl Consumer for RedisConsumerPlugin {
+    fn source(&self) -> &str {
+        &self.input_options.queue_key
+    }
+
+    fn system(&self) -> &str {
+        "redis"
+    }
+
+    fn transformer_tx(&self) -> &Option<TransformerTx> {
+        &self.transformer_tx
+    }
+
+    fn transformation(&self) -> &Option<String> {
+        &self.transformation
+    }
+
+    fn svix_client(&self) -> &Svix {
+        &self.svix_client
+    }
+
+    async fn consumer(&self) -> std::io::Result<ConsumerWrapper> {
+        let consumer =
+            <RedisQueueBackend as TaskQueueBackend<JsObject>>::consuming_half(RedisConfig {
+                dsn: self.input_options.dsn.clone(),
+                max_connections: self.input_options.max_connections,
+                reinsert_on_nack: self.input_options.reinsert_on_nack,
+                queue_key: self.input_options.queue_key.clone(),
+                consumer_group: self.input_options.consumer_group.clone(),
+                consumer_name: self.input_options.consumer_name.clone(),
+            })
+            .await
+            .map_err(Error::from)?;
+        Ok(ConsumerWrapper::Redis(consumer))
+    }
+}
+
+#[async_trait]
+impl SenderInput for RedisConsumerPlugin {
+    fn name(&self) -> &str {
+        &self.name
+    }
+    fn set_transformer(&mut self, tx: Option<TransformerTx>) {
+        self.transformer_tx = tx;
+    }
+    async fn run(&self) -> std::io::Result<()> {
+        run_inner(self).await
+    }
+}
+
+#[derive(Clone, Debug, Deserialize)]
+pub struct RedisOutputOpts {
+    pub dsn: String,
+    pub max_connections: u16,
+    pub queue_key: String,
+}
diff --git a/bridge/svix-bridge-plugin-queue/src/sqs/mod.rs b/bridge/svix-bridge-plugin-queue/src/sqs/mod.rs
new file mode 100644
index 000000000..053fb7ed9
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/src/sqs/mod.rs
@@ -0,0 +1,99 @@
+use crate::error::Error;
+use crate::{run_inner, Consumer, ConsumerWrapper};
+use generic_queue::{
+    sqs::{SqsConfig, SqsQueueBackend},
+    TaskQueueBackend,
+};
+use serde::Deserialize;
+use svix_bridge_types::{
+    async_trait, svix::api::Svix, JsObject, SenderInput, SenderOutputOpts, TransformerTx,
+};
+
+#[derive(Debug, Default, Deserialize)]
+pub struct SqsInputOpts {
+    pub queue_dsn: String,
+    #[serde(default)]
+    pub override_endpoint: bool,
+}
+
+pub struct SqsConsumerPlugin {
+    name: String,
+    input_options: SqsInputOpts,
+    svix_client: Svix,
+    transformer_tx: Option<TransformerTx>,
+    transformation: Option<String>,
+}
+
+impl SqsConsumerPlugin {
+    pub fn new(
+        name: String,
+        input: SqsInputOpts,
+        transformation: Option<String>,
+        output: SenderOutputOpts,
+    ) -> Self {
+        Self {
+            name,
+            input_options: input,
+            svix_client: match output {
+                SenderOutputOpts::Svix(output) => {
+                    Svix::new(output.token, output.options.map(Into::into))
+                }
+            },
+            transformer_tx: None,
+            transformation,
+        }
+    }
+}
+
+#[async_trait]
+impl Consumer for SqsConsumerPlugin {
+    fn source(&self) -> &str {
+        &self.input_options.queue_dsn
+    }
+
+    fn system(&self) -> &str {
+        "sqs"
+    }
+
+    fn transformer_tx(&self) -> &Option<TransformerTx> {
+        &self.transformer_tx
+    }
+
+    fn transformation(&self) -> &Option<String> {
+        &self.transformation
+    }
+
+    fn svix_client(&self) -> &Svix {
+        &self.svix_client
+    }
+
+    async fn consumer(&self) -> std::io::Result<ConsumerWrapper> {
+        let consumer = <SqsQueueBackend as TaskQueueBackend<JsObject>>::consuming_half(SqsConfig {
+            queue_dsn: self.input_options.queue_dsn.clone(),
+            override_endpoint: self.input_options.override_endpoint,
+        })
+        .await
+        .map_err(Error::from)?;
+        Ok(ConsumerWrapper::SQS(consumer))
+    }
+}
+
+#[async_trait]
+impl SenderInput for SqsConsumerPlugin {
+    fn name(&self) -> &str {
+        &self.name
+    }
+    fn set_transformer(&mut self, tx: Option<TransformerTx>) {
+        self.transformer_tx = tx;
+    }
+    async fn run(&self) -> std::io::Result<()> {
+        run_inner(self).await
+    }
+}
+
+#[derive(Clone, Debug, Deserialize)]
+pub struct SqsOutputOpts {
+    pub queue_dsn: String,
+    #[serde(default)]
+    pub override_endpoint: bool,
+}
diff --git a/bridge/svix-bridge-types/Cargo.toml b/bridge/svix-bridge-types/Cargo.toml
new file mode 100644
index 000000000..7faaf2fb4
--- /dev/null
+++ b/bridge/svix-bridge-types/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "svix-bridge-types"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+async-trait = "0.1"
+tokio = { version = "1", features = ["full"] }
+serde_json = "1"
+serde = { version = "1", features = ["derive"] }
+svix = "0.85.1"
\ No newline at end of file
diff --git a/bridge/svix-bridge-types/LICENSE b/bridge/svix-bridge-types/LICENSE
new file mode 100644
index 000000000..954e47172
--- /dev/null
+++ b/bridge/svix-bridge-types/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2021-2023 Svix Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bridge/svix-bridge-types/src/lib.rs b/bridge/svix-bridge-types/src/lib.rs
new file mode 100644
index 000000000..7f13ea51f
--- /dev/null
+++ b/bridge/svix-bridge-types/src/lib.rs
@@ -0,0 +1,135 @@
+pub use async_trait::async_trait;
+use serde::Deserialize;
+pub use svix;
+use svix::api::SvixOptions as _SvixOptions;
+use tokio::sync::mpsc;
+use tokio::sync::oneshot;
+
+/// Plain old JSON objects are what the transformations expect to receive and produce.
+pub type JsObject = serde_json::Map<String, serde_json::Value>;
+/// A channel for plugins to send payloads/scripts to for execution.
+pub type TransformerTx = mpsc::UnboundedSender<TransformerJob>;
+/// The receiver side for transformations. The JS executor reads from this.
+pub type TransformerRx = mpsc::UnboundedReceiver<TransformerJob>;
+/// A oneshot channel for the JS executor to "publish" return values to once complete.
+// FIXME: better error type?
+pub type TransformerCallbackTx = oneshot::Sender<Result<JsReturn, ()>>;
+/// Used by the caller of the transformer to await the execution's output.
+// FIXME: better error type?
+pub type TransformerCallbackRx = oneshot::Receiver<Result<JsReturn, ()>>;
+
+/// A transformation job sent to the JS executor.
+/// Once the script has been run on the payload, the transformed payload is sent back through the
+/// callback channel.
+pub struct TransformerJob {
+    pub callback_tx: TransformerCallbackTx,
+    pub payload: JsObject,
+    pub script: String,
+}
+
+pub enum JsReturn {
+    /// A successfully transformed payload.
+    // XXX: not sure if there's a cheaper way to deserialize the output while requiring an Object.
+    Object(JsObject),
+    /// For cases where the JS script executes successfully but produces an unexpected output.
+    Invalid,
+}
+
+impl TransformerJob {
+    pub fn new(script: String, payload: JsObject) -> (Self, TransformerCallbackRx) {
+        let (callback_tx, callback_rx) = oneshot::channel();
+        (
+            Self {
+                payload,
+                script,
+                callback_tx,
+            },
+            callback_rx,
+        )
+    }
+}
+
+/// Effectively a black box to the supervisor.
+/// Plugins should run until they are done, and likely they should not be "done" until the program
+/// exits.
+#[async_trait]
+pub trait SenderInput: Send {
+    fn name(&self) -> &str;
+    /// For plugins that want to run JS transformations on payloads.
+    /// Giving them a sender lets them pass messages to the JS executor.
+    fn set_transformer(&mut self, _tx: Option<TransformerTx>) {}
+    async fn run(&self) -> std::io::Result<()>;
+}
+
+/// Represents something we can hand a webhook payload to.
+/// Aka a "forwarder."
+///
+/// To start, we're only using this in conjunction with an HTTP server "owned" by the bridge binary.
+#[async_trait]
+pub trait ReceiverOutput: Send + Sync {
+    fn name(&self) -> &str;
+    async fn handle(&self, payload: JsObject) -> std::io::Result<()>;
+}
+
+#[derive(Deserialize, Debug, Clone, Default)]
+#[serde(tag = "type", rename_all = "lowercase")]
+pub enum WebhookVerifier {
+    Svix {
+        endpoint_secret: String,
+    },
+    #[default]
+    None,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+#[serde(tag = "type", rename_all = "lowercase")]
+pub enum ReceiverInputOpts {
+    Webhook {
+        path_id: String,
+        #[serde(default)]
+        verification: WebhookVerifier,
+    },
+    #[serde(rename = "svix-webhook")]
+    SvixWebhook {
+        path_id: String,
+        endpoint_secret: String,
+    },
+}
+
+impl ReceiverInputOpts {
+    pub fn path_id(&self) -> &str {
+        match self {
+            ReceiverInputOpts::Webhook { path_id, .. }
+            | ReceiverInputOpts::SvixWebhook { path_id, .. } => path_id,
+        }
+    }
+}
+
+// N.b. the codegen types we get from openapi don't impl Deserialize so we need our own version.
+#[derive(Debug, Default, Deserialize)]
+pub struct SvixOptions {
+    #[serde(default)]
+    pub debug: bool,
+    pub server_url: Option<String>,
+}
+
+impl From<SvixOptions> for _SvixOptions {
+    fn from(SvixOptions { debug, server_url }: SvixOptions) -> Self {
+        _SvixOptions { debug, server_url }
+    }
+}
+
+#[derive(Debug, Deserialize)]
+#[serde(tag = "type", rename_all = "lowercase")]
+pub enum SenderOutputOpts {
+    Svix(SvixSenderOutputOpts),
+}
+
+#[derive(Debug, Deserialize)]
+pub struct SvixSenderOutputOpts {
+    /// Svix API token for the client.
+    pub token: String,
+    /// Options for the Svix client.
+    #[serde(default)]
+    pub options: Option<SvixOptions>,
+}
diff --git a/bridge/svix-bridge.example.receivers.yaml b/bridge/svix-bridge.example.receivers.yaml
new file mode 100644
index 000000000..9afe95fd0
--- /dev/null
+++ b/bridge/svix-bridge.example.receivers.yaml
@@ -0,0 +1,110 @@
+# Svix Bridge Example Configuration
+
+# Set the log level for the service. Supported: error, info, warn, debug, trace. Default: info
+#log_level: "debug"
+
+# The log format that all output will follow. Supported: default, json
+#log_format: "json"
+
+# Optional: configures an OTEL exporter forwarding spans to the specified collector
+opentelemetry:
+  address: "http://localhost:1234"
+  sample_ratio: 0.5
+  # Optional: default "svix-bridge"
+  service_name: "my-bridge"
+
+
+# The host/port to bind to for incoming HTTP requests.
+# Optional: default "0.0.0.0:5000"
+# http_listen_address: "0.0.0.0:5000"
+
+# Receivers are HTTP endpoints that can have webhooks sent to them.
+# When a webhook is POST'ed to a matching URL, it is (optionally) verified,
+# (optionally) transformed via a js function, then forwarded to an "output."
+#
+# Inputs types are "webhook" which allows you to configure a verification scheme
+# (either "svix" or "none") or "svix-webhook" which is a shorthand version.
+#
+# ```
+#   input:
+#     type: "webhook"
+#     path_id: "long-hand"
+#     verification:
+#       type: "svix"
+#       endpoint_secret: "whsec_XXXXX="
+#   # same as...
+#   input:
+#     type: "svix-webhook"
+#     path_id: "shorthand"
+#     endpoint_secret: "whsec_XXXXX="
+# ```
+#
+# The `path_id` in webhook and svix-webhook inputs represents the trailing
+# path segment that will connect to the given output.
+# For example, running bridge with the HTTP listen address set to
+# `localhost:5000`, the above examples would map to the following URLS:
+# - http://localhost:5000/webhook/long-hand
+# - http://localhost:5000/webhook/shorthand
+#
+receivers:
+  - name: "forward-to-gcp-example"
+    input:
+      type: "webhook"
+      path_id: "gcp"
+      verification:
+        type: "svix"
+        endpoint_secret: "whsec_XXXXX="
+    # Optional - when unset, webhooks received will be forwarded to the output as-is.
+    transformation: |
+      function handler(input) {
+        let event_type = input.eventType;
+        delete input.eventType;
+        return { event_type, ...input };
+      }
+    output:
+      type: "gcp-pubsub"
+      topic: "example"
+      # Optional - falls back to env otherwise, eg.
+      # - `GOOGLE_APPLICATION_CREDENTIALS`
+      # - `GOOGLE_APPLICATION_CREDENTIALS_JSON`
+      credentials_file: "/path/to/creds.json"
+
+  - name: "forward-to-rabbitmq-example"
+    input:
+      type: "webhook"
+      path_id: "rabbit"
+      verification:
+        type: "svix"
+        endpoint_secret: "whsec_XXXXX="
+    output:
+      type: "rabbitmq"
+      uri: "amqp://guest:guest@localhost:5672/%2f"
+      exchange: ""
+      routing_key: "example"
+
+  - name: "forward-to-redis-example"
+    input:
+      type: "webhook"
+      path_id: "redis"
+      verification:
+        type: "svix"
+        endpoint_secret: "whsec_XXXXX="
+    output:
+      type: "redis"
+      dsn: "redis://localhost:1234"
+      max_connections: 4
+      queue_key: "my_queue"
+
+  - name: "forward-to-sqs-example"
+    input:
+      type: "webhook"
+      path_id: "sqs"
+      verification:
+        type: "none"
+    output:
+      # Note that the SQS forwarder requires credentials to be set as environment vars:
+      # - `AWS_DEFAULT_REGION`
+      # - `AWS_ACCESS_KEY_ID`
+      # - `AWS_SECRET_ACCESS_KEY`
+      type: "sqs"
+      queue_dsn: "https://aws.example.com/my-queue"
diff --git a/bridge/svix-bridge.example.senders.yaml b/bridge/svix-bridge.example.senders.yaml
new file mode 100644
index 000000000..c20b0cae8
--- /dev/null
+++ b/bridge/svix-bridge.example.senders.yaml
@@ -0,0 +1,135 @@
+# Svix Bridge Example Configuration
+
+# Set the log level for the service. Supported: error, info, warn, debug, trace. Default: info
+#log_level: "debug"
+
+# The log format that all output will follow. Supported: default, json
+#log_format: "json"
+
+# Optional: configures an OTEL exporter forwarding spans to the specified collector
+opentelemetry:
+  address: "http://localhost:1234"
+  sample_ratio: 0.5
+  # Optional: default "svix-bridge"
+  service_name: "my-bridge"
+
+
+# The host/port to bind to for incoming HTTP requests.
+# Optional: default "0.0.0.0:5000"
+# http_listen_address: "0.0.0.0:5000"
+
+
+# Senders consume JSON from their input, optionally transform, then forward to Svix.
+# Currently supported inputs are various message queue consumers while the sole
+# output is "svix" (which does a Create Message API request)
+senders:
+  # GCP Pub/Sub Consumer
+  - name: "gcp-example"
+    input:
+      type: "gcp-pubsub"
+      subscription_id: "my-subscription"
+      # Optional - will fallback to looking at env vars when left unset.
+      credentials_file: "/path/to/credentials.json"
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+  # RabbitMQ Consumer
+  - name: "rabbitmq-example"
+    input:
+      type: "rabbitmq"
+      # Required
+      uri: "amqp://guest:guest@localhost:5672/%2f"
+      # Required
+      queue_name: "my-queue"
+      # Optional (default: unset, managed by rabbitmq)
+      consumer_tag: "my-consumer-001"
+      # Optional: default true
+      requeue_on_nack: false
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+  # Redis Consumer
+  - name: "redis-example"
+    input:
+      type: "redis"
+      # Required
+      dsn: "redis://localhost:6379/"
+      # Required
+      queue_key: "my_queue"
+      # Required
+      consumer_name: "my_consumer"
+      # Required
+      consumer_group: "my_group"
+      # Required
+      max_connections: 4
+      # Optional: default true
+      reinsert_on_nack: true
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+  # SQS Consumer
+  # Also remember to set your AWS credentials in env vars to use this:
+  # - `AWS_DEFAULT_REGION`
+  # - `AWS_ACCESS_KEY_ID`
+  # - `AWS_SECRET_ACCESS_KEY`
+  - name: "sqs-example"
+    input:
+      type: "sqs"
+      # Required
+      queue_dsn: "http://localhost:19324/000000000000/local"
+      # Optional (default: false)
+      override_endpoint: true
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
diff --git a/bridge/svix-bridge/Cargo.toml b/bridge/svix-bridge/Cargo.toml
new file mode 100644
index 000000000..0b7749f4c
--- /dev/null
+++ b/bridge/svix-bridge/Cargo.toml
@@ -0,0 +1,47 @@
+[package]
+name = "svix-bridge"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+anyhow = "1"
+clap = { version = "4.2.4", features = ["env", "derive"] }
+axum = { version = "0.6", features = ["macros"] }
+enum_dispatch = "0.3"
+http = "0.2"
+hyper = { version = "0.14", features = ["full"] }
+lazy_static = "1.4"
+opentelemetry = { version = "0.18.0", features = ["rt-tokio"] }
+opentelemetry-http = "0.7.0"
+opentelemetry-otlp = { version = "0.11.0", features = ["metrics", "grpc-tonic", "http-proto", "reqwest-client"] }
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+serde_yaml = "0.9"
+svix-ksuid = "0.7.0"
+svix-bridge-plugin-queue = { optional=true, path = "../svix-bridge-plugin-queue" }
+svix-bridge-types = { path = "../svix-bridge-types" }
+threadpool = "1"
+tokio = { version = "1", features = ["full"] }
+tower-http = { version = "0.3", features = ["trace"] }
+tracing = "0.1"
+tracing-opentelemetry = "0.18.0"
+tracing-subscriber = { version="0.3", features=["env-filter", "fmt", "json"] }
+
+[dependencies.deno_core]
+# tagged deno@1.23.3 (does not seem to leak) though quite old.
+version = "0.142.0"
+
+[dev-dependencies]
+chrono = "0.4"
+tower = "0.4"
+
+[features]
+default = ["gcp-pubsub", "rabbitmq", "redis", "sqs"]
+
+gcp-pubsub = ["generic-queue"]
+generic-queue = ["dep:svix-bridge-plugin-queue"]
+rabbitmq = ["generic-queue"]
+redis = ["generic-queue"]
+sqs = ["generic-queue"]
diff --git a/bridge/svix-bridge/LICENSE b/bridge/svix-bridge/LICENSE
new file mode 100644
index 000000000..954e47172
--- /dev/null
+++ b/bridge/svix-bridge/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2021-2023 Svix Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/bridge/svix-bridge/src/config/mod.rs b/bridge/svix-bridge/src/config/mod.rs
new file mode 100644
index 000000000..5e354939b
--- /dev/null
+++ b/bridge/svix-bridge/src/config/mod.rs
@@ -0,0 +1,130 @@
+use serde::Deserialize;
+use std::net::SocketAddr;
+use svix_bridge_plugin_queue::config::{
+    into_receiver_output, QueueConsumerConfig, ReceiverOutputOpts as QueueOutOpts,
+};
+use svix_bridge_types::{ReceiverInputOpts, ReceiverOutput, SenderInput};
+use tracing::Level;
+
+#[derive(Deserialize)]
+#[serde(deny_unknown_fields)]
+pub struct Config {
+    #[serde(default)]
+    pub senders: Vec<SenderConfig>,
+    #[serde(default)]
+    pub receivers: Vec<ReceiverConfig>,
+    /// The log level to run the service with. Supported: info, debug, trace
+    #[serde(default)]
+    pub log_level: LogLevel,
+    /// The log format that all output will follow. Supported: default, json
+    #[serde(default)]
+    pub log_format: LogFormat,
+    /// OpenTelemetry exporter settings
+    #[serde(default)]
+    pub opentelemetry: Option<OtelExporterConfig>,
+    #[serde(default = "default_http_listen_address")]
+    pub http_listen_address: SocketAddr,
+}
+
+fn default_http_listen_address() -> SocketAddr {
+    "0.0.0.0:5000".parse().expect("default http listen address")
+}
+
+#[derive(Deserialize)]
+pub struct OtelExporterConfig {
+    /// The OpenTelemetry service name to use
+    pub service_name: Option<String>,
+    /// The OpenTelemetry address to send events to if given.
+    pub address: String,
+    /// The ratio at which to sample spans when sending to OpenTelemetry. When not given it defaults
+    /// to always sending. If the OpenTelemetry address is not set, this will do nothing.
+    pub sample_ratio: Option<f64>,
+}
+
+#[derive(Clone, Debug, Default, Deserialize)]
+#[serde(rename_all = "lowercase")]
+pub enum LogLevel {
+    #[default]
+    Info,
+    Debug,
+    Trace,
+}
+
+impl ToString for LogLevel {
+    fn to_string(&self) -> String {
+        match self {
+            Self::Info => Level::INFO,
+            Self::Debug => Level::DEBUG,
+            Self::Trace => Level::TRACE,
+        }
+        .to_string()
+    }
+}
+
+#[derive(Clone, Debug, Default, Deserialize)]
+#[serde(rename_all = "lowercase")]
+pub enum LogFormat {
+    #[default]
+    Default,
+    Json,
+}
+
+#[derive(Deserialize)]
+#[serde(untagged)]
+pub enum SenderConfig {
+    #[cfg(any(
+        feature = "gcp-pubsub",
+        feature = "rabbitmq",
+        feature = "redis",
+        feature = "sqs"
+    ))]
+    QueueConsumer(QueueConsumerConfig),
+}
+
+impl From<SenderConfig> for Box<dyn SenderInput> {
+    fn from(value: SenderConfig) -> Self {
+        match value {
+            #[cfg(any(
+                feature = "gcp-pubsub",
+                feature = "rabbitmq",
+                feature = "redis",
+                feature = "sqs"
+            ))]
+            SenderConfig::QueueConsumer(backend) => backend.into_sender_input(),
+        }
+    }
+}
+
+#[derive(Deserialize)]
+pub struct ReceiverConfig {
+    pub name: String,
+    pub input: ReceiverInputOpts,
+    #[serde(default)]
+    pub transformation: Option<String>,
+    pub output: ReceiverOut,
+}
+
+#[derive(Deserialize)]
+#[serde(untagged)]
+pub enum ReceiverOut {
+    #[cfg(any(
+        feature = "gcp-pubsub",
+        feature = "rabbitmq",
+        feature = "redis",
+        feature = "sqs"
+    ))]
+    QueueProducer(QueueOutOpts),
+}
+
+impl ReceiverConfig {
+    pub async fn into_receiver_output(self) -> std::io::Result<Box<dyn ReceiverOutput>> {
+        match self.output {
+            ReceiverOut::QueueProducer(x) => into_receiver_output(self.name.clone(), x)
+                .await
+                .map_err(Into::into),
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/bridge/svix-bridge/src/main.rs b/bridge/svix-bridge/src/main.rs
new file mode 100644
index 000000000..74613dc97
--- /dev/null
+++ b/bridge/svix-bridge/src/main.rs
@@ -0,0 +1,229 @@
+use self::config::Config;
+use clap::Parser;
+use lazy_static::lazy_static;
+use opentelemetry::runtime::Tokio;
+use opentelemetry_otlp::WithExportConfig;
+use std::io::{Error, ErrorKind, Result};
+use std::path::PathBuf;
+use std::time::Duration;
+use svix_bridge_types::{SenderInput, TransformerJob};
+use svix_ksuid::{KsuidLike as _, KsuidMs};
+use tracing_subscriber::prelude::*;
+
+mod config;
+mod runtime;
+mod webhook_receiver;
+
+lazy_static! {
+    // Seems like it would be useful to be able to configure this.
+    // In some docker setups, hostname is sometimes the container id, and advertising this can be
+    // helpful.
+    pub static ref INSTANCE_ID: String = KsuidMs::new(None, None).to_string();
+}
+
+fn get_svc_identifiers(cfg: &Config) -> opentelemetry::sdk::Resource {
+    opentelemetry::sdk::Resource::new(vec![
+        opentelemetry::KeyValue::new(
+            "service.name",
+            cfg.opentelemetry
+                .as_ref()
+                .and_then(|x| x.service_name.as_deref())
+                .unwrap_or("svix-bridge")
+                .to_owned(),
+        ),
+        opentelemetry::KeyValue::new("instance_id", INSTANCE_ID.to_owned()),
+    ])
+}
+
+fn setup_tracing(cfg: &Config) {
+    if std::env::var_os("RUST_LOG").is_none() {
+        const CRATE_NAME: &str = env!("CARGO_CRATE_NAME");
+        let level = cfg.log_level.to_string();
+        let var = vec![
+            format!("{CRATE_NAME}={level}"),
+            // XXX: Assuming this applies to the Producer side (aka `og-ingester`) when we fold it back in.
+            format!("tower_http={level}"),
+        ];
+        std::env::set_var("RUST_LOG", var.join(","));
+    }
+
+    let otel_layer = cfg.opentelemetry.as_ref().map(|otel_cfg| {
+        // Configure the OpenTelemetry tracing layer
+        opentelemetry::global::set_text_map_propagator(
+            opentelemetry::sdk::propagation::TraceContextPropagator::new(),
+        );
+
+        let exporter = opentelemetry_otlp::new_exporter()
+            .tonic()
+            .with_endpoint(&otel_cfg.address);
+
+        let tracer = opentelemetry_otlp::new_pipeline()
+            .tracing()
+            .with_exporter(exporter)
+            .with_trace_config(
+                opentelemetry::sdk::trace::config()
+                    .with_sampler(
+                        otel_cfg
+                            .sample_ratio
+                            .map(opentelemetry::sdk::trace::Sampler::TraceIdRatioBased)
+                            .unwrap_or(opentelemetry::sdk::trace::Sampler::AlwaysOn),
+                    )
+                    .with_resource(get_svc_identifiers(cfg)),
+            )
+            .install_batch(Tokio)
+            .unwrap();
+
+        tracing_opentelemetry::layer().with_tracer(tracer)
+    });
+
+    // Then initialize logging with an additional layer printing to stdout. This additional layer is
+    // either formatted normally or in JSON format
+    // Fails if the subscriber was already initialized, which we can safely and silently ignore.
+    let _ = match cfg.log_format {
+        config::LogFormat::Default => {
+            let stdout_layer = tracing_subscriber::fmt::layer();
+            tracing_subscriber::Registry::default()
+                .with(otel_layer)
+                .with(stdout_layer)
+                .with(tracing_subscriber::EnvFilter::from_default_env())
+                .try_init()
+        }
+        config::LogFormat::Json => {
+            let fmt = tracing_subscriber::fmt::format().json().flatten_event(true);
+            let json_fields = tracing_subscriber::fmt::format::JsonFields::new();
+
+            let stdout_layer = tracing_subscriber::fmt::layer()
+                .event_format(fmt)
+                .fmt_fields(json_fields);
+
+            tracing_subscriber::Registry::default()
+                .with(otel_layer)
+                .with(stdout_layer)
+                .with(tracing_subscriber::EnvFilter::from_default_env())
+                .try_init()
+        }
+    };
+}
+
+async fn supervise_senders(inputs: Vec<Box<dyn SenderInput>>) -> Result<()> {
+    let mut set = tokio::task::JoinSet::new();
+    for input in inputs {
+        set.spawn(async move {
+            // FIXME: needs much better signaling for termination
+            loop {
+                let fut = input.run();
+                // If this future returns, the consumer terminated unexpectedly.
+                if let Err(e) = fut.await {
+                    tracing::warn!(
+                        "sender input {} unexpectedly terminated: {}",
+                        input.name(),
+                        e
+                    );
+                } else {
+                    tracing::warn!("sender input {} unexpectedly terminated", input.name());
+                }
+                tokio::time::sleep(Duration::from_secs(1)).await;
+            }
+        });
+    }
+
+    // FIXME: add signal handling to trigger a (intentional) graceful shutdown.
+
+    // FIXME: when a plugin exits unexpectedly, what do?
+    //   Most consumers are probably stateful/brittle and may disconnect from time to time.
+    //   Ideally none of these tasks would ever return Ok or Err. They'd run forever.
+    //   Having the tasks themselves try to recover means if we see a task finish here, something
+    //   must be really wrong, so maybe we trigger a shutdown of the rest when one stops here.
+    while let Some(_res) = set.join_next().await {
+        // In order for plugins to coordinate a shutdown, maybe they could:
+        // - have a shutdown method and handle their own internal signalling, or maybe
+        // - take a oneshot channel as an arg to `run()`
+        // Basically we need something that formalizes the shutdown flow in a cross-crate
+        // friendly way.
+        todo!("graceful shutdown");
+    }
+    Ok(())
+}
+
+#[derive(Parser)]
+pub struct Args {
+    #[arg(short, long, env = "SVIX_BRIDGE_CFG")]
+    cfg: Option<PathBuf>,
+}
+
+#[tokio::main]
+async fn main() -> Result<()> {
+    let args = Args::parse();
+
+    let config = args.cfg.unwrap_or_else(|| {
+        std::env::current_dir()
+            .expect("current dir")
+            .join("svix-bridge.yaml")
+    });
+    let cfg: Config = serde_yaml::from_str(&std::fs::read_to_string(&config).map_err(|e| {
+        let p = config.into_os_string().into_string().expect("config path");
+        Error::new(ErrorKind::Other, format!("Failed to read {p}: {e}"))
+    })?)
+    .map_err(|e| Error::new(ErrorKind::Other, format!("Failed to parse config: {}", e)))?;
+    setup_tracing(&cfg);
+
+    tracing::info!("starting");
+
+    let (xform_tx, mut xform_rx) = tokio::sync::mpsc::unbounded_channel::<TransformerJob>();
+
+    // XXX: this is a bit nasty, but might be okay to start.
+    // The nested spawns are needed to make sure we can saturate the
+    // threadpool (otherwise we'd run each job serially).
+    //
+    // Another approach would be to do what og-ingester did: give each plugin a clone of the
+    // `TpHandle`, but this would likely mean moving the runtime module over to the `-types` crate.
+    // I'd rather not do this, mostly to help keep things more unit test friendly; channels can
+    // help keep the coupling more loose, with less stateful baggage.
+    // Starting with this just to keep the JS executor stuff here in the binary.
+    tokio::spawn(async move {
+        let tp = runtime::TpHandle::new();
+        while let Some(TransformerJob {
+            payload,
+            script,
+            callback_tx,
+        }) = xform_rx.recv().await
+        {
+            let tp = tp.clone();
+            tokio::spawn(async move {
+                let out = tp.run_script(payload.into(), script).await;
+                if callback_tx
+                    .send(out.map_err(|e| tracing::error!("{}", e)))
+                    .is_err()
+                {
+                    // If the callback fails, the plugin is likely unwinding/dropping.
+                    // Not a whole lot we can do about that.
+                    tracing::error!("failed to send js output back to caller");
+                }
+            });
+        }
+    });
+
+    let mut senders = Vec::with_capacity(cfg.senders.len());
+    for sc in cfg.senders {
+        let mut sender: Box<dyn SenderInput> = sc.into();
+        sender.set_transformer(Some(xform_tx.clone()));
+        senders.push(sender);
+    }
+    if senders.is_empty() {
+        tracing::warn!("No senders configured.")
+    }
+    let senders_fut = supervise_senders(senders);
+
+    if cfg.receivers.is_empty() {
+        tracing::warn!("No receivers configured.")
+    }
+    let receivers_fut = webhook_receiver::run(cfg.http_listen_address, cfg.receivers, xform_tx);
+
+    match tokio::try_join!(senders_fut, receivers_fut) {
+        Ok(_) => tracing::error!("unexpectedly exiting"),
+        Err(e) => tracing::error!("unexpectedly exiting: {}", e),
+    }
+
+    tracing::info!("exiting...");
+    Ok(())
+}
diff --git a/bridge/svix-bridge/src/runtime/mod.rs b/bridge/svix-bridge/src/runtime/mod.rs
new file mode 100644
index 000000000..fdcc10608
--- /dev/null
+++ b/bridge/svix-bridge/src/runtime/mod.rs
@@ -0,0 +1,49 @@
+use anyhow::Result;
+use std::sync::Arc;
+
+use deno_core::{anyhow, serde_v8, v8, JsRuntime};
+use svix_bridge_types::{JsObject, JsReturn};
+use threadpool::ThreadPool;
+use tokio::sync::{oneshot, Mutex};
+
+#[derive(Clone, Debug)]
+pub struct TpHandle(pub Arc<Mutex<ThreadPool>>);
+
+impl TpHandle {
+    pub fn new() -> Self {
+        Self(Arc::new(Mutex::new(ThreadPool::default())))
+    }
+
+    pub async fn run_script(&self, input: serde_json::Value, script: String) -> Result<JsReturn> {
+        let (tx, rx) = oneshot::channel();
+
+        self.0.lock().await.execute(move || {
+            let _ = tx.send(run_script_inner(&input, script));
+        });
+
+        rx.await?
+    }
+}
+
+fn run_script_inner(input: &serde_json::Value, script: String) -> Result<JsReturn> {
+    let mut runtime = JsRuntime::new(Default::default());
+    let res = runtime.execute_script(
+        "<anon>",
+        &format!("{script}\nhandler({})", serde_json::to_string(input)?),
+    );
+    match res {
+        Ok(global) => {
+            let scope = &mut runtime.handle_scope();
+            let local = v8::Local::new(scope, global);
+            match serde_v8::from_v8::<JsObject>(scope, local) {
+                Ok(v) => Ok(JsReturn::Object(v)),
+                Err(serde_v8::Error::ExpectedObject) => Ok(JsReturn::Invalid),
+                Err(e) => Err(e)?,
+            }
+        }
+        Err(err) => Err(anyhow::format_err!("Evaling error: {:?}", err)),
+    }
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/bridge/svix-bridge/src/webhook_receiver/config.rs b/bridge/svix-bridge/src/webhook_receiver/config.rs
new file mode 100644
index 000000000..34202968f
--- /dev/null
+++ b/bridge/svix-bridge/src/webhook_receiver/config.rs
@@ -0,0 +1,16 @@
+use crate::config::ReceiverConfig;
+use serde::Deserialize;
+use svix_bridge_types::WebhookVerifier;
+
+/// The [`IntegrationConfig`] is the struct associated with a given [`IntegrationId`]. When the route
+/// associated with an [`IntegrationId`] receives a webhook, or any other HTTP request, then it will
+/// attempt to be validated with the specified [`VerificationScheme`]. Should the configured scheme
+/// indicate that the webhook is valid, then the webhook will be forwarded verbatim to the configured
+/// [`ForwardDestination`].
+#[derive(Deserialize)]
+pub struct IntegrationConfig {
+    pub receiver_cfg: ReceiverConfig,
+    pub verification: WebhookVerifier,
+    #[serde(default)]
+    pub transformation: Option<String>,
+}
diff --git a/bridge/svix-bridge/src/webhook_receiver/mod.rs b/bridge/svix-bridge/src/webhook_receiver/mod.rs
new file mode 100644
index 000000000..2fb49efaf
--- /dev/null
+++ b/bridge/svix-bridge/src/webhook_receiver/mod.rs
@@ -0,0 +1,136 @@
+use crate::config::ReceiverConfig;
+use axum::{
+    body::Body,
+    extract::{Path, State},
+    routing::post,
+    Router,
+};
+use std::net::SocketAddr;
+use svix_bridge_types::{JsObject, JsReturn, TransformerJob, TransformerTx};
+use tracing::instrument;
+use types::{IntegrationId, IntegrationState, InternalState, SerializableRequest, Unvalidated};
+
+mod config;
+mod types;
+mod verification;
+
+fn router() -> Router<InternalState, Body> {
+    Router::new()
+        .route(
+            "/webhook/:integration_id",
+            post(route).put(route).get(route).patch(route),
+        )
+        .route(
+            "/webhook/:integration_id/",
+            post(route).put(route).get(route).patch(route),
+        )
+}
+
+pub async fn run(
+    listen_addr: SocketAddr,
+    routes: Vec<ReceiverConfig>,
+    transformer_tx: TransformerTx,
+) -> std::io::Result<()> {
+    let state = InternalState::from_receiver_configs(routes, transformer_tx)
+        .await
+        .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?;
+
+    let router = router().with_state(state);
+
+    tracing::info!("Listening on: {listen_addr}");
+    axum::Server::bind(&listen_addr)
+        .serve(router.into_make_service())
+        .await
+        .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))
+}
+
+#[instrument(
+    skip_all,
+    level="error",
+    fields(
+        integration_id=integration_id.as_ref(),
+    )
+)]
+async fn route(
+    Path(integration_id): Path<IntegrationId>,
+    State(InternalState {
+        routes,
+        transformer_tx,
+    }): State<InternalState>,
+    req: SerializableRequest<Unvalidated>,
+) -> http::StatusCode {
+    if let Some(IntegrationState {
+        verifier,
+        output,
+        transformation,
+    }) = routes.get(&integration_id)
+    {
+        match req.validate(verifier).await {
+            Ok(req) => {
+                let payload = match req.payload().as_js_object() {
+                    Ok(payload) => match transformation.clone() {
+                        Some(script) => {
+                            match transform(payload, script, transformer_tx.clone()).await {
+                                Ok(transformed_payload) => transformed_payload,
+                                Err(c) => return c,
+                            }
+                        }
+                        // Keep the original payload as-is if there's no transformation specified.
+                        None => payload,
+                    },
+                    Err(e) => {
+                        tracing::error!("failed to parse payload as json object: {}", e);
+                        return http::StatusCode::BAD_REQUEST;
+                    }
+                };
+
+                tracing::debug!("forwarding request");
+
+                match output.handle(payload).await {
+                    Ok(_) => http::StatusCode::NO_CONTENT,
+                    Err(e) => {
+                        tracing::error!("Error forwarding request: {}", e);
+                        http::StatusCode::INTERNAL_SERVER_ERROR
+                    }
+                }
+            }
+            Err(code) => {
+                tracing::warn!("validation failed: {code}");
+                code
+            }
+        }
+    } else {
+        tracing::trace!("integration not found");
+        http::StatusCode::NOT_FOUND
+    }
+}
+
+/// Attempts to run the payload through a js transformation.
+async fn transform(
+    payload: JsObject,
+    script: String,
+    tx: TransformerTx,
+) -> Result<JsObject, http::StatusCode> {
+    let (job, callback) = TransformerJob::new(script.clone(), payload);
+    if let Err(e) = tx.send(job) {
+        tracing::error!("transformations are not available: {}", e);
+        return Err(http::StatusCode::INTERNAL_SERVER_ERROR);
+    }
+
+    match callback.await {
+        // This is the only "good" outcome giving a RHS value for the assignment.
+        // All other match arms should bail with a non-2xx status.
+        Ok(Ok(JsReturn::Object(obj))) => Ok(obj),
+        Ok(Ok(JsReturn::Invalid)) => {
+            tracing::error!("transformation produced invalid payload");
+            Err(http::StatusCode::INTERNAL_SERVER_ERROR)
+        }
+        _ => {
+            tracing::error!("transformation failed");
+            Err(http::StatusCode::INTERNAL_SERVER_ERROR)
+        }
+    }
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/bridge/svix-bridge/src/webhook_receiver/types.rs b/bridge/svix-bridge/src/webhook_receiver/types.rs
new file mode 100644
index 000000000..cf932552e
--- /dev/null
+++ b/bridge/svix-bridge/src/webhook_receiver/types.rs
@@ -0,0 +1,381 @@
+use super::verification::{NoVerifier, SvixVerifier, VerificationMethod, Verifier};
+use crate::config::ReceiverConfig;
+use anyhow::Result;
+use axum::{
+    async_trait,
+    body::{Bytes, HttpBody},
+    extract::FromRequest,
+    BoxError,
+};
+use http::{HeaderMap, HeaderValue, Request};
+use serde::{Deserialize, Serialize};
+use std::{collections::HashMap, marker::PhantomData, sync::Arc};
+use svix_bridge_types::{
+    svix, JsObject, ReceiverInputOpts, ReceiverOutput, TransformerTx, WebhookVerifier,
+};
+
+#[derive(Clone)]
+/// The [`InternalState`] is passed to the Axum route and is used to map the "IntegrationId" in the
+/// URL to the configured [`Verifier`] and [`Forwarder`] variants.
+pub struct InternalState {
+    pub routes: Arc<HashMap<IntegrationId, IntegrationState>>,
+    pub transformer_tx: TransformerTx,
+}
+
+impl InternalState {
+    /// For most production use cases, favor [`InternalState::from_receiver_configs`].
+    /// Mostly this is an escape hatch to help with testing.
+    ///
+    /// Constructs an [`InternalState`] from a raw mapping of [`IntegrationId`] to
+    /// [`IntegrationState`], allowing us to bypass all the config parsing machinery.
+    ///
+    /// By skipping the config parsing, we can provide custom (i.e. not exposed through the public
+    /// config) [`ReceiverOutput`] implementations.
+    pub fn new(
+        state_map: HashMap<IntegrationId, IntegrationState>,
+        transformer_tx: TransformerTx,
+    ) -> Self {
+        InternalState {
+            routes: Arc::new(state_map),
+            transformer_tx,
+        }
+    }
+
+    pub async fn from_receiver_configs(
+        routes: Vec<ReceiverConfig>,
+        transformer_tx: TransformerTx,
+    ) -> Result<Self> {
+        let mut state_map = HashMap::new();
+
+        for cfg in routes {
+            let verifier = match &cfg.input {
+                ReceiverInputOpts::Webhook {
+                    verification: WebhookVerifier::Svix { endpoint_secret },
+                    ..
+                }
+                | ReceiverInputOpts::SvixWebhook {
+                    endpoint_secret, ..
+                } => SvixVerifier::new(Arc::new(
+                    svix::webhooks::Webhook::new(endpoint_secret).expect("Invalid Svix secret"),
+                ))
+                .into(),
+                ReceiverInputOpts::Webhook {
+                    verification: WebhookVerifier::None,
+                    ..
+                } => NoVerifier.into(),
+            };
+
+            state_map.insert(
+                IntegrationId(cfg.input.path_id().to_string()),
+                IntegrationState {
+                    verifier,
+                    transformation: cfg.transformation.clone(),
+                    output: Arc::new(cfg.into_receiver_output().await?),
+                },
+            );
+        }
+
+        Ok(InternalState::new(state_map, transformer_tx))
+    }
+}
+
+/// Each [`IntegrationId`] is a valid route for webhooks to be dispatched to managed by this server,
+/// and each [`IntegrationId`] has an associated configuration which defines how the webhook is
+/// verified (the [`VerificationScheme`]) and where the webhook is routed to once it is verified
+/// (the [`ForwardDestination`]).
+///
+/// Internally it is also associated with an [`IntegrationState`] which will contain the necessary
+/// members to actually perform these actions eg. a handle to a [`FutureProducer`] instead of simply
+/// the address(es) of the Kafka bootstrap server(s).
+///
+/// This type is simply a wrapper for a [`String`] which *should* be safe to use in a URL. If it is
+/// not a valid path component for a URL, then the [`IntegrationId`] will never receive any
+/// webhooks. However, for simplicity, the inner [`String`] is not validated for URL-safety at this
+/// time.
+#[repr(transparent)]
+#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
+pub struct IntegrationId(String);
+
+impl From<String> for IntegrationId {
+    fn from(value: String) -> Self {
+        IntegrationId(value)
+    }
+}
+
+impl From<&str> for IntegrationId {
+    fn from(value: &str) -> Self {
+        IntegrationId(value.to_string())
+    }
+}
+
+impl AsRef<str> for IntegrationId {
+    fn as_ref(&self) -> &str {
+        &self.0
+    }
+}
+
+/// The [`IntegrationState`] is a struct which is only able to be created via conversion from a
+/// [`IntegrationConfig`]. This struct is what is associated with an `[IntegrationId`] internally
+/// after the configuration has been read.
+///
+/// What distinguishes it from the [`IntegrationConfig`] is that it contains the necessary members
+/// for validating and forwarding a webhook instead of just containing the definition of how to
+/// derive these necessary members.
+#[derive(Clone)]
+pub struct IntegrationState {
+    pub verifier: Verifier,
+    pub output: Arc<Box<dyn ReceiverOutput>>,
+    pub transformation: Option<String>,
+}
+
+/// The [`RequestFromParts`] is a structure consisting of all relevant parts of the HTTP request to
+/// be validated by a [`Verifier`] implementor. This is to be immediately converted into the struct
+/// [`SerializableRequest<Unvalidated>`] via its [`FromRequest`] implementation.
+///
+/// NOTE: This struct is never to be used directly unless by proxy of the aforementioned impl of
+/// [`FromRequest`]. It's simply used as any easy way to implement [`FromRequest`] via a macro .
+#[derive(Clone, Debug, FromRequest)]
+pub struct RequestFromParts {
+    headers: HeaderMap,
+    payload: Bytes,
+}
+
+/// A simple marker trait to denote the state of a [`SerializableRequest`]. The only way to publicly
+/// construct any [`SerializableRequest<Validated>`]s  is via the associated method on unvalidated
+/// request's, [`SerializableRequest<Unvalidated>::validate`].
+pub trait RequestState {}
+
+#[derive(Clone, Copy, Debug)]
+pub struct Unvalidated;
+impl RequestState for Unvalidated {}
+
+#[derive(Clone, Copy, Debug)]
+pub struct Validated;
+impl RequestState for Validated {}
+
+/// This intermediary representation is necessary because it is preferable to serialize the headers
+/// and/or body as a [`String`] over bytes when dealing with some [`VerificationMethod`]s and some
+/// [`ForwardingMethod`]s. This struct represents both the headers and body as enums which allow for
+/// either textual representations or byte representations when [`Serialize`]d via [`serde`].
+///
+/// On trying to convert a [`Standard`] variant into a [`StringSerializable`] variant, HTTP headers
+/// will be represented textually if and only if they are completely ASCII, while any bodies will
+/// attempt to be read as UTF-8 before falling back to bytes.
+///
+/// NOTE: This conversion *should* be lazy. The [`String`] variant are only acceptable in a subset
+/// of all cases, so lazy-conversion will prevent needless conversion back and forth. You may check
+/// whether the conversion is required and/or helpful with [`VerificationMethod::want_string_rep`]
+/// or [`VerificationMethod::need_string_rep`] plus the [`ForwardingMethod`] equivalents.
+///
+/// The intended course of action is to attempt to convert to string-serializable variants of the
+/// header map and the body immediately if either of the aforementioned methods are true --  but
+/// only returning an [`Err`] response if it *needs* it. Then, if the validation is a success (see
+/// [`SerializableRequest<Unvalidated>::validate`] and a validated equivalent is returned, then the
+/// same checks are to be performed, but with the [`ForwardingMethod`] methods before being sent to
+/// the appropriate [`ForwardingMethod`] implementor.
+#[derive(Clone, Debug, Serialize)]
+pub struct SerializableRequest<S: RequestState> {
+    headers: SerializableHeaderMap,
+    payload: SerializablePayload,
+
+    #[serde(skip)]
+    _pd: PhantomData<S>,
+}
+
+impl<S: RequestState> SerializableRequest<S> {
+    pub fn headers(&self) -> &SerializableHeaderMap {
+        &self.headers
+    }
+
+    pub fn payload(&self) -> &SerializablePayload {
+        &self.payload
+    }
+}
+
+impl From<RequestFromParts> for SerializableRequest<Unvalidated> {
+    fn from(value: RequestFromParts) -> Self {
+        Self {
+            headers: SerializableHeaderMap::Standard(value.headers),
+            payload: SerializablePayload::Standard(value.payload.to_vec()),
+
+            _pd: PhantomData,
+        }
+    }
+}
+
+#[async_trait]
+impl<S, B> FromRequest<S, B> for SerializableRequest<Unvalidated>
+where
+    S: Send + Sync,
+    B: HttpBody + Send + Sync + 'static,
+    B::Data: Send,
+    B::Error: Into<BoxError>,
+{
+    type Rejection = <RequestFromParts as FromRequest<S, B>>::Rejection;
+
+    async fn from_request(req: Request<B>, state: &S) -> Result<Self, Self::Rejection> {
+        RequestFromParts::from_request(req, state)
+            .await
+            .map(Into::into)
+    }
+}
+
+impl SerializableRequest<Unvalidated> {
+    /// Given a specific validator
+    pub async fn validate<V: VerificationMethod>(
+        mut self,
+        verifier: &V,
+    ) -> Result<SerializableRequest<Validated>, http::StatusCode> {
+        // Do relevant conversions to [`String`] representations if wanted/needed
+        match (verifier.want_string_rep(), verifier.need_string_rep()) {
+            // Needed
+            (true, true) | (false, true) => {
+                self.headers = self
+                    .headers
+                    .try_to_string()
+                    .map_err(|_| http::StatusCode::BAD_REQUEST)?;
+                self.payload = self
+                    .payload
+                    .try_to_string()
+                    .map_err(|_| http::StatusCode::BAD_REQUEST)?;
+            }
+
+            // Wanted, but not needed
+            (true, false) => {
+                self.headers = match self.headers.try_to_string() {
+                    Ok(h) => h,
+                    Err(h) => h,
+                };
+
+                self.payload = match self.payload.try_to_string() {
+                    Ok(p) => p,
+                    Err(p) => p,
+                };
+            }
+
+            // Not wanted
+            (false, false) => {}
+        };
+
+        // FIXME: No cloning
+        // Then actually use the [`VerificationMethod`] implementor.
+        match verifier.validate(self.clone()).await {
+            Ok(true) => Ok(SerializableRequest::<Validated> {
+                headers: self.headers,
+                payload: self.payload,
+
+                _pd: PhantomData,
+            }),
+
+            Ok(false) => {
+                // FIXME: Read config to know whether to log
+                Err(http::StatusCode::BAD_REQUEST)
+            }
+
+            Err(e) => {
+                tracing::error!("Error validating request: {}", e);
+                Err(http::StatusCode::INTERNAL_SERVER_ERROR)
+            }
+        }
+    }
+}
+
+#[derive(Clone, Debug)]
+pub enum SerializableHeaderMap {
+    Standard(HeaderMap),
+    StringSerializable(HashMap<String, String>),
+}
+
+impl<'a> IntoIterator for &'a SerializableHeaderMap {
+    type Item = (&'a str, &'a [u8]);
+    type IntoIter = SerializableHeaderMapIter<'a>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        match self {
+            SerializableHeaderMap::Standard(hm) => SerializableHeaderMapIter::HeaderMap(hm.iter()),
+            SerializableHeaderMap::StringSerializable(hm) => {
+                SerializableHeaderMapIter::HashMap(hm.iter())
+            }
+        }
+    }
+}
+
+impl SerializableHeaderMap {
+    pub fn try_to_string(self) -> Result<Self, Self> {
+        match self {
+            Self::Standard(header_map) => Ok(Self::StringSerializable(
+                header_map
+                    .iter()
+                    .map(|(name, value)| Ok((name.as_str().to_owned(), value.to_str()?.to_owned())))
+                    .collect::<Result<HashMap<String, String>>>()
+                    .map_err(|_| Self::Standard(header_map))?,
+            )),
+            Self::StringSerializable(hash_map) => Ok(Self::StringSerializable(hash_map)),
+        }
+    }
+
+    pub fn len(&self) -> usize {
+        match self {
+            Self::Standard(m) => m.len(),
+            Self::StringSerializable(m) => m.len(),
+        }
+    }
+}
+
+/// Serialize is not implemented on [`HeaderMap`]s themselves, so custom serialization is required.
+impl Serialize for SerializableHeaderMap {
+    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+    where
+        S: serde::Serializer,
+    {
+        match self {
+            Self::Standard(header_map) => header_map
+                .iter()
+                .map(|(name, value)| (name.as_str().to_owned(), value.as_bytes().to_vec()))
+                .collect::<HashMap<String, Vec<u8>>>()
+                .serialize(serializer),
+            Self::StringSerializable(hash_map) => hash_map.serialize(serializer),
+        }
+    }
+}
+
+pub enum SerializableHeaderMapIter<'a> {
+    HeaderMap(http::header::Iter<'a, HeaderValue>),
+    HashMap(std::collections::hash_map::Iter<'a, String, String>),
+}
+
+impl<'a> Iterator for SerializableHeaderMapIter<'a> {
+    type Item = (&'a str, &'a [u8]);
+
+    fn next(&mut self) -> Option<Self::Item> {
+        match self {
+            Self::HeaderMap(hm) => hm.next().map(|(k, v)| (k.as_str(), v.as_bytes())),
+            Self::HashMap(hm) => hm.next().map(|(k, v)| (k.as_str(), v.as_bytes())),
+        }
+    }
+}
+
+#[derive(Clone, Debug, Serialize)]
+#[serde(untagged)]
+pub enum SerializablePayload {
+    Standard(Vec<u8>),
+    StringSerializable(String),
+}
+
+impl SerializablePayload {
+    fn try_to_string(self) -> Result<Self, Self> {
+        match self {
+            Self::Standard(v) => Ok(Self::StringSerializable(
+                String::from_utf8(v).map_err(|e| Self::Standard(e.into_bytes()))?,
+            )),
+            Self::StringSerializable(s) => Ok(Self::StringSerializable(s)),
+        }
+    }
+
+    pub fn as_js_object(&self) -> Result<JsObject> {
+        Ok(match self {
+            Self::Standard(v) => serde_json::from_slice(v)?,
+            Self::StringSerializable(s) => serde_json::from_str(s)?,
+        })
+    }
+}
diff --git a/bridge/svix-bridge/src/webhook_receiver/verification.rs b/bridge/svix-bridge/src/webhook_receiver/verification.rs
new file mode 100644
index 000000000..ce5dcb532
--- /dev/null
+++ b/bridge/svix-bridge/src/webhook_receiver/verification.rs
@@ -0,0 +1,125 @@
+use super::types::{SerializableHeaderMap, SerializablePayload, SerializableRequest, Unvalidated};
+use anyhow::Result;
+use axum::async_trait;
+use enum_dispatch::enum_dispatch;
+use std::sync::Arc;
+use svix_bridge_types::svix::webhooks::Webhook;
+
+#[async_trait]
+#[enum_dispatch]
+pub trait VerificationMethod {
+    async fn validate(&self, req: SerializableRequest<Unvalidated>) -> Result<bool>;
+
+    fn want_string_rep(&self) -> bool {
+        false
+    }
+    fn need_string_rep(&self) -> bool {
+        false
+    }
+}
+
+#[derive(Clone)]
+pub struct SvixVerifier {
+    webhook: Arc<Webhook>,
+}
+
+impl SvixVerifier {
+    pub fn new(webhook: Arc<Webhook>) -> Self {
+        Self { webhook }
+    }
+}
+
+impl std::fmt::Debug for SvixVerifier {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        f.debug_struct("SvixVerifier").finish()
+    }
+}
+
+#[async_trait]
+impl VerificationMethod for SvixVerifier {
+    /// This [`VerificationMethod::validate`] implementation *requires* that the headers *and* payload
+    /// be in their byte representations due to the requirements of the [`svix`] library. Please lazily
+    /// convert these values such as to avoid pointless back-and-forth conversions.
+    async fn validate(&self, req: SerializableRequest<Unvalidated>) -> Result<bool> {
+        let headers = req.headers();
+        let payload = req.payload();
+
+        match (headers, payload) {
+            (SerializableHeaderMap::Standard(headers), SerializablePayload::Standard(payload)) => {
+                if self.webhook.verify(payload, headers).is_ok() {
+                    Ok(true)
+                } else {
+                    Ok(false)
+                }
+            }
+
+            _ => {
+                anyhow::bail!("`SvixVerifier::validate` given string representations")
+            }
+        }
+    }
+}
+
+#[derive(Clone, Copy, Debug)]
+pub struct NoVerifier;
+
+#[async_trait]
+impl VerificationMethod for NoVerifier {
+    async fn validate(&self, _req: SerializableRequest<Unvalidated>) -> Result<bool> {
+        Ok(true)
+    }
+}
+
+// Allowed due to restrictions by [`enum_dispatch`] on variant names matching the structure names
+#[allow(clippy::enum_variant_names)]
+#[enum_dispatch(VerificationMethod)]
+#[derive(Clone, Debug)]
+pub enum Verifier {
+    SvixVerifier,
+    NoVerifier,
+}
+
+#[cfg(test)]
+mod tests {
+    use super::super::types::SerializableRequest;
+    use super::{SvixVerifier, VerificationMethod};
+    use axum::extract::FromRequest;
+    use std::sync::Arc;
+    use svix_bridge_types::svix::webhooks::Webhook;
+
+    #[tokio::test]
+    async fn test_svix_verification() {
+        let secret = "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD".to_owned();
+        let webhook = Arc::new(Webhook::new(&secret).unwrap());
+
+        let payload = "example payload".as_bytes();
+        let timestamp = chrono::Utc::now().timestamp();
+        let signature = webhook.sign("msg_valid", timestamp, payload).unwrap();
+
+        let sv = SvixVerifier { webhook };
+
+        let req = http::request::Request::builder()
+            .method("POST")
+            .uri("test.uri")
+            .header("svix-id", "msg_valid")
+            .header("svix-signature", signature.clone())
+            .header("svix-timestamp", &format!("{timestamp}"))
+            .body(axum::body::Full::new(payload))
+            .unwrap();
+
+        let sr = SerializableRequest::from_request(req, &()).await.unwrap();
+        assert!(sv.validate(sr).await.unwrap());
+
+        let req = http::request::Request::builder()
+            .method("POST")
+            .uri("test.uri")
+            .header("svix-id", "msg_invalid")
+            .header("svix-signature", signature)
+            .header("svix-timestamp", &format!("{timestamp}"))
+            .body(axum::body::Full::new(payload))
+            .unwrap();
+
+        let sr = SerializableRequest::from_request(req, &()).await.unwrap();
+        assert!(!sv.validate(sr).await.unwrap());
+    }
+}
diff --git a/csharp/Svix/Abstractions/IBackgroundTask.cs b/csharp/Svix/Abstractions/IBackgroundTask.cs
new file mode 100644
index 000000000..e2121376a
--- /dev/null
+++ b/csharp/Svix/Abstractions/IBackgroundTask.cs
@@ -0,0 +1,20 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Svix.Model;
+using Svix.Models;
+
+namespace Svix.Abstractions
+{
+    public interface IBackgroundTask
+    {
+        BackgroundTaskOut Get(string taskId, string idempotencyKey = default);
+
+        Task<BackgroundTaskOut> GetAsync(string taskId, string idempotencyKey = default,
+            CancellationToken cancellationToken = default);
+
+        List<BackgroundTaskOut> List(BackgroundTaskListOptions options = null, string idempotencyKey = default);
+
+        Task<List<BackgroundTaskOut>> ListAsync(BackgroundTaskListOptions options = null, string idempotencyKey = default, CancellationToken cancellationToken = default);
+    }
+}
diff --git a/csharp/Svix/Application.cs b/csharp/Svix/Application.cs
index 6b9255f24..e395e312d 100644
--- a/csharp/Svix/Application.cs
+++ b/csharp/Svix/Application.cs
@@ -28,7 +28,7 @@ public ApplicationOut Create(ApplicationIn application, ApplicationCreateOptions
             {
                 application = application ?? throw new ArgumentNullException(nameof(application));
 
-                var lApplication = _applicationApi.CreateApplicationApiV1AppPost(
+                var lApplication = _applicationApi.V1ApplicationCreate(
                     application,
                     options?.GetIfExists ?? false,
                     idempotencyKey);
@@ -52,7 +52,7 @@ public async Task<ApplicationOut> CreateAsync(ApplicationIn application, Applica
             {
                 application = application ?? throw new ArgumentNullException(nameof(application));
 
-                var lApplication = await _applicationApi.CreateApplicationApiV1AppPostAsync(
+                var lApplication = await _applicationApi.V1ApplicationCreateAsync(
                     application,
                     options?.GetIfExists ?? false,
                     idempotencyKey,
@@ -75,9 +75,7 @@ public bool Delete(string appId, string idempotencyKey = default)
         {
             try
             {
-                var lResponse = _applicationApi.DeleteApplicationApiV1AppAppIdDeleteWithHttpInfo(
-                    appId,
-                    idempotencyKey);
+                var lResponse = _applicationApi.V1ApplicationDeleteWithHttpInfo(appId);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -96,9 +94,8 @@ public async Task<bool> DeleteAsync(string appId, string idempotencyKey = defaul
         {
             try
             {
-                var lResponse = await _applicationApi.DeleteApplicationApiV1AppAppIdDeleteWithHttpInfoAsync(
+                var lResponse = await _applicationApi.V1ApplicationDeleteWithHttpInfoAsync(
                     appId,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
@@ -118,9 +115,7 @@ public ApplicationOut Get(string appId, string idempotencyKey = default)
         {
             try
             {
-                var lApplication = _applicationApi.GetApplicationApiV1AppAppIdGet(
-                    appId,
-                    idempotencyKey);
+                var lApplication = _applicationApi.V1ApplicationGet(appId);
 
                 return lApplication;
             }
@@ -139,9 +134,7 @@ public async Task<ApplicationOut> GetAsync(string appId, string idempotencyKey =
         {
             try
             {
-                var lApplication = await _applicationApi.GetApplicationApiV1AppAppIdGetAsync(
-                    appId,
-                    idempotencyKey);
+                var lApplication = await _applicationApi.V1ApplicationGetAsync(appId);
 
                 return lApplication;
             }
@@ -160,11 +153,10 @@ public List<ApplicationOut> List(ListOptions options = null, string idempotencyK
         {
             try
             {
-                var lResponse = _applicationApi.ListApplicationsApiV1AppGet(
-                    options?.Iterator,
+                var lResponse = _applicationApi.V1ApplicationList(
                     options?.Limit,
-                    options?.Order,
-                    idempotencyKey);
+                    options?.Iterator,
+                    options?.Order);
 
                 return lResponse?.Data;
             }
@@ -183,11 +175,10 @@ public async Task<List<ApplicationOut>> ListAsync(ListOptions options = null, st
         {
             try
             {
-                var lResponse = await _applicationApi.ListApplicationsApiV1AppGetAsync(
-                    options?.Iterator,
+                var lResponse = await _applicationApi.V1ApplicationListAsync(
                     options?.Limit,
+                    options?.Iterator,
                     options?.Order,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lResponse?.Data;
@@ -207,10 +198,9 @@ public ApplicationOut Update(string appId, ApplicationIn application, string ide
         {
             try
             {
-                var lApplication = _applicationApi.UpdateApplicationApiV1AppAppIdPut(
+                var lApplication = _applicationApi.V1ApplicationUpdate(
                     appId,
-                    application,
-                    idempotencyKey);
+                    application);
 
                 return lApplication;
             }
@@ -229,10 +219,9 @@ public async Task<ApplicationOut> UpdateAsync(string appId, ApplicationIn applic
         {
             try
             {
-                var lApplication = await _applicationApi.UpdateApplicationApiV1AppAppIdPutAsync(
+                var lApplication = await _applicationApi.V1ApplicationUpdateAsync(
                     appId,
                     application,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lApplication;
diff --git a/csharp/Svix/Authentication.cs b/csharp/Svix/Authentication.cs
index 03c4c3a9a..ed4dae5f1 100644
--- a/csharp/Svix/Authentication.cs
+++ b/csharp/Svix/Authentication.cs
@@ -24,7 +24,7 @@ public AppPortalAccessOut GetAppPortalAccess(string appId, AppPortalAccessIn app
         {
             try
             {
-                var lMessage = _authenticationApi.GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPost(
+                var lMessage = _authenticationApi.V1AuthenticationAppPortalAccess(
                     appId,
                     appPortalAccess,
                     idempotencyKey);
@@ -47,7 +47,7 @@ public async Task<AppPortalAccessOut> GetAppPortalAccessAsync(string appId, AppP
         {
             try
             {
-                var lMessage = await _authenticationApi.GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostAsync(
+                var lMessage = await _authenticationApi.V1AuthenticationAppPortalAccessAsync(
                     appId,
                     appPortalAccess,
                     idempotencyKey);
@@ -69,7 +69,7 @@ public DashboardAccessOut GetDashboardAccess(string appId, string idempotencyKey
         {
             try
             {
-                var lMessage = _authenticationApi.GetDashboardAccessApiV1AuthDashboardAccessAppIdPost(
+                var lMessage = _authenticationApi.V1AuthenticationDashboardAccess(
                     appId,
                     idempotencyKey);
 
@@ -91,7 +91,7 @@ public async Task<DashboardAccessOut> GetDashboardAccessAsync(string appId, stri
         {
             try
             {
-                var lMessage = await _authenticationApi.GetDashboardAccessApiV1AuthDashboardAccessAppIdPostAsync(
+                var lMessage = await _authenticationApi.V1AuthenticationDashboardAccessAsync(
                     appId,
                     idempotencyKey);
 
@@ -112,7 +112,7 @@ public bool Logout(string idempotencyKey = default)
         {
             try
             {
-                var lResult = _authenticationApi.LogoutApiV1AuthLogoutPostWithHttpInfo(
+                var lResult = _authenticationApi.V1AuthenticationLogoutWithHttpInfo(
                     idempotencyKey);
 
                 return lResult.StatusCode == HttpStatusCode.NoContent;
@@ -132,7 +132,7 @@ public async Task<bool> LogoutAsync(string idempotencyKey = default, Cancellatio
         {
             try
             {
-                var lResult = await _authenticationApi.LogoutApiV1AuthLogoutPostWithHttpInfoAsync(
+                var lResult = await _authenticationApi.V1AuthenticationLogoutWithHttpInfoAsync(
                     idempotencyKey,
                     cancellationToken);
 
diff --git a/csharp/Svix/BackgroundTask.cs b/csharp/Svix/BackgroundTask.cs
new file mode 100644
index 000000000..b89fc4d4a
--- /dev/null
+++ b/csharp/Svix/BackgroundTask.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
+using Svix.Abstractions;
+using Svix.Api;
+using Svix.Client;
+using Svix.Model;
+using Svix.Models;
+
+namespace Svix
+{
+    public sealed class BackgroundTask : SvixResourceBase, IBackgroundTask
+    {
+        private readonly IBackgroundTasksApi _backgroundTaskApi;
+
+        public BackgroundTask(ISvixClient svixClient, IBackgroundTasksApi backgroundTaskApi)
+            : base(svixClient)
+        {
+            _backgroundTaskApi = backgroundTaskApi ?? throw new ArgumentNullException(nameof(backgroundTaskApi));
+        }
+
+        public BackgroundTaskOut Get(string taskId, string idempotencyKey = default)
+        {
+            try
+            {
+                var lBackgroundTask = _backgroundTaskApi.GetBackgroundTask(taskId);
+
+                return lBackgroundTask;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(Get)} failed");
+
+                if (Throw)
+                    throw;
+
+                return null;
+            }
+        }
+
+        public async Task<BackgroundTaskOut> GetAsync(string taskId, string idempotencyKey = default, CancellationToken cancellationToken = default)
+        {
+            try
+            {
+                var lBackgroundTask = await _backgroundTaskApi.GetBackgroundTaskAsync(taskId);
+
+                return lBackgroundTask;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(GetAsync)} failed");
+
+                if (Throw)
+                    throw;
+
+                return null;
+            }
+        }
+
+        public List<BackgroundTaskOut> List(BackgroundTaskListOptions options = null, string idempotencyKey = default)
+        {
+            try
+            {
+                var lResponse = _backgroundTaskApi.ListBackgroundTasks(
+                    options?.Status,
+                    options?.Task,
+                    options?.Limit,
+                    options?.Iterator,
+                    options?.Order);
+
+                return lResponse?.Data;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(List)} failed");
+
+                if (Throw)
+                    throw;
+
+                return new List<BackgroundTaskOut>();
+            }
+        }
+
+        public async Task<List<BackgroundTaskOut>> ListAsync(BackgroundTaskListOptions options = null, string idempotencyKey = default, CancellationToken cancellationToken = default)
+        {
+            try
+            {
+                var lResponse = await _backgroundTaskApi.ListBackgroundTasksAsync(
+                    options?.Status,
+                    options?.Task,
+                    options?.Limit,
+                    options?.Iterator,
+                    options?.Order,
+                    cancellationToken);
+
+                return lResponse?.Data;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(ListAsync)} failed");
+
+                if (Throw)
+                    throw;
+
+                return new List<BackgroundTaskOut>();
+            }
+        }
+    }
+}
diff --git a/csharp/Svix/Endpoint.cs b/csharp/Svix/Endpoint.cs
index f63266414..93791b70d 100644
--- a/csharp/Svix/Endpoint.cs
+++ b/csharp/Svix/Endpoint.cs
@@ -26,7 +26,7 @@ public EndpointOut Create(string appId, EndpointIn endpoint, string idempotencyK
         {
             try
             {
-                var lEndpoint = _endpointApi.CreateEndpointApiV1AppAppIdEndpointPost(
+                var lEndpoint = _endpointApi.V1EndpointCreate(
                     appId,
                     endpoint,
                     idempotencyKey);
@@ -49,7 +49,7 @@ public async Task<EndpointOut> CreateAsync(string appId, EndpointIn endpoint, st
         {
             try
             {
-                var lEndpoint = await _endpointApi.CreateEndpointApiV1AppAppIdEndpointPostAsync(
+                var lEndpoint = await _endpointApi.V1EndpointCreateAsync(
                     appId,
                     endpoint,
                     idempotencyKey,
@@ -72,10 +72,9 @@ public bool Delete(string appId, string endpointId, string idempotencyKey = defa
         {
             try
             {
-                var lResponse = _endpointApi.DeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteWithHttpInfo(
-                    endpointId,
+                var lResponse = _endpointApi.V1EndpointDeleteWithHttpInfo(
                     appId,
-                    idempotencyKey);
+                    endpointId);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -95,10 +94,9 @@ public async Task<bool> DeleteAsync(string appId, string endpointId, string idem
         {
             try
             {
-                var lResponse = await _endpointApi.DeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteWithHttpInfoAsync(
-                    endpointId,
+                var lResponse = await _endpointApi.V1EndpointDeleteWithHttpInfoAsync(
                     appId,
-                    idempotencyKey,
+                    endpointId,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
@@ -118,10 +116,9 @@ public EndpointOut Get(string appId, string endpointId, string idempotencyKey =
         {
             try
             {
-                var lEndpoint = _endpointApi.GetEndpointApiV1AppAppIdEndpointEndpointIdGet(
-                    endpointId,
+                var lEndpoint = _endpointApi.V1EndpointGet(
                     appId,
-                    idempotencyKey);
+                    endpointId);
 
                 return lEndpoint;
             }
@@ -141,10 +138,9 @@ public async Task<EndpointOut> GetAsync(string appId, string endpointId, string
         {
             try
             {
-                var lEndpoint = await _endpointApi.GetEndpointApiV1AppAppIdEndpointEndpointIdGetAsync(
-                    endpointId,
+                var lEndpoint = await _endpointApi.V1EndpointGetAsync(
                     appId,
-                    idempotencyKey,
+                    endpointId,
                     cancellationToken);
 
                 return lEndpoint;
@@ -164,10 +160,9 @@ public EndpointHeadersOut GetHeaders(string appId, string endpointId, string ide
         {
             try
             {
-                var lHeaders = _endpointApi.GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet(
-                    endpointId,
+                var lHeaders = _endpointApi.V1EndpointGetHeaders(
                     appId,
-                    idempotencyKey);
+                    endpointId);
 
                 return lHeaders;
             }
@@ -187,10 +182,9 @@ public async Task<EndpointHeadersOut> GetHeadersAsync(string appId, string endpo
         {
             try
             {
-                var lHeaders = await _endpointApi.GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetAsync(
-                    endpointId,
+                var lHeaders = await _endpointApi.V1EndpointGetHeadersAsync(
                     appId,
-                    idempotencyKey,
+                    endpointId,
                     cancellationToken);
 
                 return lHeaders;
@@ -210,10 +204,9 @@ public string GetSecret(string appId, string endpointId, string idempotencyKey =
         {
             try
             {
-                var lSecret = _endpointApi.GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet(
-                    endpointId,
+                var lSecret = _endpointApi.V1EndpointGetSecret(
                     appId,
-                    idempotencyKey);
+                    endpointId);
 
                 return lSecret?.Key;
             }
@@ -233,10 +226,9 @@ public async Task<string> GetSecretAsync(string appId, string endpointId, string
         {
             try
             {
-                var lSecret = await _endpointApi.GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetAsync(
-                    endpointId,
+                var lSecret = await _endpointApi.V1EndpointGetSecretAsync(
                     appId,
-                    idempotencyKey,
+                    endpointId,
                     cancellationToken);
 
                 return lSecret.Key;
@@ -256,12 +248,11 @@ public List<EndpointOut> List(string appId, ListOptions options = null, string i
         {
             try
             {
-                var lEndpoints = _endpointApi.ListEndpointsApiV1AppAppIdEndpointGet(
+                var lEndpoints = _endpointApi.V1EndpointList(
                     appId,
-                    options?.Iterator,
                     options?.Limit,
-                    options?.Order,
-                    idempotencyKey);
+                    options?.Iterator,
+                    options?.Order);
 
                 return lEndpoints?.Data;
             }
@@ -281,12 +272,11 @@ public async Task<List<EndpointOut>> ListAsync(string appId, ListOptions options
         {
             try
             {
-                var lEndpoints = await _endpointApi.ListEndpointsApiV1AppAppIdEndpointGetAsync(
+                var lEndpoints = await _endpointApi.V1EndpointListAsync(
                     appId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     options?.Order,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lEndpoints?.Data;
@@ -306,11 +296,10 @@ public bool PatchHeaders(string appId, string endpointId, EndpointHeadersPatchIn
         {
             try
             {
-                var lResponse = _endpointApi.PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchWithHttpInfo(
+                var lResponse = _endpointApi.V1EndpointPatchHeadersWithHttpInfo(
                     appId,
                     endpointId,
-                    headers,
-                    idempotencyKey);
+                    headers);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -330,11 +319,10 @@ public async Task<bool> PatchHeadersAsync(string appId, string endpointId, Endpo
         {
             try
             {
-                var lResponse = await _endpointApi.PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchWithHttpInfoAsync(
+                var lResponse = await _endpointApi.V1EndpointPatchHeadersWithHttpInfoAsync(
                     appId,
                     endpointId,
                     headers,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
@@ -354,7 +342,7 @@ public bool Recover(string appId, string endpointId, RecoverIn recover, string i
         {
             try
             {
-                var lResponse = _endpointApi.RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostWithHttpInfo(
+                var lResponse = _endpointApi.V1EndpointRecoverWithHttpInfo(
                     appId,
                     endpointId,
                     recover,
@@ -378,7 +366,7 @@ public async Task<bool> RecoverAsync(string appId, string endpointId, RecoverIn
         {
             try
             {
-                var lResponse = await _endpointApi.RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostWithHttpInfoAsync(
+                var lResponse = await _endpointApi.V1EndpointRecoverWithHttpInfoAsync(
                     appId,
                     endpointId,
                     recover,
@@ -402,9 +390,9 @@ public bool RotateSecret(string appId, string endpointId, EndpointSecretRotateIn
         {
             try
             {
-                var lResponse = _endpointApi.RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostWithHttpInfo(
-                    endpointId,
+                var lResponse = _endpointApi.V1EndpointRotateSecretWithHttpInfo(
                     appId,
+                    endpointId,
                     secret,
                     idempotencyKey);
 
@@ -426,7 +414,7 @@ public async Task<bool> RotateSecretAsync(string appId, string endpointId, Endpo
         {
             try
             {
-                var lResponse = await _endpointApi.RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostWithHttpInfoAsync(
+                var lResponse = await _endpointApi.V1EndpointRotateSecretWithHttpInfoAsync(
                     endpointId,
                     appId,
                     secret,
@@ -449,11 +437,10 @@ public EndpointOut Update(string appId, string endpointId, EndpointUpdate endpoi
         {
             try
             {
-                var lEndpoint = _endpointApi.UpdateEndpointApiV1AppAppIdEndpointEndpointIdPut(
-                    endpointId,
+                var lEndpoint = _endpointApi.V1EndpointUpdate(
                     appId,
-                    endpoint,
-                    idempotencyKey);
+                    endpointId,
+                    endpoint);
 
                 return lEndpoint;
             }
@@ -473,11 +460,10 @@ public async Task<EndpointOut> UpdateAsync(string appId, string endpointId, Endp
         {
             try
             {
-                var lEndpoint = await _endpointApi.UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutAsync(
-                    endpointId,
+                var lEndpoint = await _endpointApi.V1EndpointUpdateAsync(
                     appId,
+                    endpointId,
                     endpoint,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lEndpoint;
@@ -497,11 +483,10 @@ public bool UpdateHeaders(string appId, string endpointId, EndpointHeadersIn hea
         {
             try
             {
-                var lResponse = _endpointApi.UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutWithHttpInfo(
+                var lResponse = _endpointApi.V1EndpointUpdateHeadersWithHttpInfo(
                     appId,
                     endpointId,
-                    headers,
-                    idempotencyKey);
+                    headers);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -521,11 +506,10 @@ public async Task<bool> UpdateHeadersAsync(string appId, string endpointId, Endp
         {
             try
             {
-                var lResponse = await _endpointApi.UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutWithHttpInfoAsync(
+                var lResponse = await _endpointApi.V1EndpointUpdateHeadersWithHttpInfoAsync(
                     appId,
                     endpointId,
                     headers,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
@@ -545,10 +529,11 @@ public EndpointStats GetStats(string appId, string endpointId, string idempotenc
         {
             try
             {
-                var lStats = _endpointApi.GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet(
-                    endpointId,
+                var lStats = _endpointApi.V1EndpointGetStats(
                     appId,
-                    idempotencyKey);
+                    endpointId,
+                    null,
+                    null);
 
                 return lStats;
             }
@@ -563,15 +548,39 @@ public EndpointStats GetStats(string appId, string endpointId, string idempotenc
             }
         }
 
+        public EndpointStats GetStatsWithOptions(string appId, string endpointId, EndpointStatsOptions options = null, string idempotencyKey = default)
+        {
+            try
+            {
+                var lStats = _endpointApi.V1EndpointGetStats(
+                    appId,
+                    endpointId,
+                    options?.Since,
+                    options?.Until);
+
+                return lStats;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(GetStatsWithOptions)} failed");
+
+                if (Throw)
+                    throw;
+
+                return null;
+            }
+        }
+
         public async Task<EndpointStats> GetStatsAsync(string appId, string endpointId, string idempotencyKey = default,
             CancellationToken cancellationToken = default)
         {
             try
             {
-                var lStats = await _endpointApi.GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetAsync(
-                    endpointId,
+                var lStats = await _endpointApi.V1EndpointGetStatsAsync(
                     appId,
-                    idempotencyKey,
+                    endpointId,
+                    null,
+                    null,
                     cancellationToken);
 
                 return lStats;
@@ -587,12 +596,37 @@ public async Task<EndpointStats> GetStatsAsync(string appId, string endpointId,
             }
         }
 
+        public async Task<EndpointStats> GetStatsWithOptionsAsync(string appId, string endpointId, EndpointStatsOptions options = null, string idempotencyKey = default,
+            CancellationToken cancellationToken = default)
+        {
+            try
+            {
+                var lStats = await _endpointApi.V1EndpointGetStatsAsync(
+                    appId,
+                    endpointId,
+                    options?.Since,
+                    options?.Until,
+                    cancellationToken);
+
+                return lStats;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(GetStatsWithOptionsAsync)} failed");
+
+                if (Throw)
+                    throw;
+
+                return null;
+            }
+        }
+
         public bool ReplayMissing(string appId, string endpointId, ReplayIn replayIn,
             string idempotencyKey = default)
         {
             try
             {
-                var response = _endpointApi.ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostWithHttpInfo(
+                var response = _endpointApi.V1EndpointReplayWithHttpInfo(
                     appId,
                     endpointId,
                     replayIn,
@@ -616,7 +650,7 @@ public async Task<bool> ReplayMissingAsync(string appId, string endpointId, Repl
         {
             try
             {
-                var response = await _endpointApi.ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostWithHttpInfoAsync(
+                var response = await _endpointApi.V1EndpointReplayWithHttpInfoAsync(
                     appId,
                     endpointId,
                     replayIn,
@@ -640,10 +674,9 @@ public EndpointTransformationOut TransformationGet(string appId, string endpoint
         {
             try
             {
-                var lTransformation = _endpointApi.GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet(
+                var lTransformation = _endpointApi.V1EndpointTransformationGet(
                     appId,
-                    endpointId,
-                    idempotencyKey);
+                    endpointId);
 
                 return lTransformation;
             }
@@ -662,10 +695,9 @@ public async Task<EndpointTransformationOut> TransformationGetAsync(string appId
         {
             try
             {
-                var lTransformation = await _endpointApi.GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetAsync(
+                var lTransformation = await _endpointApi.V1EndpointTransformationGetAsync(
                     appId,
                     endpointId,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lTransformation;
@@ -685,11 +717,10 @@ public bool TransformationPartialUpdate(string appId, string endpointId, Endpoin
         {
             try
             {
-                var response = _endpointApi.SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchWithHttpInfo(
+                var response = _endpointApi.V1EndpointTransformationPartialUpdateWithHttpInfo(
                     appId,
                     endpointId,
-                    endpointTransformationIn,
-                    idempotencyKey);
+                    endpointTransformationIn);
 
                 return response.StatusCode == HttpStatusCode.NoContent;
             }
@@ -708,11 +739,10 @@ public async Task<bool> TransformationPartialUpdateAsync(string appId, string en
         {
             try
             {
-                var response = await _endpointApi.SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchWithHttpInfoAsync(
+                var response = await _endpointApi.V1EndpointTransformationPartialUpdateWithHttpInfoAsync(
                     appId,
                     endpointId,
                     endpointTransformationIn,
-                    idempotencyKey,
                     cancellationToken);
 
                 return response.StatusCode == HttpStatusCode.NoContent;
@@ -727,5 +757,51 @@ public async Task<bool> TransformationPartialUpdateAsync(string appId, string en
                 return false;
             }
         }
+
+        public MessageOut SendExample(string appId, string endpointId, EventExampleIn eventExampleIn, string idempotencyKey = default)
+        {
+            try
+            {
+                var response = _endpointApi.V1EndpointSendExample(
+                    appId,
+                    endpointId,
+                    eventExampleIn,
+                    idempotencyKey);
+
+                return response;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(SendExample)} failed");
+
+                if (Throw)
+                    throw;
+
+                return null;
+            }
+        }
+
+        public async Task<MessageOut> SendExampleAsync(string appId, string endpointId, EventExampleIn eventExampleIn, string idempotencyKey = default, CancellationToken cancellationToken = default)
+        {
+            try
+            {
+                var response = await _endpointApi.V1EndpointSendExampleAsync(
+                    appId,
+                    endpointId,
+                    eventExampleIn,
+                    idempotencyKey);
+
+                return response;
+            }
+            catch (ApiException e)
+            {
+                Logger?.LogError(e, $"{nameof(SendExampleAsync)} failed");
+
+                if (Throw)
+                    throw;
+
+                return null;
+            }
+        }
     }
 }
diff --git a/csharp/Svix/EventType.cs b/csharp/Svix/EventType.cs
index 76c01d98c..9cc89f0bd 100644
--- a/csharp/Svix/EventType.cs
+++ b/csharp/Svix/EventType.cs
@@ -26,10 +26,9 @@ public bool Archive(string eventType, string idempotencyKey = default)
         {
             try
             {
-                var lResponse = _eventTypeApi.DeleteEventTypeApiV1EventTypeEventTypeNameDeleteWithHttpInfo(
+                var lResponse = _eventTypeApi.V1EventTypeDeleteWithHttpInfo(
                     eventType,
-                    null,
-                    idempotencyKey);
+                    null);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -48,10 +47,9 @@ public async Task<bool> ArchiveAsync(string eventType, string idempotencyKey = d
         {
             try
             {
-                var lResponse = await _eventTypeApi.DeleteEventTypeApiV1EventTypeEventTypeNameDeleteWithHttpInfoAsync(
+                var lResponse = await _eventTypeApi.V1EventTypeDeleteWithHttpInfoAsync(
                     eventType,
                     null,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
@@ -71,7 +69,7 @@ public EventTypeOut Create(EventTypeIn eventType, string idempotencyKey = defaul
         {
             try
             {
-                var lEventType = _eventTypeApi.CreateEventTypeApiV1EventTypePost(
+                var lEventType = _eventTypeApi.V1EventTypeCreate(
                     eventType,
                     idempotencyKey);
 
@@ -92,7 +90,7 @@ public async Task<EventTypeOut> CreateAsync(EventTypeIn eventType, string idempo
         {
             try
             {
-                var lEventType = await _eventTypeApi.CreateEventTypeApiV1EventTypePostAsync(
+                var lEventType = await _eventTypeApi.V1EventTypeCreateAsync(
                     eventType,
                     idempotencyKey,
                     cancellationToken);
@@ -114,9 +112,7 @@ public EventTypeOut Get(string eventType, string idempotencyKey = default)
         {
             try
             {
-                var lEventType = _eventTypeApi.GetEventTypeApiV1EventTypeEventTypeNameGet(
-                    eventType,
-                    idempotencyKey);
+                var lEventType = _eventTypeApi.V1EventTypeGet(eventType);
 
                 return lEventType;
             }
@@ -135,9 +131,8 @@ public async Task<EventTypeOut> GetAsync(string eventType, string idempotencyKey
         {
             try
             {
-                var lEventType = await _eventTypeApi.GetEventTypeApiV1EventTypeEventTypeNameGetAsync(
+                var lEventType = await _eventTypeApi.V1EventTypeGetAsync(
                     eventType,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lEventType;
@@ -157,12 +152,12 @@ public List<EventTypeOut> List(EventTypeListOptions options = null, string idemp
         {
             try
             {
-                var lResults = _eventTypeApi.ListEventTypesApiV1EventTypeGet(
-                    options?.Iterator,
+                var lResults = _eventTypeApi.V1EventTypeList(
                     options?.Limit,
-                    options?.WithContent,
+                    options?.Iterator,
+                    null,
                     options?.IncludeArchived,
-                    idempotencyKey);
+                    options?.WithContent);
 
                 return lResults?.Data;
             }
@@ -182,12 +177,12 @@ public async Task<List<EventTypeOut>> ListAsync(EventTypeListOptions options = n
         {
             try
             {
-                var lResults = await _eventTypeApi.ListEventTypesApiV1EventTypeGetAsync(
-                    options?.Iterator,
+                var lResults = await _eventTypeApi.V1EventTypeListAsync(
                     options?.Limit,
-                    options?.WithContent,
+                    options?.Iterator,
+                    null,
                     options?.IncludeArchived,
-                    idempotencyKey,
+                    options?.WithContent,
                     cancellationToken);
 
                 return lResults?.Data;
@@ -207,10 +202,9 @@ public EventTypeOut Update(string eventType, EventTypeUpdate update, string idem
         {
             try
             {
-                var lEventType = _eventTypeApi.UpdateEventTypeApiV1EventTypeEventTypeNamePut(
+                var lEventType = _eventTypeApi.V1EventTypeUpdate(
                     eventType,
-                    update,
-                    idempotencyKey);
+                    update);
 
                 return lEventType;
             }
@@ -230,10 +224,9 @@ public async Task<EventTypeOut> UpdateAsync(string eventType, EventTypeUpdate up
         {
             try
             {
-                var lEventType = await _eventTypeApi.UpdateEventTypeApiV1EventTypeEventTypeNamePutAsync(
+                var lEventType = await _eventTypeApi.V1EventTypeUpdateAsync(
                     eventType,
                     update,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lEventType;
diff --git a/csharp/Svix/Health.cs b/csharp/Svix/Health.cs
index 12ed11851..3eb221a67 100644
--- a/csharp/Svix/Health.cs
+++ b/csharp/Svix/Health.cs
@@ -23,7 +23,7 @@ public bool IsHealthy(string idempotencyKey = default)
         {
             try
             {
-                var lResponse = _healthApi.HealthApiV1HealthGetWithHttpInfo(idempotencyKey);
+                var lResponse = _healthApi.V1HealthGetWithHttpInfo();
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -42,7 +42,7 @@ public async Task<bool> IsHealthyAsync(string idempotencyKey = default, Cancella
         {
             try
             {
-                var lResponse = await _healthApi.HealthApiV1HealthGetWithHttpInfoAsync(idempotencyKey, cancellationToken)
+                var lResponse = await _healthApi.V1HealthGetWithHttpInfoAsync(cancellationToken)
                     .ConfigureAwait(false);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
diff --git a/csharp/Svix/Integration.cs b/csharp/Svix/Integration.cs
index 5e7be940c..ceda5383d 100644
--- a/csharp/Svix/Integration.cs
+++ b/csharp/Svix/Integration.cs
@@ -25,7 +25,7 @@ public IntegrationOut Create(string appId, IntegrationIn integration, string ide
         {
             try
             {
-                var lIntegration = _integrationApi.CreateIntegrationApiV1AppAppIdIntegrationPost(
+                var lIntegration = _integrationApi.V1IntegrationCreate(
                     appId,
                     integration,
                     idempotencyKey);
@@ -48,7 +48,7 @@ public async Task<IntegrationOut> CreateAsync(string appId, IntegrationIn integr
         {
             try
             {
-                var lIntegration = await _integrationApi.CreateIntegrationApiV1AppAppIdIntegrationPostAsync(
+                var lIntegration = await _integrationApi.V1IntegrationCreateAsync(
                     appId,
                     integration,
                     idempotencyKey,
@@ -71,10 +71,9 @@ public bool Delete(string appId, string integrationId, string idempotencyKey = d
         {
             try
             {
-                var lResponse = _integrationApi.DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteWithHttpInfo(
-                    integrationId,
+                var lResponse = _integrationApi.V1IntegrationDeleteWithHttpInfo(
                     appId,
-                    idempotencyKey);
+                    integrationId);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -94,10 +93,9 @@ public async Task<bool> DeleteAsync(string appId, string integrationId, string i
         {
             try
             {
-                var lResponse = await _integrationApi.DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteWithHttpInfoAsync(
-                    integrationId,
+                var lResponse = await _integrationApi.V1IntegrationDeleteWithHttpInfoAsync(
                     appId,
-                    idempotencyKey,
+                    integrationId,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
@@ -117,10 +115,9 @@ public IntegrationOut Get(string appId, string integrationId, string idempotency
         {
             try
             {
-                var lIntegration = _integrationApi.GetIntegrationApiV1AppAppIdIntegrationIntegIdGet(
-                    integrationId,
+                var lIntegration = _integrationApi.V1IntegrationGet(
                     appId,
-                    idempotencyKey);
+                    integrationId);
 
                 return lIntegration;
             }
@@ -139,10 +136,9 @@ public async Task<IntegrationOut> GetAsync(string appId, string integrationId, s
         {
             try
             {
-                var lIntegration = await _integrationApi.GetIntegrationApiV1AppAppIdIntegrationIntegIdGetAsync(
-                    integrationId,
+                var lIntegration = await _integrationApi.V1IntegrationGetAsync(
                     appId,
-                    idempotencyKey,
+                    integrationId,
                     cancellationToken);
 
                 return lIntegration;
@@ -162,10 +158,9 @@ public string GetKey(string appId, string integrationId, string idempotencyKey =
         {
             try
             {
-                var lResponse = _integrationApi.GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet(
-                    integrationId,
+                var lResponse = _integrationApi.V1IntegrationGetKey(
                     appId,
-                    idempotencyKey);
+                    integrationId);
 
                 return lResponse.Key;
             }
@@ -185,10 +180,9 @@ public async Task<string> GetKeyAsync(string appId, string integrationId, string
         {
             try
             {
-                var lResponse = await _integrationApi.GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetAsync(
-                    integrationId,
+                var lResponse = await _integrationApi.V1IntegrationGetKeyAsync(
                     appId,
-                    idempotencyKey,
+                    integrationId,
                     cancellationToken);
 
                 return lResponse.Key;
@@ -208,11 +202,10 @@ public List<IntegrationOut> List(string appId, ListOptions options = null, strin
         {
             try
             {
-                var lResult = _integrationApi.ListIntegrationsApiV1AppAppIdIntegrationGet(
+                var lResult = _integrationApi.V1IntegrationList(
                     appId,
-                    options?.Iterator,
                     options?.Limit,
-                    idempotencyKey);
+                    options?.Iterator);
 
                 return lResult?.Data;
             }
@@ -232,11 +225,10 @@ public async Task<List<IntegrationOut>> ListAsync(string appId, ListOptions opti
         {
             try
             {
-                var lResult = await _integrationApi.ListIntegrationsApiV1AppAppIdIntegrationGetAsync(
+                var lResult = await _integrationApi.V1IntegrationListAsync(
                     appId,
-                    options?.Iterator,
                     options?.Limit,
-                    idempotencyKey,
+                    options?.Iterator,
                     cancellationToken);
 
                 return lResult?.Data;
@@ -256,9 +248,9 @@ public string RotateKey(string appId, string integrationId, string idempotencyKe
         {
             try
             {
-                var lResponse = _integrationApi.RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost(
-                    integrationId,
+                var lResponse = _integrationApi.V1IntegrationRotateKey(
                     appId,
+                    integrationId,
                     idempotencyKey);
 
                 return lResponse.Key;
@@ -279,9 +271,9 @@ public async Task<string> RotateKeyAsync(string appId, string integrationId, str
         {
             try
             {
-                var lResponse = await _integrationApi.RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostAsync(
-                    integrationId,
+                var lResponse = await _integrationApi.V1IntegrationRotateKeyAsync(
                     appId,
+                    integrationId,
                     idempotencyKey,
                     cancellationToken);
 
@@ -302,11 +294,10 @@ public IntegrationOut Update(string appId, string integrationId, IntegrationUpda
         {
             try
             {
-                var lIntegration = _integrationApi.UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPut(
-                    integrationId,
+                var lIntegration = _integrationApi.V1IntegrationUpdate(
                     appId,
-                    integration,
-                    idempotencyKey);
+                    integrationId,
+                    integration);
 
                 return lIntegration;
             }
@@ -325,11 +316,10 @@ public async Task<IntegrationOut> UpdateAsync(string appId, string integrationId
         {
             try
             {
-                var lIntegration = await _integrationApi.UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutAsync(
-                    integrationId,
+                var lIntegration = await _integrationApi.V1IntegrationUpdateAsync(
                     appId,
+                    integrationId,
                     integration,
-                    idempotencyKey,
                     cancellationToken);
 
                 return lIntegration;
diff --git a/csharp/Svix/Message.cs b/csharp/Svix/Message.cs
index b07ab2a24..e12229c3d 100644
--- a/csharp/Svix/Message.cs
+++ b/csharp/Svix/Message.cs
@@ -29,7 +29,7 @@ public MessageOut Create(string appId, MessageIn message, MessageCreateOptions o
             {
                 message = message ?? throw new ArgumentNullException(nameof(message));
 
-                var lApplication = _messageApi.CreateMessageApiV1AppAppIdMsgPost(
+                var lApplication = _messageApi.V1MessageCreate(
                     appId,
                     message,
                     options?.WithContent,
@@ -54,7 +54,7 @@ public async Task<MessageOut> CreateAsync(string appId, MessageIn message, Messa
             {
                 message = message ?? throw new ArgumentNullException(nameof(message));
 
-                var lApplication = await _messageApi.CreateMessageApiV1AppAppIdMsgPostAsync(
+                var lApplication = await _messageApi.V1MessageCreateAsync(
                     appId,
                     message,
                     options?.WithContent,
@@ -78,10 +78,9 @@ public MessageOut Get(string appId, string messageId, string idempotencyKey = de
         {
             try
             {
-                var lMessage = _messageApi.GetMessageApiV1AppAppIdMsgMsgIdGet(
-                    messageId,
+                var lMessage = _messageApi.V1MessageGet(
                     appId,
-                    idempotencyKey);
+                    messageId);
 
                 return lMessage;
             }
@@ -100,10 +99,9 @@ public async Task<MessageOut> GetAsync(string appId, string messageId, string id
         {
             try
             {
-                var lMessage = await _messageApi.GetMessageApiV1AppAppIdMsgMsgIdGetAsync(
-                    messageId,
+                var lMessage = await _messageApi.V1MessageGetAsync(
                     appId,
-                    idempotencyKey);
+                    messageId);
 
                 return lMessage;
             }
@@ -122,15 +120,16 @@ public List<MessageOut> List(string appId, MessageListOptions options = null, st
         {
             try
             {
-                var lResponse = _messageApi.ListMessagesApiV1AppAppIdMsgGet(
+                var lResponse = _messageApi.V1MessageList(
                     appId,
-                    options?.Iterator,
                     options?.Limit,
-                    options?.EventTypes,
+                    options?.Iterator,
                     options?.Channel,
                     options?.Before,
                     options?.After,
-                    idempotencyKey);
+                    options?.WithContent,
+                    options?.EventTypes
+                    );
 
                 return lResponse?.Data;
             }
@@ -149,15 +148,15 @@ public async Task<List<MessageOut>> ListAsync(string appId, MessageListOptions o
         {
             try
             {
-                var lResponse = await _messageApi.ListMessagesApiV1AppAppIdMsgGetAsync(
+                var lResponse = await _messageApi.V1MessageListAsync(
                     appId,
-                    options?.Iterator,
                     options?.Limit,
-                    options?.EventTypes,
+                    options?.Iterator,
                     options?.Channel,
                     options?.Before,
                     options?.After,
-                    idempotencyKey,
+                    options?.WithContent,
+                    options?.EventTypes,
                     cancellationToken);
 
                 return lResponse?.Data;
@@ -177,10 +176,9 @@ public bool ExpungeContent(string appId, string messageId, string idempotencyKey
         {
             try
             {
-                var lResponse = _messageApi.ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteWithHttpInfo(
-                    messageId,
+                var lResponse = _messageApi.V1MessageExpungeContentWithHttpInfo(
                     appId,
-                    idempotencyKey);
+                    messageId);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -199,10 +197,9 @@ public async Task<bool> ExpungeContentAsync(string appId, string messageId, stri
         {
             try
             {
-                var lResponse = await _messageApi.ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteWithHttpInfoAsync(
-                    messageId,
+                var lResponse = await _messageApi.V1MessageExpungeContentWithHttpInfoAsync(
                     appId,
-                    idempotencyKey,
+                    messageId,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
diff --git a/csharp/Svix/MessageAttempt.cs b/csharp/Svix/MessageAttempt.cs
index 64823aa80..bea94daf3 100644
--- a/csharp/Svix/MessageAttempt.cs
+++ b/csharp/Svix/MessageAttempt.cs
@@ -27,11 +27,10 @@ public MessageAttemptOut GetAttempt(string appId, string attemptId, string messa
         {
             try
             {
-                var lAttempt = _messageAttemptApi.GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet(
-                    attemptId,
-                    messageId,
+                var lAttempt = _messageAttemptApi.V1MessageAttemptGet(
                     appId,
-                    idempotencyKey);
+                    messageId,
+                    attemptId);
 
                 return lAttempt;
             }
@@ -51,11 +50,10 @@ public async Task<MessageAttemptOut> GetAttemptAsync(string appId, string attemp
         {
             try
             {
-                var lAttempt = await _messageAttemptApi.GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetAsync(
-                    attemptId,
-                    messageId,
+                var lAttempt = await _messageAttemptApi.V1MessageAttemptGetAsync(
                     appId,
-                    idempotencyKey,
+                    messageId,
+                    attemptId,
                     cancellationToken);
 
                 return lAttempt;
@@ -76,16 +74,15 @@ public List<EndpointMessageOut> ListAttemptedMessages(string appId, string endpo
         {
             try
             {
-                var lResults = _messageAttemptApi.ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet(
-                    endpointId,
+                var lResults = _messageAttemptApi.V1MessageAttemptListAttemptedMessages(
                     appId,
-                    options?.Iterator,
+                    endpointId,
                     options?.Limit,
+                    options?.Iterator,
                     options?.Channel,
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
-                    options?.After,
-                    idempotencyKey);
+                    options?.After);
 
                 return lResults?.Data;
             }
@@ -105,16 +102,16 @@ public async Task<List<EndpointMessageOut>> ListAttemptedMessagesAsync(string ap
         {
             try
             {
-                var lResults = await _messageAttemptApi.ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetAsync(
-                    endpointId,
+                var lResults = await _messageAttemptApi.V1MessageAttemptListAttemptedMessagesAsync(
                     appId,
-                    options?.Iterator,
+                    endpointId,
                     options?.Limit,
+                    options?.Iterator,
                     options?.Channel,
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
                     options?.After,
-                    idempotencyKey,
+                    options?.WithContent,
                     cancellationToken);
 
                 return lResults?.Data;
@@ -135,18 +132,17 @@ public List<MessageAttemptOut> ListAttemptsByEndpoint(string appId, string endpo
         {
             try
             {
-                var lResults = _messageAttemptApi.ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet(
+                var lResults = _messageAttemptApi.V1MessageAttemptListByEndpoint(
                     appId,
                     endpointId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     (Svix.Model.MessageStatus?)options?.Status,
                     (Svix.Model.StatusCodeClass?)options?.Code,
-                    options?.EventTypes,
                     options?.Channel,
                     options?.Before,
                     options?.After,
-                    idempotencyKey);
+                    options?.EventTypes);
 
                 return lResults?.Data;
             }
@@ -166,18 +162,17 @@ public async Task<List<MessageAttemptOut>> ListAttemptsByEndpointAsync(string ap
         {
             try
             {
-                var lResults = await _messageAttemptApi.ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetAsync(
+                var lResults = await _messageAttemptApi.V1MessageAttemptListByEndpointAsync(
                     appId,
                     endpointId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     (Svix.Model.MessageStatus?)options?.Status,
                     (Svix.Model.StatusCodeClass?)options?.Code,
-                    options?.EventTypes,
                     options?.Channel,
                     options?.Before,
                     options?.After,
-                    idempotencyKey,
+                    options?.EventTypes,
                     cancellationToken);
 
                 return lResults?.Data;
@@ -198,19 +193,18 @@ public List<MessageAttemptOut> ListAttemptsByMessage(string appId, string messag
         {
             try
             {
-                var lResults = _messageAttemptApi.ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet(
+                var lResults = _messageAttemptApi.V1MessageAttemptListByMsg(
                     appId,
                     messageId,
-                    options?.EndpointId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     (Svix.Model.MessageStatus?)options?.Status,
                     (Svix.Model.StatusCodeClass?)options?.Code,
-                    options?.EventTypes,
                     options?.Channel,
+                    options?.EndpointId,
                     options?.Before,
                     options?.After,
-                    idempotencyKey);
+                    options?.EventTypes);
 
                 return lResults?.Data;
             }
@@ -230,19 +224,18 @@ public async Task<List<MessageAttemptOut>> ListAttemptsByMessageAsync(string app
         {
             try
             {
-                var lResults = await _messageAttemptApi.ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetAsync(
+                var lResults = await _messageAttemptApi.V1MessageAttemptListByMsgAsync(
                     appId,
                     messageId,
-                    options?.EndpointId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     (Svix.Model.MessageStatus?)options?.Status,
                     (Svix.Model.StatusCodeClass?)options?.Code,
-                    options?.EventTypes,
                     options?.Channel,
+                    options?.EndpointId,
                     options?.Before,
                     options?.After,
-                    idempotencyKey,
+                    options?.EventTypes,
                     cancellationToken);
 
                 return lResults?.Data;
@@ -264,18 +257,17 @@ public List<MessageAttemptEndpointOut> ListAttemptsForEndpoint(string appId, str
         {
             try
             {
-                var lResults = _messageAttemptApi.ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet(
-                    messageId,
+                var lResults = _messageAttemptApi.V1MessageAttemptListByEndpointDeprecated(
                     appId,
+                    messageId,
                     endpointId,
-                    options?.Iterator,
                     options?.Limit,
-                    options?.EventTypes,
+                    options?.Iterator,
                     options?.Channel,
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
                     options?.After,
-                    idempotencyKey);
+                    options?.EventTypes);
 
                 return lResults?.Data;
             }
@@ -297,18 +289,17 @@ public async Task<List<MessageAttemptEndpointOut>> ListAttemptsForEndpointAsync(
         {
             try
             {
-                var lResults = await _messageAttemptApi.ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetAsync(
-                    messageId,
+                var lResults = await _messageAttemptApi.V1MessageAttemptListByEndpointDeprecatedAsync(
                     appId,
+                    messageId,
                     endpointId,
-                    options?.Iterator,
                     options?.Limit,
-                    options?.EventTypes?.ToList(),
+                    options?.Iterator,
                     options?.Channel,
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
                     options?.After,
-                    idempotencyKey,
+                    options?.EventTypes?.ToList(),
                     cancellationToken);
 
                 return lResults?.Data;
@@ -330,18 +321,18 @@ public List<MessageAttemptOut> ListAttempts(string appId, string messageId, Mess
         {
             try
             {
-                var lResults = _messageAttemptApi.ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGet(
+                var lResults = _messageAttemptApi.V1MessageAttemptListByMsgDeprecated(
                     appId,
                     messageId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     options?.EndpointId,
-                    options?.EventTypes,
                     options?.Channel,
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
                     options?.After,
-                    idempotencyKey);
+                    null,
+                    options?.EventTypes);
 
                 return lResults?.Data;
             }
@@ -362,18 +353,18 @@ public async Task<List<MessageAttemptOut>> ListAttemptsAsync(string appId, strin
         {
             try
             {
-                var lResults = await _messageAttemptApi.ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetAsync(
+                var lResults = await _messageAttemptApi.V1MessageAttemptListByMsgDeprecatedAsync(
                     appId,
                     messageId,
-                    options?.Iterator,
                     options?.Limit,
+                    options?.Iterator,
                     options?.EndpointId,
-                    options?.EventTypes,
                     options?.Channel,
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
                     options?.After,
-                    idempotencyKey,
+                    null,
+                    options?.EventTypes,
                     cancellationToken);
 
                 return lResults?.Data;
@@ -394,12 +385,11 @@ public List<MessageEndpointOut> ListAttemptedDestinations(string appId, string m
         {
             try
             {
-                var lResults = _messageAttemptApi.ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet(
-                    messageId,
+                var lResults = _messageAttemptApi.V1MessageAttemptListAttemptedDestinations(
                     appId,
-                    options?.Iterator,
+                    messageId,
                     options?.Limit,
-                    idempotencyKey);
+                    options?.Iterator);
 
                 return lResults?.Data;
             }
@@ -420,12 +410,11 @@ public async Task<List<MessageEndpointOut>> ListAttemptedDestinationsAsync(strin
         {
             try
             {
-                var lResults = await _messageAttemptApi.ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetAsync(
-                    messageId,
+                var lResults = await _messageAttemptApi.V1MessageAttemptListAttemptedDestinationsAsync(
                     appId,
-                    options?.Iterator,
+                    messageId,
                     options?.Limit,
-                    idempotencyKey,
+                    options?.Iterator,
                     cancellationToken);
 
                 return lResults?.Data;
@@ -445,10 +434,10 @@ public bool ResendWebhook(string appId, string messageId, string endpointId, str
         {
             try
             {
-                var lResponse = _messageAttemptApi.ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostWithHttpInfo(
-                    endpointId,
-                    messageId,
+                var lResponse = _messageAttemptApi.V1MessageAttemptResendWithHttpInfo(
                     appId,
+                    messageId,
+                    endpointId,
                     idempotencyKey);
 
                 return lResponse.StatusCode == HttpStatusCode.Accepted;
@@ -469,11 +458,12 @@ public async Task<bool> ResendWebhookAsync(string appId, string messageId, strin
         {
             try
             {
-                var lResponse = await _messageAttemptApi.ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostWithHttpInfoAsync(
-                    endpointId,
-                    messageId,
+                var lResponse = await _messageAttemptApi.V1MessageAttemptResendWithHttpInfoAsync(
                     appId,
-                    idempotencyKey);
+                    messageId,
+                    endpointId,
+                    idempotencyKey,
+                    cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.Accepted;
             }
@@ -492,11 +482,10 @@ public bool ExpungeContent(string appId, string messageId, string attemptId, str
         {
             try
             {
-                var lResponse = _messageAttemptApi.ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteWithHttpInfo(
-                    attemptId,
-                    messageId,
+                var lResponse = _messageAttemptApi.V1MessageAttemptExpungeContentWithHttpInfo(
                     appId,
-                    idempotencyKey);
+                    messageId,
+                    attemptId);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
             }
@@ -515,11 +504,10 @@ public async Task<bool> ExpungeContentAsync(string appId, string messageId, stri
         {
             try
             {
-                var lResponse = await _messageAttemptApi.ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteWithHttpInfoAsync(
-                    attemptId,
-                    messageId,
+                var lResponse = await _messageAttemptApi.V1MessageAttemptExpungeContentWithHttpInfoAsync(
                     appId,
-                    idempotencyKey,
+                    messageId,
+                    attemptId,
                     cancellationToken);
 
                 return lResponse.StatusCode == HttpStatusCode.NoContent;
diff --git a/csharp/Svix/Models/BackgroundTaskListOptions.cs b/csharp/Svix/Models/BackgroundTaskListOptions.cs
new file mode 100644
index 000000000..7eca55b9d
--- /dev/null
+++ b/csharp/Svix/Models/BackgroundTaskListOptions.cs
@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using Svix.Model;
+
+namespace Svix.Models
+{
+    public sealed class BackgroundTaskListOptions : ListOptions
+    {
+        public BackgroundTaskStatus? Status { get; set; }
+
+        public BackgroundTaskType? Task { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/csharp/Svix/Models/EndpointStatsOptions.cs b/csharp/Svix/Models/EndpointStatsOptions.cs
new file mode 100644
index 000000000..5fdab4119
--- /dev/null
+++ b/csharp/Svix/Models/EndpointStatsOptions.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Collections.Generic;
+
+namespace Svix.Models
+{
+    public sealed class EndpointStatsOptions
+    {
+        public DateTime? Since { get; set; }
+
+        public DateTime? Until { get; set; }
+    }
+}
\ No newline at end of file
diff --git a/csharp/Svix/Models/MessageAttemptListOptions.cs b/csharp/Svix/Models/MessageAttemptListOptions.cs
index d5ee02319..bac490651 100644
--- a/csharp/Svix/Models/MessageAttemptListOptions.cs
+++ b/csharp/Svix/Models/MessageAttemptListOptions.cs
@@ -16,5 +16,7 @@ public class MessageAttemptListOptions : ListOptions
         public DateTime? Before { get; set; }
 
         public DateTime? After { get; set; }
+
+        public bool? WithContent { get; set; }
     }
 }
\ No newline at end of file
diff --git a/csharp/Svix/Models/MessageListOptions.cs b/csharp/Svix/Models/MessageListOptions.cs
index c47cb3644..7b273367d 100644
--- a/csharp/Svix/Models/MessageListOptions.cs
+++ b/csharp/Svix/Models/MessageListOptions.cs
@@ -12,5 +12,7 @@ public sealed class MessageListOptions : ListOptions
         public DateTime? Before { get; set; }
 
         public DateTime? After { get; set; }
+
+        public bool? WithContent { get; set; }
     }
 }
\ No newline at end of file
diff --git a/csharp/Svix/Svix.csproj b/csharp/Svix/Svix.csproj
index ba4485477..fbbabb215 100644
--- a/csharp/Svix/Svix.csproj
+++ b/csharp/Svix/Svix.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <TargetFrameworks>net5.0;netstandard2.0</TargetFrameworks>
     <PackageId>Svix</PackageId>
-    <Version>0.81.0</Version>
+    <Version>1.4.12</Version>
     <Authors>Svix</Authors>
     <Company>Svix</Company>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
diff --git a/go/application.go b/go/application.go
index 2746bee5c..9698dabed 100644
--- a/go/application.go
+++ b/go/application.go
@@ -23,7 +23,7 @@ type ApplicationListOptions struct {
 }
 
 func (a *Application) List(ctx context.Context, options *ApplicationListOptions) (*ListResponseApplicationOut, error) {
-	req := a.api.ApplicationApi.ListApplicationsApiV1AppGet(ctx)
+	req := a.api.ApplicationApi.V1ApplicationList(ctx)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -48,7 +48,7 @@ func (a *Application) Create(ctx context.Context, applicationIn *ApplicationIn)
 }
 
 func (a *Application) CreateWithOptions(ctx context.Context, applicationIn *ApplicationIn, options *PostOptions) (*ApplicationOut, error) {
-	req := a.api.ApplicationApi.CreateApplicationApiV1AppPost(ctx)
+	req := a.api.ApplicationApi.V1ApplicationCreate(ctx)
 	req = req.ApplicationIn(openapi.ApplicationIn(*applicationIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -68,7 +68,7 @@ func (a *Application) GetOrCreate(ctx context.Context, applicationIn *Applicatio
 }
 
 func (a *Application) GetOrCreateWithOptions(ctx context.Context, applicationIn *ApplicationIn, options *PostOptions) (*ApplicationOut, error) {
-	req := a.api.ApplicationApi.CreateApplicationApiV1AppPost(ctx)
+	req := a.api.ApplicationApi.V1ApplicationCreate(ctx)
 	req = req.ApplicationIn(openapi.ApplicationIn(*applicationIn))
 	req = req.GetIfExists(true)
 	if options != nil {
@@ -85,7 +85,7 @@ func (a *Application) GetOrCreateWithOptions(ctx context.Context, applicationIn
 }
 
 func (a *Application) Get(ctx context.Context, appId string) (*ApplicationOut, error) {
-	req := a.api.ApplicationApi.GetApplicationApiV1AppAppIdGet(ctx, appId)
+	req := a.api.ApplicationApi.V1ApplicationGet(ctx, appId)
 	resp, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -95,7 +95,7 @@ func (a *Application) Get(ctx context.Context, appId string) (*ApplicationOut, e
 }
 
 func (a *Application) Update(ctx context.Context, appId string, applicationIn *ApplicationIn) (*ApplicationOut, error) {
-	req := a.api.ApplicationApi.UpdateApplicationApiV1AppAppIdPut(ctx, appId)
+	req := a.api.ApplicationApi.V1ApplicationUpdate(ctx, appId)
 	req = req.ApplicationIn(openapi.ApplicationIn(*applicationIn))
 	resp, res, err := req.Execute()
 	if err != nil {
@@ -106,7 +106,7 @@ func (a *Application) Update(ctx context.Context, appId string, applicationIn *A
 }
 
 func (a *Application) Delete(ctx context.Context, appId string) error {
-	req := a.api.ApplicationApi.DeleteApplicationApiV1AppAppIdDelete(ctx, appId)
+	req := a.api.ApplicationApi.V1ApplicationDelete(ctx, appId)
 	res, err := req.Execute()
 	return wrapError(err, res)
 }
diff --git a/go/authentication.go b/go/authentication.go
index a056da416..0d4535a9e 100644
--- a/go/authentication.go
+++ b/go/authentication.go
@@ -21,7 +21,7 @@ func (a *Authentication) AppPortalAccess(ctx context.Context, appId string, appP
 }
 
 func (a *Authentication) AppPortalAccessWithOptions(ctx context.Context, appId string, appPortalAccessIn *AppPortalAccessIn, options *PostOptions) (*AppPortalAccessOut, error) {
-	req := a.api.AuthenticationApi.GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPost(ctx, appId)
+	req := a.api.AuthenticationApi.V1AuthenticationAppPortalAccess(ctx, appId)
 	req = req.AppPortalAccessIn(openapi.AppPortalAccessIn(*appPortalAccessIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -41,7 +41,7 @@ func (a *Authentication) DashboardAccess(ctx context.Context, appId string) (*Da
 }
 
 func (a *Authentication) DashboardAccessWithOptions(ctx context.Context, appId string, options *PostOptions) (*DashboardAccessOut, error) {
-	req := a.api.AuthenticationApi.GetDashboardAccessApiV1AuthDashboardAccessAppIdPost(ctx, appId)
+	req := a.api.AuthenticationApi.V1AuthenticationDashboardAccess(ctx, appId)
 	if options != nil {
 		if options.IdempotencyKey != nil {
 			req = req.IdempotencyKey(*options.IdempotencyKey)
@@ -60,7 +60,7 @@ func (a *Authentication) Logout(ctx context.Context) error {
 }
 
 func (a *Authentication) LogoutWithOptions(ctx context.Context, options *PostOptions) error {
-	req := a.api.AuthenticationApi.LogoutApiV1AuthLogoutPost(ctx)
+	req := a.api.AuthenticationApi.V1AuthenticationLogout(ctx)
 	if options != nil {
 		if options.IdempotencyKey != nil {
 			req = req.IdempotencyKey(*options.IdempotencyKey)
diff --git a/go/backgroundtask.go b/go/backgroundtask.go
new file mode 100644
index 000000000..65b3fa967
--- /dev/null
+++ b/go/backgroundtask.go
@@ -0,0 +1,61 @@
+package svix
+
+import (
+	"context"
+
+	"github.com/svix/svix-webhooks/go/internal/openapi"
+)
+
+type (
+	ListResponseBackgroundTaskOut openapi.ListResponseBackgroundTaskOut
+	BackgroundTaskOut             openapi.BackgroundTaskOut
+)
+
+type BackgroundTask struct {
+	api *openapi.APIClient
+}
+
+type BackgroundTaskListOptions struct {
+	Iterator *string
+	Limit    *int32
+	Order    *Ordering
+	Status   *openapi.BackgroundTaskStatus
+	Task     *openapi.BackgroundTaskType
+}
+
+func (a *BackgroundTask) List(ctx context.Context, options *BackgroundTaskListOptions) (*ListResponseBackgroundTaskOut, error) {
+	req := a.api.BackgroundTasksApi.ListBackgroundTasks(ctx)
+	if options != nil {
+		if options.Iterator != nil {
+			req = req.Iterator(*options.Iterator)
+		}
+		if options.Limit != nil {
+			req = req.Limit(*options.Limit)
+		}
+		if options.Order != nil {
+			req = req.Order(openapi.Ordering(*options.Order))
+		}
+		if options.Status != nil {
+			req = req.Status(*options.Status)
+		}
+		if options.Task != nil {
+			req = req.Task(*options.Task)
+		}
+	}
+	resp, res, err := req.Execute()
+	if err != nil {
+		return nil, wrapError(err, res)
+	}
+	ret := ListResponseBackgroundTaskOut(resp)
+	return &ret, nil
+}
+
+func (a *BackgroundTask) Get(ctx context.Context, taskId string) (*BackgroundTaskOut, error) {
+	req := a.api.BackgroundTasksApi.GetBackgroundTask(ctx, taskId)
+	resp, res, err := req.Execute()
+	if err != nil {
+		return nil, wrapError(err, res)
+	}
+	ret := BackgroundTaskOut(resp)
+	return &ret, nil
+}
diff --git a/go/endpoint.go b/go/endpoint.go
index 10e520787..22f96377a 100644
--- a/go/endpoint.go
+++ b/go/endpoint.go
@@ -2,6 +2,7 @@ package svix
 
 import (
 	"context"
+	"time"
 
 	"github.com/svix/svix-webhooks/go/internal/openapi"
 )
@@ -21,6 +22,7 @@ type (
 	EndpointHeadersOut        openapi.EndpointHeadersOut
 	EndpointStats             openapi.EndpointStats
 	EndpointTransformationOut openapi.EndpointTransformationOut
+	EventExampleIn            openapi.EventExampleIn
 	Ordering                  openapi.Ordering
 )
 
@@ -34,8 +36,13 @@ type EndpointListOptions struct {
 	Order    *Ordering
 }
 
+type EndpointStatsOptions struct {
+	Since *time.Time
+	Until *time.Time
+}
+
 func (e *Endpoint) List(ctx context.Context, appId string, options *EndpointListOptions) (*ListResponseEndpointOut, error) {
-	req := e.api.EndpointApi.ListEndpointsApiV1AppAppIdEndpointGet(ctx, appId)
+	req := e.api.EndpointApi.V1EndpointList(ctx, appId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -60,7 +67,7 @@ func (e *Endpoint) Create(ctx context.Context, appId string, endpointIn *Endpoin
 }
 
 func (e *Endpoint) CreateWithOptions(ctx context.Context, appId string, endpointIn *EndpointIn, options *PostOptions) (*EndpointOut, error) {
-	req := e.api.EndpointApi.CreateEndpointApiV1AppAppIdEndpointPost(ctx, appId)
+	req := e.api.EndpointApi.V1EndpointCreate(ctx, appId)
 	req = req.EndpointIn(openapi.EndpointIn(*endpointIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -76,7 +83,7 @@ func (e *Endpoint) CreateWithOptions(ctx context.Context, appId string, endpoint
 }
 
 func (e *Endpoint) Get(ctx context.Context, appId string, endpointId string) (*EndpointOut, error) {
-	req := e.api.EndpointApi.GetEndpointApiV1AppAppIdEndpointEndpointIdGet(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointGet(ctx, appId, endpointId)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -86,7 +93,7 @@ func (e *Endpoint) Get(ctx context.Context, appId string, endpointId string) (*E
 }
 
 func (e *Endpoint) Update(ctx context.Context, appId string, endpointId string, endpointUpdate *EndpointUpdate) (*EndpointOut, error) {
-	req := e.api.EndpointApi.UpdateEndpointApiV1AppAppIdEndpointEndpointIdPut(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointUpdate(ctx, appId, endpointId)
 	req = req.EndpointUpdate(openapi.EndpointUpdate(*endpointUpdate))
 	out, res, err := req.Execute()
 	if err != nil {
@@ -97,13 +104,13 @@ func (e *Endpoint) Update(ctx context.Context, appId string, endpointId string,
 }
 
 func (e *Endpoint) Delete(ctx context.Context, appId string, endpointId string) error {
-	req := e.api.EndpointApi.DeleteEndpointApiV1AppAppIdEndpointEndpointIdDelete(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointDelete(ctx, appId, endpointId)
 	res, err := req.Execute()
 	return wrapError(err, res)
 }
 
 func (e *Endpoint) GetSecret(ctx context.Context, appId string, endpointId string) (*EndpointSecretOut, error) {
-	req := e.api.EndpointApi.GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointGetSecret(ctx, appId, endpointId)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -117,7 +124,7 @@ func (e *Endpoint) RotateSecret(ctx context.Context, appId string, endpointId st
 }
 
 func (e *Endpoint) RotateSecretWithOptions(ctx context.Context, appId string, endpointId string, endpointSecretRotateIn *EndpointSecretRotateIn, options *PostOptions) error {
-	req := e.api.EndpointApi.RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointRotateSecret(ctx, appId, endpointId)
 	req = req.EndpointSecretRotateIn(openapi.EndpointSecretRotateIn(*endpointSecretRotateIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -136,7 +143,7 @@ func (e *Endpoint) Recover(ctx context.Context, appId string, endpointId string,
 }
 
 func (e *Endpoint) RecoverWithOptions(ctx context.Context, appId string, endpointId string, recoverIn *RecoverIn, options *PostOptions) error {
-	req := e.api.EndpointApi.RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost(ctx, appId, endpointId)
+	req := e.api.EndpointApi.V1EndpointRecover(ctx, appId, endpointId)
 	req = req.RecoverIn(openapi.RecoverIn(*recoverIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -151,7 +158,7 @@ func (e *Endpoint) RecoverWithOptions(ctx context.Context, appId string, endpoin
 }
 
 func (e *Endpoint) GetHeaders(ctx context.Context, appId string, endpointId string) (*EndpointHeadersOut, error) {
-	req := e.api.EndpointApi.GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointGetHeaders(ctx, appId, endpointId)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -161,7 +168,7 @@ func (e *Endpoint) GetHeaders(ctx context.Context, appId string, endpointId stri
 }
 
 func (e *Endpoint) UpdateHeaders(ctx context.Context, appId string, endpointId string, endpointHeadersIn *EndpointHeadersIn) error {
-	req := e.api.EndpointApi.UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut(ctx, appId, endpointId)
+	req := e.api.EndpointApi.V1EndpointUpdateHeaders(ctx, appId, endpointId)
 	req = req.EndpointHeadersIn(openapi.EndpointHeadersIn(*endpointHeadersIn))
 	res, err := req.Execute()
 	if err != nil {
@@ -171,7 +178,7 @@ func (e *Endpoint) UpdateHeaders(ctx context.Context, appId string, endpointId s
 }
 
 func (e *Endpoint) PatchHeaders(ctx context.Context, appId string, endpointId string, endpointHeadersIn *EndpointHeadersPatchIn) error {
-	req := e.api.EndpointApi.PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch(ctx, appId, endpointId)
+	req := e.api.EndpointApi.V1EndpointPatchHeaders(ctx, appId, endpointId)
 	req = req.EndpointHeadersPatchIn(openapi.EndpointHeadersPatchIn(*endpointHeadersIn))
 	res, err := req.Execute()
 	if err != nil {
@@ -181,7 +188,17 @@ func (e *Endpoint) PatchHeaders(ctx context.Context, appId string, endpointId st
 }
 
 func (e *Endpoint) GetStats(ctx context.Context, appId string, endpointId string) (*EndpointStats, error) {
-	req := e.api.EndpointApi.GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet(ctx, endpointId, appId)
+	return e.GetStatsWithOptions(ctx, appId, endpointId, EndpointStatsOptions{})
+}
+
+func (e *Endpoint) GetStatsWithOptions(ctx context.Context, appId string, endpointId string, options EndpointStatsOptions) (*EndpointStats, error) {
+	req := e.api.EndpointApi.V1EndpointGetStats(ctx, appId, endpointId)
+	if options.Since != nil {
+		req = req.Since(*options.Since)
+	}
+	if options.Until != nil {
+		req = req.Until(*options.Until)
+	}
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -201,7 +218,7 @@ func (e *Endpoint) ReplayMissingWithOptions(
 	replayIn *ReplayIn,
 	options *PostOptions,
 ) error {
-	req := e.api.EndpointApi.ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPost(ctx, appId, endpointId)
+	req := e.api.EndpointApi.V1EndpointReplay(ctx, appId, endpointId)
 	req.ReplayIn(openapi.ReplayIn(*replayIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -216,7 +233,7 @@ func (e *Endpoint) ReplayMissingWithOptions(
 }
 
 func (e *Endpoint) TransformationGet(ctx context.Context, appId string, endpointId string) (*EndpointTransformationOut, error) {
-	req := e.api.EndpointApi.GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet(ctx, endpointId, appId)
+	req := e.api.EndpointApi.V1EndpointTransformationGet(ctx, appId, endpointId)
 
 	out, res, err := req.Execute()
 	if err != nil {
@@ -228,7 +245,7 @@ func (e *Endpoint) TransformationGet(ctx context.Context, appId string, endpoint
 }
 
 func (e *Endpoint) TransformatioPartialUpdate(ctx context.Context, appId string, endpointId string, transformation *EndpointTransformationIn) error {
-	req := e.api.EndpointApi.SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch(ctx, appId, endpointId)
+	req := e.api.EndpointApi.V1EndpointTransformationPartialUpdate(ctx, appId, endpointId)
 	req.EndpointTransformationIn(openapi.EndpointTransformationIn(*transformation))
 
 	res, err := req.Execute()
@@ -238,3 +255,32 @@ func (e *Endpoint) TransformatioPartialUpdate(ctx context.Context, appId string,
 
 	return nil
 }
+
+func (e *Endpoint) SendExample(ctx context.Context, appId string, endpointId string, eventExampleIn *EventExampleIn) (*MessageOut, error) {
+	return e.SendExampleWithOptions(ctx, appId, endpointId, eventExampleIn, nil)
+}
+
+func (e *Endpoint) SendExampleWithOptions(
+	ctx context.Context,
+	appId string,
+	endpointId string,
+	eventExampleIn *EventExampleIn,
+	options *PostOptions,
+) (*MessageOut, error) {
+	req := e.api.EndpointApi.V1EndpointSendExample(ctx, appId, endpointId)
+	req.EventExampleIn(openapi.EventExampleIn(*eventExampleIn))
+
+	if options != nil {
+		if options.IdempotencyKey != nil {
+			req.IdempotencyKey(*options.IdempotencyKey)
+		}
+	}
+
+	out, res, err := req.Execute()
+	if err != nil {
+		return nil, wrapError(err, res)
+	}
+
+	ret := MessageOut(out)
+	return &ret, nil
+}
diff --git a/go/eventtype.go b/go/eventtype.go
index 288c49803..ab677ef0e 100644
--- a/go/eventtype.go
+++ b/go/eventtype.go
@@ -25,7 +25,7 @@ type EventTypeListOptions struct {
 }
 
 func (e *EventType) List(ctx context.Context, options *EventTypeListOptions) (*ListResponseEventTypeOut, error) {
-	req := e.api.EventTypeApi.ListEventTypesApiV1EventTypeGet(ctx)
+	req := e.api.EventTypeApi.V1EventTypeList(ctx)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -53,7 +53,7 @@ func (e *EventType) Create(ctx context.Context, eventTypeIn *EventTypeIn) (*Even
 }
 
 func (e *EventType) CreateWithOptions(ctx context.Context, eventTypeIn *EventTypeIn, options *PostOptions) (*EventTypeOut, error) {
-	req := e.api.EventTypeApi.CreateEventTypeApiV1EventTypePost(ctx)
+	req := e.api.EventTypeApi.V1EventTypeCreate(ctx)
 	req = req.EventTypeIn(openapi.EventTypeIn(*eventTypeIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -69,7 +69,7 @@ func (e *EventType) CreateWithOptions(ctx context.Context, eventTypeIn *EventTyp
 }
 
 func (e *EventType) Get(ctx context.Context, eventTypeName string) (*EventTypeOut, error) {
-	req := e.api.EventTypeApi.GetEventTypeApiV1EventTypeEventTypeNameGet(ctx, eventTypeName)
+	req := e.api.EventTypeApi.V1EventTypeGet(ctx, eventTypeName)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -79,7 +79,7 @@ func (e *EventType) Get(ctx context.Context, eventTypeName string) (*EventTypeOu
 }
 
 func (e *EventType) Update(ctx context.Context, eventTypeName string, eventTypeUpdate *EventTypeUpdate) (*EventTypeOut, error) {
-	req := e.api.EventTypeApi.UpdateEventTypeApiV1EventTypeEventTypeNamePut(ctx, eventTypeName)
+	req := e.api.EventTypeApi.V1EventTypeUpdate(ctx, eventTypeName)
 	req = req.EventTypeUpdate(openapi.EventTypeUpdate(*eventTypeUpdate))
 	out, res, err := req.Execute()
 	if err != nil {
@@ -90,7 +90,7 @@ func (e *EventType) Update(ctx context.Context, eventTypeName string, eventTypeU
 }
 
 func (e *EventType) Delete(ctx context.Context, eventTypeName string) error {
-	req := e.api.EventTypeApi.DeleteEventTypeApiV1EventTypeEventTypeNameDelete(ctx, eventTypeName)
+	req := e.api.EventTypeApi.V1EventTypeDelete(ctx, eventTypeName)
 	res, err := req.Execute()
 	return wrapError(err, res)
 }
diff --git a/go/integration.go b/go/integration.go
index 707d42259..4914226df 100644
--- a/go/integration.go
+++ b/go/integration.go
@@ -24,7 +24,7 @@ type IntegrationListOptions struct {
 }
 
 func (e *Integration) List(ctx context.Context, appId string, options *IntegrationListOptions) (*ListResponseIntegrationOut, error) {
-	req := e.api.IntegrationApi.ListIntegrationsApiV1AppAppIdIntegrationGet(ctx, appId)
+	req := e.api.IntegrationApi.V1IntegrationList(ctx, appId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -46,7 +46,7 @@ func (e *Integration) Create(ctx context.Context, appId string, endpointIn *Inte
 }
 
 func (e *Integration) CreateWithOptions(ctx context.Context, appId string, endpointIn *IntegrationIn, options *PostOptions) (*IntegrationOut, error) {
-	req := e.api.IntegrationApi.CreateIntegrationApiV1AppAppIdIntegrationPost(ctx, appId)
+	req := e.api.IntegrationApi.V1IntegrationCreate(ctx, appId)
 	req = req.IntegrationIn(openapi.IntegrationIn(*endpointIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -62,7 +62,7 @@ func (e *Integration) CreateWithOptions(ctx context.Context, appId string, endpo
 }
 
 func (e *Integration) Get(ctx context.Context, appId string, integId string) (*IntegrationOut, error) {
-	req := e.api.IntegrationApi.GetIntegrationApiV1AppAppIdIntegrationIntegIdGet(ctx, integId, appId)
+	req := e.api.IntegrationApi.V1IntegrationGet(ctx, appId, integId)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -72,7 +72,7 @@ func (e *Integration) Get(ctx context.Context, appId string, integId string) (*I
 }
 
 func (e *Integration) Update(ctx context.Context, appId string, integId string, endpointUpdate *IntegrationUpdate) (*IntegrationOut, error) {
-	req := e.api.IntegrationApi.UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPut(ctx, integId, appId)
+	req := e.api.IntegrationApi.V1IntegrationUpdate(ctx, appId, integId)
 	req = req.IntegrationUpdate(openapi.IntegrationUpdate(*endpointUpdate))
 	out, res, err := req.Execute()
 	if err != nil {
@@ -83,13 +83,13 @@ func (e *Integration) Update(ctx context.Context, appId string, integId string,
 }
 
 func (e *Integration) Delete(ctx context.Context, appId string, integId string) error {
-	req := e.api.IntegrationApi.DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete(ctx, integId, appId)
+	req := e.api.IntegrationApi.V1IntegrationDelete(ctx, appId, integId)
 	res, err := req.Execute()
 	return wrapError(err, res)
 }
 
 func (e *Integration) GetKey(ctx context.Context, appId string, integId string) (*IntegrationKeyOut, error) {
-	req := e.api.IntegrationApi.GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet(ctx, integId, appId)
+	req := e.api.IntegrationApi.V1IntegrationGetKey(ctx, appId, integId)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -103,7 +103,7 @@ func (e *Integration) RotateKey(ctx context.Context, appId string, integId strin
 }
 
 func (e *Integration) RotateKeyWithOptions(ctx context.Context, appId string, integId string, options *PostOptions) (*IntegrationKeyOut, error) {
-	req := e.api.IntegrationApi.RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost(ctx, integId, appId)
+	req := e.api.IntegrationApi.V1IntegrationRotateKey(ctx, appId, integId)
 	if options != nil {
 		if options.IdempotencyKey != nil {
 			req = req.IdempotencyKey(*options.IdempotencyKey)
diff --git a/go/internal/openapi/api_application.go b/go/internal/openapi/api_application.go
index d71a5044e..cf700dd3e 100644
--- a/go/internal/openapi/api_application.go
+++ b/go/internal/openapi/api_application.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -28,39 +28,44 @@ var (
 // ApplicationApiService ApplicationApi service
 type ApplicationApiService service
 
-type ApiCreateApplicationApiV1AppPostRequest struct {
+type ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
-	applicationIn *ApplicationIn
-	getIfExists *bool
-	idempotencyKey *string
+	since *time.Time
+	until *time.Time
+	limit *int32
+	iterator *string
 }
 
-func (r ApiCreateApplicationApiV1AppPostRequest) ApplicationIn(applicationIn ApplicationIn) ApiCreateApplicationApiV1AppPostRequest {
-	r.applicationIn = &applicationIn
+func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Since(since time.Time) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
+	r.since = &since
 	return r
 }
-func (r ApiCreateApplicationApiV1AppPostRequest) GetIfExists(getIfExists bool) ApiCreateApplicationApiV1AppPostRequest {
-	r.getIfExists = &getIfExists
+func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Until(until time.Time) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
+	r.until = &until
 	return r
 }
-func (r ApiCreateApplicationApiV1AppPostRequest) IdempotencyKey(idempotencyKey string) ApiCreateApplicationApiV1AppPostRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Limit(limit int32) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
+	r.limit = &limit
+	return r
+}
+func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Iterator(iterator string) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
+	r.iterator = &iterator
 	return r
 }
 
-func (r ApiCreateApplicationApiV1AppPostRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
-	return r.ApiService.CreateApplicationApiV1AppPostExecute(r)
+func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Execute() (ListResponseApplicationStats, *_nethttp.Response, error) {
+	return r.ApiService.GetAppUsageStatsApiV1AppStatsUsageGetExecute(r)
 }
 
 /*
- * CreateApplicationApiV1AppPost Create Application
- * Create a new application.
+ * GetAppUsageStatsApiV1AppStatsUsageGet Get App Usage Stats
+ * Get basic statistics for all applications.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiCreateApplicationApiV1AppPostRequest
+ * @return ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest
  */
-func (a *ApplicationApiService) CreateApplicationApiV1AppPost(ctx _context.Context) ApiCreateApplicationApiV1AppPostRequest {
-	return ApiCreateApplicationApiV1AppPostRequest{
+func (a *ApplicationApiService) GetAppUsageStatsApiV1AppStatsUsageGet(ctx _context.Context) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
+	return ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -68,37 +73,45 @@ func (a *ApplicationApiService) CreateApplicationApiV1AppPost(ctx _context.Conte
 
 /*
  * Execute executes the request
- * @return ApplicationOut
+ * @return ListResponseApplicationStats
  */
-func (a *ApplicationApiService) CreateApplicationApiV1AppPostExecute(r ApiCreateApplicationApiV1AppPostRequest) (ApplicationOut, *_nethttp.Response, error) {
+func (a *ApplicationApiService) GetAppUsageStatsApiV1AppStatsUsageGetExecute(r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) (ListResponseApplicationStats, *_nethttp.Response, error) {
 	var (
-		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  ApplicationOut
+		localVarReturnValue  ListResponseApplicationStats
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.CreateApplicationApiV1AppPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.GetAppUsageStatsApiV1AppStatsUsageGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/"
+	localVarPath := localBasePath + "/api/v1/app/stats/usage/"
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if r.applicationIn == nil {
-		return localVarReturnValue, nil, reportError("applicationIn is required and must be specified")
+	if r.since == nil {
+		return localVarReturnValue, nil, reportError("since is required and must be specified")
+	}
+	if r.until == nil {
+		return localVarReturnValue, nil, reportError("until is required and must be specified")
 	}
 
-	if r.getIfExists != nil {
-		localVarQueryParams.Add("get_if_exists", parameterToString(*r.getIfExists, ""))
+	localVarQueryParams.Add("since", parameterToString(*r.since, ""))
+	localVarQueryParams.Add("until", parameterToString(*r.until, ""))
+	if r.limit != nil {
+		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
 	}
 	// to determine the Content-Type header
-	localVarHTTPContentTypes := []string{"application/json"}
+	localVarHTTPContentTypes := []string{}
 
 	// set Content-Type header
 	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
@@ -114,11 +127,6 @@ func (a *ApplicationApiService) CreateApplicationApiV1AppPostExecute(r ApiCreate
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
-	// body params
-	localVarPostBody = r.applicationIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -215,31 +223,31 @@ func (a *ApplicationApiService) CreateApplicationApiV1AppPostExecute(r ApiCreate
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiDeleteApplicationApiV1AppAppIdDeleteRequest struct {
+type ApiPatchApplicationRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
 	appId string
-	idempotencyKey *string
+	applicationPatch *ApplicationPatch
 }
 
-func (r ApiDeleteApplicationApiV1AppAppIdDeleteRequest) IdempotencyKey(idempotencyKey string) ApiDeleteApplicationApiV1AppAppIdDeleteRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiPatchApplicationRequest) ApplicationPatch(applicationPatch ApplicationPatch) ApiPatchApplicationRequest {
+	r.applicationPatch = &applicationPatch
 	return r
 }
 
-func (r ApiDeleteApplicationApiV1AppAppIdDeleteRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.DeleteApplicationApiV1AppAppIdDeleteExecute(r)
+func (r ApiPatchApplicationRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
+	return r.ApiService.PatchApplicationExecute(r)
 }
 
 /*
- * DeleteApplicationApiV1AppAppIdDelete Delete Application
- * Delete an application.
+ * PatchApplication Patch Application
+ * Partially update an application.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiDeleteApplicationApiV1AppAppIdDeleteRequest
+ * @param appId The app's ID or UID
+ * @return ApiPatchApplicationRequest
  */
-func (a *ApplicationApiService) DeleteApplicationApiV1AppAppIdDelete(ctx _context.Context, appId string) ApiDeleteApplicationApiV1AppAppIdDeleteRequest {
-	return ApiDeleteApplicationApiV1AppAppIdDeleteRequest{
+func (a *ApplicationApiService) PatchApplication(ctx _context.Context, appId string) ApiPatchApplicationRequest {
+	return ApiPatchApplicationRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -248,19 +256,21 @@ func (a *ApplicationApiService) DeleteApplicationApiV1AppAppIdDelete(ctx _contex
 
 /*
  * Execute executes the request
+ * @return ApplicationOut
  */
-func (a *ApplicationApiService) DeleteApplicationApiV1AppAppIdDeleteExecute(r ApiDeleteApplicationApiV1AppAppIdDeleteRequest) (*_nethttp.Response, error) {
+func (a *ApplicationApiService) PatchApplicationExecute(r ApiPatchApplicationRequest) (ApplicationOut, *_nethttp.Response, error) {
 	var (
-		localVarHTTPMethod   = _nethttp.MethodDelete
+		localVarHTTPMethod   = _nethttp.MethodPatch
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
+		localVarReturnValue  ApplicationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.DeleteApplicationApiV1AppAppIdDelete")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.PatchApplication")
 	if err != nil {
-		return nil, GenericOpenAPIError{error: err.Error()}
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/"
@@ -270,14 +280,17 @@ func (a *ApplicationApiService) DeleteApplicationApiV1AppAppIdDeleteExecute(r Ap
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
 	if strlen(r.appId) < 1 {
-		return nil, reportError("appId must have at least 1 elements")
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
-		return nil, reportError("appId must have less than 256 elements")
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	}
+	if r.applicationPatch == nil {
+		return localVarReturnValue, nil, reportError("applicationPatch is required and must be specified")
 	}
 
 	// to determine the Content-Type header
-	localVarHTTPContentTypes := []string{}
+	localVarHTTPContentTypes := []string{"application/json"}
 
 	// set Content-Type header
 	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
@@ -293,24 +306,23 @@ func (a *ApplicationApiService) DeleteApplicationApiV1AppAppIdDeleteExecute(r Ap
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
+	// body params
+	localVarPostBody = r.applicationPatch
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
-		return nil, err
+		return localVarReturnValue, nil, err
 	}
 
 	localVarHTTPResponse, err := a.client.callAPI(req)
 	if err != nil || localVarHTTPResponse == nil {
-		return localVarHTTPResponse, err
+		return localVarReturnValue, localVarHTTPResponse, err
 	}
 
 	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
 	localVarHTTPResponse.Body.Close()
 	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
 	if err != nil {
-		return localVarHTTPResponse, err
+		return localVarReturnValue, localVarHTTPResponse, err
 	}
 
 	if localVarHTTPResponse.StatusCode >= 300 {
@@ -323,149 +335,146 @@ func (a *ApplicationApiService) DeleteApplicationApiV1AppAppIdDeleteExecute(r Ap
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 403 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 404 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 409 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 422 {
 			var v HTTPValidationError
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 429 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
 		}
-		return localVarHTTPResponse, newErr
+		return localVarReturnValue, localVarHTTPResponse, newErr
 	}
 
-	return localVarHTTPResponse, nil
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetAppStatsApiV1AppAppIdStatsGetRequest struct {
+type ApiV1ApplicationCreateRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
-	appId string
-	since *time.Time
-	until *time.Time
+	applicationIn *ApplicationIn
+	getIfExists *bool
 	idempotencyKey *string
 }
 
-func (r ApiGetAppStatsApiV1AppAppIdStatsGetRequest) Since(since time.Time) ApiGetAppStatsApiV1AppAppIdStatsGetRequest {
-	r.since = &since
+func (r ApiV1ApplicationCreateRequest) ApplicationIn(applicationIn ApplicationIn) ApiV1ApplicationCreateRequest {
+	r.applicationIn = &applicationIn
 	return r
 }
-func (r ApiGetAppStatsApiV1AppAppIdStatsGetRequest) Until(until time.Time) ApiGetAppStatsApiV1AppAppIdStatsGetRequest {
-	r.until = &until
+func (r ApiV1ApplicationCreateRequest) GetIfExists(getIfExists bool) ApiV1ApplicationCreateRequest {
+	r.getIfExists = &getIfExists
 	return r
 }
-func (r ApiGetAppStatsApiV1AppAppIdStatsGetRequest) IdempotencyKey(idempotencyKey string) ApiGetAppStatsApiV1AppAppIdStatsGetRequest {
+func (r ApiV1ApplicationCreateRequest) IdempotencyKey(idempotencyKey string) ApiV1ApplicationCreateRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiGetAppStatsApiV1AppAppIdStatsGetRequest) Execute() (ApplicationStats, *_nethttp.Response, error) {
-	return r.ApiService.GetAppStatsApiV1AppAppIdStatsGetExecute(r)
+func (r ApiV1ApplicationCreateRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1ApplicationCreateExecute(r)
 }
 
 /*
- * GetAppStatsApiV1AppAppIdStatsGet Get App Stats
- * Get basic statistics for the application
+ * V1ApplicationCreate Create Application
+ * Create a new application.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiGetAppStatsApiV1AppAppIdStatsGetRequest
+ * @return ApiV1ApplicationCreateRequest
  */
-func (a *ApplicationApiService) GetAppStatsApiV1AppAppIdStatsGet(ctx _context.Context, appId string) ApiGetAppStatsApiV1AppAppIdStatsGetRequest {
-	return ApiGetAppStatsApiV1AppAppIdStatsGetRequest{
+func (a *ApplicationApiService) V1ApplicationCreate(ctx _context.Context) ApiV1ApplicationCreateRequest {
+	return ApiV1ApplicationCreateRequest{
 		ApiService: a,
 		ctx: ctx,
-		appId: appId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return ApplicationStats
+ * @return ApplicationOut
  */
-func (a *ApplicationApiService) GetAppStatsApiV1AppAppIdStatsGetExecute(r ApiGetAppStatsApiV1AppAppIdStatsGetRequest) (ApplicationStats, *_nethttp.Response, error) {
+func (a *ApplicationApiService) V1ApplicationCreateExecute(r ApiV1ApplicationCreateRequest) (ApplicationOut, *_nethttp.Response, error) {
 	var (
-		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  ApplicationStats
+		localVarReturnValue  ApplicationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.GetAppStatsApiV1AppAppIdStatsGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.V1ApplicationCreate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/stats/"
-	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/"
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.appId) < 1 {
-		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
-	}
-	if strlen(r.appId) > 256 {
-		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
-	}
-	if r.since == nil {
-		return localVarReturnValue, nil, reportError("since is required and must be specified")
-	}
-	if r.until == nil {
-		return localVarReturnValue, nil, reportError("until is required and must be specified")
+	if r.applicationIn == nil {
+		return localVarReturnValue, nil, reportError("applicationIn is required and must be specified")
 	}
 
-	localVarQueryParams.Add("since", parameterToString(*r.since, ""))
-	localVarQueryParams.Add("until", parameterToString(*r.until, ""))
+	if r.getIfExists != nil {
+		localVarQueryParams.Add("get_if_exists", parameterToString(*r.getIfExists, ""))
+	}
 	// to determine the Content-Type header
-	localVarHTTPContentTypes := []string{}
+	localVarHTTPContentTypes := []string{"application/json"}
 
 	// set Content-Type header
 	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
@@ -484,6 +493,8 @@ func (a *ApplicationApiService) GetAppStatsApiV1AppAppIdStatsGetExecute(r ApiGet
 	if r.idempotencyKey != nil {
 		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
 	}
+	// body params
+	localVarPostBody = r.applicationIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -580,93 +591,224 @@ func (a *ApplicationApiService) GetAppStatsApiV1AppAppIdStatsGetExecute(r ApiGet
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest struct {
+type ApiV1ApplicationDeleteRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
-	since *time.Time
-	until *time.Time
-	limit *int32
-	iterator *string
-	idempotencyKey *string
+	appId string
 }
 
-func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Since(since time.Time) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
-	r.since = &since
-	return r
-}
-func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Until(until time.Time) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
-	r.until = &until
-	return r
+
+func (r ApiV1ApplicationDeleteRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1ApplicationDeleteExecute(r)
 }
-func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Limit(limit int32) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
-	r.limit = &limit
-	return r
+
+/*
+ * V1ApplicationDelete Delete Application
+ * Delete an application.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param appId The app's ID or UID
+ * @return ApiV1ApplicationDeleteRequest
+ */
+func (a *ApplicationApiService) V1ApplicationDelete(ctx _context.Context, appId string) ApiV1ApplicationDeleteRequest {
+	return ApiV1ApplicationDeleteRequest{
+		ApiService: a,
+		ctx: ctx,
+		appId: appId,
+	}
 }
-func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Iterator(iterator string) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
-	r.iterator = &iterator
-	return r
+
+/*
+ * Execute executes the request
+ */
+func (a *ApplicationApiService) V1ApplicationDeleteExecute(r ApiV1ApplicationDeleteRequest) (*_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodDelete
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.V1ApplicationDelete")
+	if err != nil {
+		return nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/"
+	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if strlen(r.appId) < 1 {
+		return nil, reportError("appId must have at least 1 elements")
+	}
+	if strlen(r.appId) > 256 {
+		return nil, reportError("appId must have less than 256 elements")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarHTTPResponse, newErr
+	}
+
+	return localVarHTTPResponse, nil
 }
-func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) IdempotencyKey(idempotencyKey string) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
+
+type ApiV1ApplicationGetRequest struct {
+	ctx _context.Context
+	ApiService *ApplicationApiService
+	appId string
 }
 
-func (r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) Execute() (ListResponseApplicationStats, *_nethttp.Response, error) {
-	return r.ApiService.GetAppUsageStatsApiV1AppStatsUsageGetExecute(r)
+
+func (r ApiV1ApplicationGetRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1ApplicationGetExecute(r)
 }
 
 /*
- * GetAppUsageStatsApiV1AppStatsUsageGet Get App Usage Stats
- * Get basic statistics for all applications.
+ * V1ApplicationGet Get Application
+ * Get an application.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1ApplicationGetRequest
  */
-func (a *ApplicationApiService) GetAppUsageStatsApiV1AppStatsUsageGet(ctx _context.Context) ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest {
-	return ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest{
+func (a *ApplicationApiService) V1ApplicationGet(ctx _context.Context, appId string) ApiV1ApplicationGetRequest {
+	return ApiV1ApplicationGetRequest{
 		ApiService: a,
 		ctx: ctx,
+		appId: appId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return ListResponseApplicationStats
+ * @return ApplicationOut
  */
-func (a *ApplicationApiService) GetAppUsageStatsApiV1AppStatsUsageGetExecute(r ApiGetAppUsageStatsApiV1AppStatsUsageGetRequest) (ListResponseApplicationStats, *_nethttp.Response, error) {
+func (a *ApplicationApiService) V1ApplicationGetExecute(r ApiV1ApplicationGetRequest) (ApplicationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  ListResponseApplicationStats
+		localVarReturnValue  ApplicationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.GetAppUsageStatsApiV1AppStatsUsageGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.V1ApplicationGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/stats/usage/"
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/"
+	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if r.since == nil {
-		return localVarReturnValue, nil, reportError("since is required and must be specified")
+	if strlen(r.appId) < 1 {
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
-	if r.until == nil {
-		return localVarReturnValue, nil, reportError("until is required and must be specified")
+	if strlen(r.appId) > 256 {
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
 
-	localVarQueryParams.Add("since", parameterToString(*r.since, ""))
-	localVarQueryParams.Add("until", parameterToString(*r.until, ""))
-	if r.limit != nil {
-		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
-	}
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
-	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -684,9 +826,6 @@ func (a *ApplicationApiService) GetAppUsageStatsApiV1AppStatsUsageGetExecute(r A
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -783,31 +922,36 @@ func (a *ApplicationApiService) GetAppUsageStatsApiV1AppStatsUsageGetExecute(r A
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetApplicationApiV1AppAppIdGetRequest struct {
+type ApiV1ApplicationGetStatsRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
+	since *time.Time
+	until *time.Time
 	appId string
-	idempotencyKey *string
 }
 
-func (r ApiGetApplicationApiV1AppAppIdGetRequest) IdempotencyKey(idempotencyKey string) ApiGetApplicationApiV1AppAppIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1ApplicationGetStatsRequest) Since(since time.Time) ApiV1ApplicationGetStatsRequest {
+	r.since = &since
+	return r
+}
+func (r ApiV1ApplicationGetStatsRequest) Until(until time.Time) ApiV1ApplicationGetStatsRequest {
+	r.until = &until
 	return r
 }
 
-func (r ApiGetApplicationApiV1AppAppIdGetRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
-	return r.ApiService.GetApplicationApiV1AppAppIdGetExecute(r)
+func (r ApiV1ApplicationGetStatsRequest) Execute() (ApplicationStats, *_nethttp.Response, error) {
+	return r.ApiService.V1ApplicationGetStatsExecute(r)
 }
 
 /*
- * GetApplicationApiV1AppAppIdGet Get Application
- * Get an application.
+ * V1ApplicationGetStats Get App Stats
+ * Get basic statistics for the application
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiGetApplicationApiV1AppAppIdGetRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1ApplicationGetStatsRequest
  */
-func (a *ApplicationApiService) GetApplicationApiV1AppAppIdGet(ctx _context.Context, appId string) ApiGetApplicationApiV1AppAppIdGetRequest {
-	return ApiGetApplicationApiV1AppAppIdGetRequest{
+func (a *ApplicationApiService) V1ApplicationGetStats(ctx _context.Context, appId string) ApiV1ApplicationGetStatsRequest {
+	return ApiV1ApplicationGetStatsRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -816,29 +960,35 @@ func (a *ApplicationApiService) GetApplicationApiV1AppAppIdGet(ctx _context.Cont
 
 /*
  * Execute executes the request
- * @return ApplicationOut
+ * @return ApplicationStats
  */
-func (a *ApplicationApiService) GetApplicationApiV1AppAppIdGetExecute(r ApiGetApplicationApiV1AppAppIdGetRequest) (ApplicationOut, *_nethttp.Response, error) {
+func (a *ApplicationApiService) V1ApplicationGetStatsExecute(r ApiV1ApplicationGetStatsRequest) (ApplicationStats, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  ApplicationOut
+		localVarReturnValue  ApplicationStats
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.GetApplicationApiV1AppAppIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.V1ApplicationGetStats")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/"
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/stats/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
+	if r.since == nil {
+		return localVarReturnValue, nil, reportError("since is required and must be specified")
+	}
+	if r.until == nil {
+		return localVarReturnValue, nil, reportError("until is required and must be specified")
+	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
@@ -846,6 +996,8 @@ func (a *ApplicationApiService) GetApplicationApiV1AppAppIdGetExecute(r ApiGetAp
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
 
+	localVarQueryParams.Add("since", parameterToString(*r.since, ""))
+	localVarQueryParams.Add("until", parameterToString(*r.until, ""))
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -863,9 +1015,6 @@ func (a *ApplicationApiService) GetApplicationApiV1AppAppIdGetExecute(r ApiGetAp
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -962,44 +1111,39 @@ func (a *ApplicationApiService) GetApplicationApiV1AppAppIdGetExecute(r ApiGetAp
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListApplicationsApiV1AppGetRequest struct {
+type ApiV1ApplicationListRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
-	iterator *string
 	limit *int32
+	iterator *string
 	order *Ordering
-	idempotencyKey *string
 }
 
-func (r ApiListApplicationsApiV1AppGetRequest) Iterator(iterator string) ApiListApplicationsApiV1AppGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListApplicationsApiV1AppGetRequest) Limit(limit int32) ApiListApplicationsApiV1AppGetRequest {
+func (r ApiV1ApplicationListRequest) Limit(limit int32) ApiV1ApplicationListRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListApplicationsApiV1AppGetRequest) Order(order Ordering) ApiListApplicationsApiV1AppGetRequest {
-	r.order = &order
+func (r ApiV1ApplicationListRequest) Iterator(iterator string) ApiV1ApplicationListRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListApplicationsApiV1AppGetRequest) IdempotencyKey(idempotencyKey string) ApiListApplicationsApiV1AppGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1ApplicationListRequest) Order(order Ordering) ApiV1ApplicationListRequest {
+	r.order = &order
 	return r
 }
 
-func (r ApiListApplicationsApiV1AppGetRequest) Execute() (ListResponseApplicationOut, *_nethttp.Response, error) {
-	return r.ApiService.ListApplicationsApiV1AppGetExecute(r)
+func (r ApiV1ApplicationListRequest) Execute() (ListResponseApplicationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1ApplicationListExecute(r)
 }
 
 /*
- * ListApplicationsApiV1AppGet List Applications
+ * V1ApplicationList List Applications
  * List of all the organization's applications.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiListApplicationsApiV1AppGetRequest
+ * @return ApiV1ApplicationListRequest
  */
-func (a *ApplicationApiService) ListApplicationsApiV1AppGet(ctx _context.Context) ApiListApplicationsApiV1AppGetRequest {
-	return ApiListApplicationsApiV1AppGetRequest{
+func (a *ApplicationApiService) V1ApplicationList(ctx _context.Context) ApiV1ApplicationListRequest {
+	return ApiV1ApplicationListRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -1009,7 +1153,7 @@ func (a *ApplicationApiService) ListApplicationsApiV1AppGet(ctx _context.Context
  * Execute executes the request
  * @return ListResponseApplicationOut
  */
-func (a *ApplicationApiService) ListApplicationsApiV1AppGetExecute(r ApiListApplicationsApiV1AppGetRequest) (ListResponseApplicationOut, *_nethttp.Response, error) {
+func (a *ApplicationApiService) V1ApplicationListExecute(r ApiV1ApplicationListRequest) (ListResponseApplicationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -1019,7 +1163,7 @@ func (a *ApplicationApiService) ListApplicationsApiV1AppGetExecute(r ApiListAppl
 		localVarReturnValue  ListResponseApplicationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.ListApplicationsApiV1AppGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.V1ApplicationList")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1030,12 +1174,12 @@ func (a *ApplicationApiService) ListApplicationsApiV1AppGetExecute(r ApiListAppl
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
 
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
-	}
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
 	if r.order != nil {
 		localVarQueryParams.Add("order", parameterToString(*r.order, ""))
 	}
@@ -1056,9 +1200,6 @@ func (a *ApplicationApiService) ListApplicationsApiV1AppGetExecute(r ApiListAppl
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1155,36 +1296,31 @@ func (a *ApplicationApiService) ListApplicationsApiV1AppGetExecute(r ApiListAppl
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiUpdateApplicationApiV1AppAppIdPutRequest struct {
+type ApiV1ApplicationUpdateRequest struct {
 	ctx _context.Context
 	ApiService *ApplicationApiService
 	appId string
 	applicationIn *ApplicationIn
-	idempotencyKey *string
 }
 
-func (r ApiUpdateApplicationApiV1AppAppIdPutRequest) ApplicationIn(applicationIn ApplicationIn) ApiUpdateApplicationApiV1AppAppIdPutRequest {
+func (r ApiV1ApplicationUpdateRequest) ApplicationIn(applicationIn ApplicationIn) ApiV1ApplicationUpdateRequest {
 	r.applicationIn = &applicationIn
 	return r
 }
-func (r ApiUpdateApplicationApiV1AppAppIdPutRequest) IdempotencyKey(idempotencyKey string) ApiUpdateApplicationApiV1AppAppIdPutRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiUpdateApplicationApiV1AppAppIdPutRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
-	return r.ApiService.UpdateApplicationApiV1AppAppIdPutExecute(r)
+func (r ApiV1ApplicationUpdateRequest) Execute() (ApplicationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1ApplicationUpdateExecute(r)
 }
 
 /*
- * UpdateApplicationApiV1AppAppIdPut Update Application
+ * V1ApplicationUpdate Update Application
  * Update an application.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiUpdateApplicationApiV1AppAppIdPutRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1ApplicationUpdateRequest
  */
-func (a *ApplicationApiService) UpdateApplicationApiV1AppAppIdPut(ctx _context.Context, appId string) ApiUpdateApplicationApiV1AppAppIdPutRequest {
-	return ApiUpdateApplicationApiV1AppAppIdPutRequest{
+func (a *ApplicationApiService) V1ApplicationUpdate(ctx _context.Context, appId string) ApiV1ApplicationUpdateRequest {
+	return ApiV1ApplicationUpdateRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -1195,7 +1331,7 @@ func (a *ApplicationApiService) UpdateApplicationApiV1AppAppIdPut(ctx _context.C
  * Execute executes the request
  * @return ApplicationOut
  */
-func (a *ApplicationApiService) UpdateApplicationApiV1AppAppIdPutExecute(r ApiUpdateApplicationApiV1AppAppIdPutRequest) (ApplicationOut, *_nethttp.Response, error) {
+func (a *ApplicationApiService) V1ApplicationUpdateExecute(r ApiV1ApplicationUpdateRequest) (ApplicationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPut
 		localVarPostBody     interface{}
@@ -1205,7 +1341,7 @@ func (a *ApplicationApiService) UpdateApplicationApiV1AppAppIdPutExecute(r ApiUp
 		localVarReturnValue  ApplicationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.UpdateApplicationApiV1AppAppIdPut")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "ApplicationApiService.V1ApplicationUpdate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1243,9 +1379,6 @@ func (a *ApplicationApiService) UpdateApplicationApiV1AppAppIdPutExecute(r ApiUp
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
 	localVarPostBody = r.applicationIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
diff --git a/go/internal/openapi/api_authentication.go b/go/internal/openapi/api_authentication.go
index 295fc4d3e..532860ca3 100644
--- a/go/internal/openapi/api_authentication.go
+++ b/go/internal/openapi/api_authentication.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -27,36 +27,36 @@ var (
 // AuthenticationApiService AuthenticationApi service
 type AuthenticationApiService service
 
-type ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest struct {
+type ApiV1AuthenticationAppPortalAccessRequest struct {
 	ctx _context.Context
 	ApiService *AuthenticationApiService
 	appId string
-	applicationTokenExpireIn *ApplicationTokenExpireIn
+	appPortalAccessIn *AppPortalAccessIn
 	idempotencyKey *string
 }
 
-func (r ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest) ApplicationTokenExpireIn(applicationTokenExpireIn ApplicationTokenExpireIn) ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest {
-	r.applicationTokenExpireIn = &applicationTokenExpireIn
+func (r ApiV1AuthenticationAppPortalAccessRequest) AppPortalAccessIn(appPortalAccessIn AppPortalAccessIn) ApiV1AuthenticationAppPortalAccessRequest {
+	r.appPortalAccessIn = &appPortalAccessIn
 	return r
 }
-func (r ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest) IdempotencyKey(idempotencyKey string) ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest {
+func (r ApiV1AuthenticationAppPortalAccessRequest) IdempotencyKey(idempotencyKey string) ApiV1AuthenticationAppPortalAccessRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.ExpireAllApiV1AuthAppAppIdExpireAllPostExecute(r)
+func (r ApiV1AuthenticationAppPortalAccessRequest) Execute() (AppPortalAccessOut, *_nethttp.Response, error) {
+	return r.ApiService.V1AuthenticationAppPortalAccessExecute(r)
 }
 
 /*
- * ExpireAllApiV1AuthAppAppIdExpireAllPost Expire All
- * Expire all of the tokens associated with a specific Application
+ * V1AuthenticationAppPortalAccess Get Consumer App Portal Access
+ * Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1AuthenticationAppPortalAccessRequest
  */
-func (a *AuthenticationApiService) ExpireAllApiV1AuthAppAppIdExpireAllPost(ctx _context.Context, appId string) ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest {
-	return ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest{
+func (a *AuthenticationApiService) V1AuthenticationAppPortalAccess(ctx _context.Context, appId string) ApiV1AuthenticationAppPortalAccessRequest {
+	return ApiV1AuthenticationAppPortalAccessRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -65,35 +65,37 @@ func (a *AuthenticationApiService) ExpireAllApiV1AuthAppAppIdExpireAllPost(ctx _
 
 /*
  * Execute executes the request
+ * @return AppPortalAccessOut
  */
-func (a *AuthenticationApiService) ExpireAllApiV1AuthAppAppIdExpireAllPostExecute(r ApiExpireAllApiV1AuthAppAppIdExpireAllPostRequest) (*_nethttp.Response, error) {
+func (a *AuthenticationApiService) V1AuthenticationAppPortalAccessExecute(r ApiV1AuthenticationAppPortalAccessRequest) (AppPortalAccessOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
+		localVarReturnValue  AppPortalAccessOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.ExpireAllApiV1AuthAppAppIdExpireAllPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.V1AuthenticationAppPortalAccess")
 	if err != nil {
-		return nil, GenericOpenAPIError{error: err.Error()}
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/auth/app/{app_id}/expire-all/"
+	localVarPath := localBasePath + "/api/v1/auth/app-portal-access/{app_id}/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
 	if strlen(r.appId) < 1 {
-		return nil, reportError("appId must have at least 1 elements")
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
-		return nil, reportError("appId must have less than 256 elements")
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-	if r.applicationTokenExpireIn == nil {
-		return nil, reportError("applicationTokenExpireIn is required and must be specified")
+	if r.appPortalAccessIn == nil {
+		return localVarReturnValue, nil, reportError("appPortalAccessIn is required and must be specified")
 	}
 
 	// to determine the Content-Type header
@@ -117,22 +119,22 @@ func (a *AuthenticationApiService) ExpireAllApiV1AuthAppAppIdExpireAllPostExecut
 		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
 	}
 	// body params
-	localVarPostBody = r.applicationTokenExpireIn
+	localVarPostBody = r.appPortalAccessIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
-		return nil, err
+		return localVarReturnValue, nil, err
 	}
 
 	localVarHTTPResponse, err := a.client.callAPI(req)
 	if err != nil || localVarHTTPResponse == nil {
-		return localVarHTTPResponse, err
+		return localVarReturnValue, localVarHTTPResponse, err
 	}
 
 	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
 	localVarHTTPResponse.Body.Close()
 	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
 	if err != nil {
-		return localVarHTTPResponse, err
+		return localVarReturnValue, localVarHTTPResponse, err
 	}
 
 	if localVarHTTPResponse.StatusCode >= 300 {
@@ -145,96 +147,102 @@ func (a *AuthenticationApiService) ExpireAllApiV1AuthAppAppIdExpireAllPostExecut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 403 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 404 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 409 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 422 {
 			var v HTTPValidationError
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 429 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
 		}
-		return localVarHTTPResponse, newErr
+		return localVarReturnValue, localVarHTTPResponse, newErr
 	}
 
-	return localVarHTTPResponse, nil
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest struct {
+type ApiV1AuthenticationDashboardAccessRequest struct {
 	ctx _context.Context
 	ApiService *AuthenticationApiService
 	appId string
-	appPortalAccessIn *AppPortalAccessIn
 	idempotencyKey *string
 }
 
-func (r ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest) AppPortalAccessIn(appPortalAccessIn AppPortalAccessIn) ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest {
-	r.appPortalAccessIn = &appPortalAccessIn
-	return r
-}
-func (r ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest) IdempotencyKey(idempotencyKey string) ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest {
+func (r ApiV1AuthenticationDashboardAccessRequest) IdempotencyKey(idempotencyKey string) ApiV1AuthenticationDashboardAccessRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest) Execute() (AppPortalAccessOut, *_nethttp.Response, error) {
-	return r.ApiService.GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostExecute(r)
+func (r ApiV1AuthenticationDashboardAccessRequest) Execute() (DashboardAccessOut, *_nethttp.Response, error) {
+	return r.ApiService.V1AuthenticationDashboardAccessExecute(r)
 }
 
 /*
- * GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPost Get Consumer App Portal Access
- * Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.
+ * V1AuthenticationDashboardAccess Dashboard Access
+ * DEPRECATED: Please use `app-portal-access` instead.
+
+Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1AuthenticationDashboardAccessRequest
  */
-func (a *AuthenticationApiService) GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPost(ctx _context.Context, appId string) ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest {
-	return ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest{
+func (a *AuthenticationApiService) V1AuthenticationDashboardAccess(ctx _context.Context, appId string) ApiV1AuthenticationDashboardAccessRequest {
+	return ApiV1AuthenticationDashboardAccessRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -243,24 +251,24 @@ func (a *AuthenticationApiService) GetAppPortalAccessApiV1AuthAppPortalAccessApp
 
 /*
  * Execute executes the request
- * @return AppPortalAccessOut
+ * @return DashboardAccessOut
  */
-func (a *AuthenticationApiService) GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostExecute(r ApiGetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostRequest) (AppPortalAccessOut, *_nethttp.Response, error) {
+func (a *AuthenticationApiService) V1AuthenticationDashboardAccessExecute(r ApiV1AuthenticationDashboardAccessRequest) (DashboardAccessOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  AppPortalAccessOut
+		localVarReturnValue  DashboardAccessOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.V1AuthenticationDashboardAccess")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/auth/app-portal-access/{app_id}/"
+	localVarPath := localBasePath + "/api/v1/auth/dashboard-access/{app_id}/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
@@ -272,12 +280,9 @@ func (a *AuthenticationApiService) GetAppPortalAccessApiV1AuthAppPortalAccessApp
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-	if r.appPortalAccessIn == nil {
-		return localVarReturnValue, nil, reportError("appPortalAccessIn is required and must be specified")
-	}
 
 	// to determine the Content-Type header
-	localVarHTTPContentTypes := []string{"application/json"}
+	localVarHTTPContentTypes := []string{}
 
 	// set Content-Type header
 	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
@@ -296,8 +301,6 @@ func (a *AuthenticationApiService) GetAppPortalAccessApiV1AuthAppPortalAccessApp
 	if r.idempotencyKey != nil {
 		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
 	}
-	// body params
-	localVarPostBody = r.appPortalAccessIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -394,73 +397,69 @@ func (a *AuthenticationApiService) GetAppPortalAccessApiV1AuthAppPortalAccessApp
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest struct {
+type ApiV1AuthenticationExchangeOneTimeTokenRequest struct {
 	ctx _context.Context
 	ApiService *AuthenticationApiService
-	appId string
+	oneTimeTokenIn *OneTimeTokenIn
 	idempotencyKey *string
 }
 
-func (r ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest) IdempotencyKey(idempotencyKey string) ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest {
+func (r ApiV1AuthenticationExchangeOneTimeTokenRequest) OneTimeTokenIn(oneTimeTokenIn OneTimeTokenIn) ApiV1AuthenticationExchangeOneTimeTokenRequest {
+	r.oneTimeTokenIn = &oneTimeTokenIn
+	return r
+}
+func (r ApiV1AuthenticationExchangeOneTimeTokenRequest) IdempotencyKey(idempotencyKey string) ApiV1AuthenticationExchangeOneTimeTokenRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest) Execute() (DashboardAccessOut, *_nethttp.Response, error) {
-	return r.ApiService.GetDashboardAccessApiV1AuthDashboardAccessAppIdPostExecute(r)
+func (r ApiV1AuthenticationExchangeOneTimeTokenRequest) Execute() (OneTimeTokenOut, *_nethttp.Response, error) {
+	return r.ApiService.V1AuthenticationExchangeOneTimeTokenExecute(r)
 }
 
 /*
- * GetDashboardAccessApiV1AuthDashboardAccessAppIdPost Get Dashboard Access
- * DEPRECATED: Please use `app-portal-access` instead.
-
-Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.
+ * V1AuthenticationExchangeOneTimeToken Exchange One Time Token
+ * This is a one time token
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest
+ * @return ApiV1AuthenticationExchangeOneTimeTokenRequest
  */
-func (a *AuthenticationApiService) GetDashboardAccessApiV1AuthDashboardAccessAppIdPost(ctx _context.Context, appId string) ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest {
-	return ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest{
+func (a *AuthenticationApiService) V1AuthenticationExchangeOneTimeToken(ctx _context.Context) ApiV1AuthenticationExchangeOneTimeTokenRequest {
+	return ApiV1AuthenticationExchangeOneTimeTokenRequest{
 		ApiService: a,
 		ctx: ctx,
-		appId: appId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return DashboardAccessOut
+ * @return OneTimeTokenOut
  */
-func (a *AuthenticationApiService) GetDashboardAccessApiV1AuthDashboardAccessAppIdPostExecute(r ApiGetDashboardAccessApiV1AuthDashboardAccessAppIdPostRequest) (DashboardAccessOut, *_nethttp.Response, error) {
+func (a *AuthenticationApiService) V1AuthenticationExchangeOneTimeTokenExecute(r ApiV1AuthenticationExchangeOneTimeTokenRequest) (OneTimeTokenOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  DashboardAccessOut
+		localVarReturnValue  OneTimeTokenOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.GetDashboardAccessApiV1AuthDashboardAccessAppIdPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.V1AuthenticationExchangeOneTimeToken")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/auth/dashboard-access/{app_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/auth/one-time-token/"
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.appId) < 1 {
-		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
-	}
-	if strlen(r.appId) > 256 {
-		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	if r.oneTimeTokenIn == nil {
+		return localVarReturnValue, nil, reportError("oneTimeTokenIn is required and must be specified")
 	}
 
 	// to determine the Content-Type header
-	localVarHTTPContentTypes := []string{}
+	localVarHTTPContentTypes := []string{"application/json"}
 
 	// set Content-Type header
 	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
@@ -479,6 +478,8 @@ func (a *AuthenticationApiService) GetDashboardAccessApiV1AuthDashboardAccessApp
 	if r.idempotencyKey != nil {
 		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
 	}
+	// body params
+	localVarPostBody = r.oneTimeTokenIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -575,31 +576,209 @@ func (a *AuthenticationApiService) GetDashboardAccessApiV1AuthDashboardAccessApp
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiLogoutApiV1AuthLogoutPostRequest struct {
+type ApiV1AuthenticationExpireAllRequest struct {
+	ctx _context.Context
+	ApiService *AuthenticationApiService
+	appId string
+	applicationTokenExpireIn *ApplicationTokenExpireIn
+	idempotencyKey *string
+}
+
+func (r ApiV1AuthenticationExpireAllRequest) ApplicationTokenExpireIn(applicationTokenExpireIn ApplicationTokenExpireIn) ApiV1AuthenticationExpireAllRequest {
+	r.applicationTokenExpireIn = &applicationTokenExpireIn
+	return r
+}
+func (r ApiV1AuthenticationExpireAllRequest) IdempotencyKey(idempotencyKey string) ApiV1AuthenticationExpireAllRequest {
+	r.idempotencyKey = &idempotencyKey
+	return r
+}
+
+func (r ApiV1AuthenticationExpireAllRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1AuthenticationExpireAllExecute(r)
+}
+
+/*
+ * V1AuthenticationExpireAll Expire All
+ * Expire all of the tokens associated with a specific Application
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param appId The app's ID or UID
+ * @return ApiV1AuthenticationExpireAllRequest
+ */
+func (a *AuthenticationApiService) V1AuthenticationExpireAll(ctx _context.Context, appId string) ApiV1AuthenticationExpireAllRequest {
+	return ApiV1AuthenticationExpireAllRequest{
+		ApiService: a,
+		ctx: ctx,
+		appId: appId,
+	}
+}
+
+/*
+ * Execute executes the request
+ */
+func (a *AuthenticationApiService) V1AuthenticationExpireAllExecute(r ApiV1AuthenticationExpireAllRequest) (*_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.V1AuthenticationExpireAll")
+	if err != nil {
+		return nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/auth/app/{app_id}/expire-all/"
+	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if strlen(r.appId) < 1 {
+		return nil, reportError("appId must have at least 1 elements")
+	}
+	if strlen(r.appId) > 256 {
+		return nil, reportError("appId must have less than 256 elements")
+	}
+	if r.applicationTokenExpireIn == nil {
+		return nil, reportError("applicationTokenExpireIn is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	if r.idempotencyKey != nil {
+		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
+	}
+	// body params
+	localVarPostBody = r.applicationTokenExpireIn
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarHTTPResponse, newErr
+	}
+
+	return localVarHTTPResponse, nil
+}
+
+type ApiV1AuthenticationLogoutRequest struct {
 	ctx _context.Context
 	ApiService *AuthenticationApiService
 	idempotencyKey *string
 }
 
-func (r ApiLogoutApiV1AuthLogoutPostRequest) IdempotencyKey(idempotencyKey string) ApiLogoutApiV1AuthLogoutPostRequest {
+func (r ApiV1AuthenticationLogoutRequest) IdempotencyKey(idempotencyKey string) ApiV1AuthenticationLogoutRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiLogoutApiV1AuthLogoutPostRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.LogoutApiV1AuthLogoutPostExecute(r)
+func (r ApiV1AuthenticationLogoutRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1AuthenticationLogoutExecute(r)
 }
 
 /*
- * LogoutApiV1AuthLogoutPost Logout
+ * V1AuthenticationLogout Logout
  * Logout an app token.
 
 Trying to log out other tokens will fail.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiLogoutApiV1AuthLogoutPostRequest
+ * @return ApiV1AuthenticationLogoutRequest
  */
-func (a *AuthenticationApiService) LogoutApiV1AuthLogoutPost(ctx _context.Context) ApiLogoutApiV1AuthLogoutPostRequest {
-	return ApiLogoutApiV1AuthLogoutPostRequest{
+func (a *AuthenticationApiService) V1AuthenticationLogout(ctx _context.Context) ApiV1AuthenticationLogoutRequest {
+	return ApiV1AuthenticationLogoutRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -608,7 +787,7 @@ func (a *AuthenticationApiService) LogoutApiV1AuthLogoutPost(ctx _context.Contex
 /*
  * Execute executes the request
  */
-func (a *AuthenticationApiService) LogoutApiV1AuthLogoutPostExecute(r ApiLogoutApiV1AuthLogoutPostRequest) (*_nethttp.Response, error) {
+func (a *AuthenticationApiService) V1AuthenticationLogoutExecute(r ApiV1AuthenticationLogoutRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -617,7 +796,7 @@ func (a *AuthenticationApiService) LogoutApiV1AuthLogoutPostExecute(r ApiLogoutA
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.LogoutApiV1AuthLogoutPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "AuthenticationApiService.V1AuthenticationLogout")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
diff --git a/go/internal/openapi/api_background_tasks.go b/go/internal/openapi/api_background_tasks.go
new file mode 100644
index 000000000..7c5babfe6
--- /dev/null
+++ b/go/internal/openapi/api_background_tasks.go
@@ -0,0 +1,394 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"bytes"
+	_context "context"
+	_ioutil "io/ioutil"
+	_nethttp "net/http"
+	_neturl "net/url"
+	"strings"
+)
+
+// Linger please
+var (
+	_ _context.Context
+)
+
+// BackgroundTasksApiService BackgroundTasksApi service
+type BackgroundTasksApiService service
+
+type ApiGetBackgroundTaskRequest struct {
+	ctx _context.Context
+	ApiService *BackgroundTasksApiService
+	taskId string
+}
+
+
+func (r ApiGetBackgroundTaskRequest) Execute() (BackgroundTaskOut, *_nethttp.Response, error) {
+	return r.ApiService.GetBackgroundTaskExecute(r)
+}
+
+/*
+ * GetBackgroundTask Get Background Task
+ * Get a background task by ID.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param taskId
+ * @return ApiGetBackgroundTaskRequest
+ */
+func (a *BackgroundTasksApiService) GetBackgroundTask(ctx _context.Context, taskId string) ApiGetBackgroundTaskRequest {
+	return ApiGetBackgroundTaskRequest{
+		ApiService: a,
+		ctx: ctx,
+		taskId: taskId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return BackgroundTaskOut
+ */
+func (a *BackgroundTasksApiService) GetBackgroundTaskExecute(r ApiGetBackgroundTaskRequest) (BackgroundTaskOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  BackgroundTaskOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "BackgroundTasksApiService.GetBackgroundTask")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/background-task/{task_id}/"
+	localVarPath = strings.Replace(localVarPath, "{"+"task_id"+"}", _neturl.PathEscape(parameterToString(r.taskId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiListBackgroundTasksRequest struct {
+	ctx _context.Context
+	ApiService *BackgroundTasksApiService
+	status *BackgroundTaskStatus
+	task *BackgroundTaskType
+	limit *int32
+	iterator *string
+	order *Ordering
+}
+
+func (r ApiListBackgroundTasksRequest) Status(status BackgroundTaskStatus) ApiListBackgroundTasksRequest {
+	r.status = &status
+	return r
+}
+func (r ApiListBackgroundTasksRequest) Task(task BackgroundTaskType) ApiListBackgroundTasksRequest {
+	r.task = &task
+	return r
+}
+func (r ApiListBackgroundTasksRequest) Limit(limit int32) ApiListBackgroundTasksRequest {
+	r.limit = &limit
+	return r
+}
+func (r ApiListBackgroundTasksRequest) Iterator(iterator string) ApiListBackgroundTasksRequest {
+	r.iterator = &iterator
+	return r
+}
+func (r ApiListBackgroundTasksRequest) Order(order Ordering) ApiListBackgroundTasksRequest {
+	r.order = &order
+	return r
+}
+
+func (r ApiListBackgroundTasksRequest) Execute() (ListResponseBackgroundTaskOut, *_nethttp.Response, error) {
+	return r.ApiService.ListBackgroundTasksExecute(r)
+}
+
+/*
+ * ListBackgroundTasks List Background Tasks
+ * List background tasks executed in the past 90 days.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @return ApiListBackgroundTasksRequest
+ */
+func (a *BackgroundTasksApiService) ListBackgroundTasks(ctx _context.Context) ApiListBackgroundTasksRequest {
+	return ApiListBackgroundTasksRequest{
+		ApiService: a,
+		ctx: ctx,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return ListResponseBackgroundTaskOut
+ */
+func (a *BackgroundTasksApiService) ListBackgroundTasksExecute(r ApiListBackgroundTasksRequest) (ListResponseBackgroundTaskOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  ListResponseBackgroundTaskOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "BackgroundTasksApiService.ListBackgroundTasks")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/background-task/"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+
+	if r.status != nil {
+		localVarQueryParams.Add("status", parameterToString(*r.status, ""))
+	}
+	if r.task != nil {
+		localVarQueryParams.Add("task", parameterToString(*r.task, ""))
+	}
+	if r.limit != nil {
+		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
+	if r.order != nil {
+		localVarQueryParams.Add("order", parameterToString(*r.order, ""))
+	}
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
diff --git a/go/internal/openapi/api_broadcast.go b/go/internal/openapi/api_broadcast.go
new file mode 100644
index 000000000..8147e96ba
--- /dev/null
+++ b/go/internal/openapi/api_broadcast.go
@@ -0,0 +1,206 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"bytes"
+	_context "context"
+	_ioutil "io/ioutil"
+	_nethttp "net/http"
+	_neturl "net/url"
+)
+
+// Linger please
+var (
+	_ _context.Context
+)
+
+// BroadcastApiService BroadcastApi service
+type BroadcastApiService service
+
+type ApiCreateBroadcastMessageRequest struct {
+	ctx _context.Context
+	ApiService *BroadcastApiService
+	messageBroadcastIn *MessageBroadcastIn
+	idempotencyKey *string
+}
+
+func (r ApiCreateBroadcastMessageRequest) MessageBroadcastIn(messageBroadcastIn MessageBroadcastIn) ApiCreateBroadcastMessageRequest {
+	r.messageBroadcastIn = &messageBroadcastIn
+	return r
+}
+func (r ApiCreateBroadcastMessageRequest) IdempotencyKey(idempotencyKey string) ApiCreateBroadcastMessageRequest {
+	r.idempotencyKey = &idempotencyKey
+	return r
+}
+
+func (r ApiCreateBroadcastMessageRequest) Execute() (MessageBroadcastOut, *_nethttp.Response, error) {
+	return r.ApiService.CreateBroadcastMessageExecute(r)
+}
+
+/*
+ * CreateBroadcastMessage Create Broadcast Message
+ * Creates a background task to send the same message to each application in your organization
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @return ApiCreateBroadcastMessageRequest
+ */
+func (a *BroadcastApiService) CreateBroadcastMessage(ctx _context.Context) ApiCreateBroadcastMessageRequest {
+	return ApiCreateBroadcastMessageRequest{
+		ApiService: a,
+		ctx: ctx,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return MessageBroadcastOut
+ */
+func (a *BroadcastApiService) CreateBroadcastMessageExecute(r ApiCreateBroadcastMessageRequest) (MessageBroadcastOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  MessageBroadcastOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "BroadcastApiService.CreateBroadcastMessage")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/msg/broadcast/"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if r.messageBroadcastIn == nil {
+		return localVarReturnValue, nil, reportError("messageBroadcastIn is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	if r.idempotencyKey != nil {
+		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
+	}
+	// body params
+	localVarPostBody = r.messageBroadcastIn
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
diff --git a/go/internal/openapi/api_endpoint.go b/go/internal/openapi/api_endpoint.go
index b2aa81b2d..92febd88f 100644
--- a/go/internal/openapi/api_endpoint.go
+++ b/go/internal/openapi/api_endpoint.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,6 +17,7 @@ import (
 	_nethttp "net/http"
 	_neturl "net/url"
 	"strings"
+	"time"
 )
 
 // Linger please
@@ -27,41 +28,37 @@ var (
 // EndpointApiService EndpointApi service
 type EndpointApiService service
 
-type ApiCreateEndpointApiV1AppAppIdEndpointPostRequest struct {
+type ApiPatchEndpointRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
-	endpointIn *EndpointIn
-	idempotencyKey *string
+	endpointId string
+	endpointPatch *EndpointPatch
 }
 
-func (r ApiCreateEndpointApiV1AppAppIdEndpointPostRequest) EndpointIn(endpointIn EndpointIn) ApiCreateEndpointApiV1AppAppIdEndpointPostRequest {
-	r.endpointIn = &endpointIn
-	return r
-}
-func (r ApiCreateEndpointApiV1AppAppIdEndpointPostRequest) IdempotencyKey(idempotencyKey string) ApiCreateEndpointApiV1AppAppIdEndpointPostRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiPatchEndpointRequest) EndpointPatch(endpointPatch EndpointPatch) ApiPatchEndpointRequest {
+	r.endpointPatch = &endpointPatch
 	return r
 }
 
-func (r ApiCreateEndpointApiV1AppAppIdEndpointPostRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
-	return r.ApiService.CreateEndpointApiV1AppAppIdEndpointPostExecute(r)
+func (r ApiPatchEndpointRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.PatchEndpointExecute(r)
 }
 
 /*
- * CreateEndpointApiV1AppAppIdEndpointPost Create Endpoint
- * Create a new endpoint for the application.
-
-When `secret` is `null` the secret is automatically generated (recommended)
+ * PatchEndpoint Patch Endpoint
+ * Partially update an endpoint.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiCreateEndpointApiV1AppAppIdEndpointPostRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiPatchEndpointRequest
  */
-func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPost(ctx _context.Context, appId string) ApiCreateEndpointApiV1AppAppIdEndpointPostRequest {
-	return ApiCreateEndpointApiV1AppAppIdEndpointPostRequest{
+func (a *EndpointApiService) PatchEndpoint(ctx _context.Context, appId string, endpointId string) ApiPatchEndpointRequest {
+	return ApiPatchEndpointRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
@@ -69,9 +66,9 @@ func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPost(ctx _contex
  * Execute executes the request
  * @return EndpointOut
  */
-func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPostExecute(r ApiCreateEndpointApiV1AppAppIdEndpointPostRequest) (EndpointOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) PatchEndpointExecute(r ApiPatchEndpointRequest) (EndpointOut, *_nethttp.Response, error) {
 	var (
-		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarHTTPMethod   = _nethttp.MethodPatch
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
@@ -79,13 +76,14 @@ func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPostExecute(r Ap
 		localVarReturnValue  EndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.CreateEndpointApiV1AppAppIdEndpointPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.PatchEndpoint")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/"
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -96,8 +94,14 @@ func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPostExecute(r Ap
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-	if r.endpointIn == nil {
-		return localVarReturnValue, nil, reportError("endpointIn is required and must be specified")
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
+	if r.endpointPatch == nil {
+		return localVarReturnValue, nil, reportError("endpointPatch is required and must be specified")
 	}
 
 	// to determine the Content-Type header
@@ -117,11 +121,8 @@ func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPostExecute(r Ap
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
-	localVarPostBody = r.endpointIn
+	localVarPostBody = r.endpointPatch
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -218,79 +219,81 @@ func (a *EndpointApiService) CreateEndpointApiV1AppAppIdEndpointPostExecute(r Ap
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest struct {
+type ApiV1EndpointCreateRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
+	endpointIn *EndpointIn
 	idempotencyKey *string
 }
 
-func (r ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest) IdempotencyKey(idempotencyKey string) ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest {
+func (r ApiV1EndpointCreateRequest) EndpointIn(endpointIn EndpointIn) ApiV1EndpointCreateRequest {
+	r.endpointIn = &endpointIn
+	return r
+}
+func (r ApiV1EndpointCreateRequest) IdempotencyKey(idempotencyKey string) ApiV1EndpointCreateRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.DeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteExecute(r)
+func (r ApiV1EndpointCreateRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointCreateExecute(r)
 }
 
 /*
- * DeleteEndpointApiV1AppAppIdEndpointEndpointIdDelete Delete Endpoint
- * Delete an endpoint.
+ * V1EndpointCreate Create Endpoint
+ * Create a new endpoint for the application.
+
+When `secret` is `null` the secret is automatically generated (recommended)
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1EndpointCreateRequest
  */
-func (a *EndpointApiService) DeleteEndpointApiV1AppAppIdEndpointEndpointIdDelete(ctx _context.Context, endpointId string, appId string) ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest {
-	return ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest{
+func (a *EndpointApiService) V1EndpointCreate(ctx _context.Context, appId string) ApiV1EndpointCreateRequest {
+	return ApiV1EndpointCreateRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
 	}
 }
 
 /*
  * Execute executes the request
+ * @return EndpointOut
  */
-func (a *EndpointApiService) DeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteExecute(r ApiDeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteRequest) (*_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointCreateExecute(r ApiV1EndpointCreateRequest) (EndpointOut, *_nethttp.Response, error) {
 	var (
-		localVarHTTPMethod   = _nethttp.MethodDelete
+		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
+		localVarReturnValue  EndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.DeleteEndpointApiV1AppAppIdEndpointEndpointIdDelete")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointCreate")
 	if err != nil {
-		return nil, GenericOpenAPIError{error: err.Error()}
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
-		return nil, reportError("appId must have at least 1 elements")
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
-		return nil, reportError("appId must have less than 256 elements")
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	}
+	if r.endpointIn == nil {
+		return localVarReturnValue, nil, reportError("endpointIn is required and must be specified")
 	}
 
 	// to determine the Content-Type header
-	localVarHTTPContentTypes := []string{}
+	localVarHTTPContentTypes := []string{"application/json"}
 
 	// set Content-Type header
 	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
@@ -309,21 +312,23 @@ func (a *EndpointApiService) DeleteEndpointApiV1AppAppIdEndpointEndpointIdDelete
 	if r.idempotencyKey != nil {
 		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
 	}
+	// body params
+	localVarPostBody = r.endpointIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
-		return nil, err
+		return localVarReturnValue, nil, err
 	}
 
 	localVarHTTPResponse, err := a.client.callAPI(req)
 	if err != nil || localVarHTTPResponse == nil {
-		return localVarHTTPResponse, err
+		return localVarReturnValue, localVarHTTPResponse, err
 	}
 
 	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
 	localVarHTTPResponse.Body.Close()
 	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
 	if err != nil {
-		return localVarHTTPResponse, err
+		return localVarReturnValue, localVarHTTPResponse, err
 	}
 
 	if localVarHTTPResponse.StatusCode >= 300 {
@@ -336,137 +341,139 @@ func (a *EndpointApiService) DeleteEndpointApiV1AppAppIdEndpointEndpointIdDelete
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 403 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 404 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 409 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 422 {
 			var v HTTPValidationError
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarHTTPResponse, newErr
+			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 429 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
+				return localVarReturnValue, localVarHTTPResponse, newErr
 			}
 			newErr.model = v
 		}
-		return localVarHTTPResponse, newErr
+		return localVarReturnValue, localVarHTTPResponse, newErr
 	}
 
-	return localVarHTTPResponse, nil
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest struct {
+type ApiV1EndpointDeleteRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
-	idempotencyKey *string
+	endpointId string
 }
 
-func (r ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
-	return r.ApiService.GetEndpointApiV1AppAppIdEndpointEndpointIdGetExecute(r)
+func (r ApiV1EndpointDeleteRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EndpointDeleteExecute(r)
 }
 
 /*
- * GetEndpointApiV1AppAppIdEndpointEndpointIdGet Get Endpoint
- * Get an application.
+ * V1EndpointDelete Delete Endpoint
+ * Delete an endpoint.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointDeleteRequest
  */
-func (a *EndpointApiService) GetEndpointApiV1AppAppIdEndpointEndpointIdGet(ctx _context.Context, endpointId string, appId string) ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest {
-	return ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest{
+func (a *EndpointApiService) V1EndpointDelete(ctx _context.Context, appId string, endpointId string) ApiV1EndpointDeleteRequest {
+	return ApiV1EndpointDeleteRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return EndpointOut
  */
-func (a *EndpointApiService) GetEndpointApiV1AppAppIdEndpointEndpointIdGetExecute(r ApiGetEndpointApiV1AppAppIdEndpointEndpointIdGetRequest) (EndpointOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointDeleteExecute(r ApiV1EndpointDeleteRequest) (*_nethttp.Response, error) {
 	var (
-		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarHTTPMethod   = _nethttp.MethodDelete
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  EndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.GetEndpointApiV1AppAppIdEndpointEndpointIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointDelete")
 	if err != nil {
-		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+		return nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
-		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
+		return nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
-		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+		return nil, reportError("appId must have less than 256 elements")
+	}
+	if strlen(r.endpointId) < 1 {
+		return nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return nil, reportError("endpointId must have less than 256 elements")
 	}
 
 	// to determine the Content-Type header
@@ -486,24 +493,21 @@ func (a *EndpointApiService) GetEndpointApiV1AppAppIdEndpointEndpointIdGetExecut
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
-		return localVarReturnValue, nil, err
+		return nil, err
 	}
 
 	localVarHTTPResponse, err := a.client.callAPI(req)
 	if err != nil || localVarHTTPResponse == nil {
-		return localVarReturnValue, localVarHTTPResponse, err
+		return localVarHTTPResponse, err
 	}
 
 	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
 	localVarHTTPResponse.Body.Close()
 	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
 	if err != nil {
-		return localVarReturnValue, localVarHTTPResponse, err
+		return localVarHTTPResponse, err
 	}
 
 	if localVarHTTPResponse.StatusCode >= 300 {
@@ -516,147 +520,133 @@ func (a *EndpointApiService) GetEndpointApiV1AppAppIdEndpointEndpointIdGetExecut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
+				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
+			return localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 403 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
+				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
+			return localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 404 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
+				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
+			return localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 409 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
+				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
+			return localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 422 {
 			var v HTTPValidationError
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
+				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
+			return localVarHTTPResponse, newErr
 		}
 		if localVarHTTPResponse.StatusCode == 429 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
 				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
+				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
 		}
-		return localVarReturnValue, localVarHTTPResponse, newErr
-	}
-
-	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
-	if err != nil {
-		newErr := GenericOpenAPIError{
-			body:  localVarBody,
-			error: err.Error(),
-		}
-		return localVarReturnValue, localVarHTTPResponse, newErr
+		return localVarHTTPResponse, newErr
 	}
 
-	return localVarReturnValue, localVarHTTPResponse, nil
+	return localVarHTTPResponse, nil
 }
 
-type ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest struct {
+type ApiV1EndpointGetRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
-	idempotencyKey *string
+	endpointId string
 }
 
-func (r ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest) Execute() (EndpointHeadersOut, *_nethttp.Response, error) {
-	return r.ApiService.GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetExecute(r)
+func (r ApiV1EndpointGetRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointGetExecute(r)
 }
 
 /*
- * GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet Get Endpoint Headers
- * Get the additional headers to be sent with the webhook
+ * V1EndpointGet Get Endpoint
+ * Get an endpoint.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointGetRequest
  */
-func (a *EndpointApiService) GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet(ctx _context.Context, endpointId string, appId string) ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest {
-	return ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest{
+func (a *EndpointApiService) V1EndpointGet(ctx _context.Context, appId string, endpointId string) ApiV1EndpointGetRequest {
+	return ApiV1EndpointGetRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return EndpointHeadersOut
+ * @return EndpointOut
  */
-func (a *EndpointApiService) GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetExecute(r ApiGetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetRequest) (EndpointHeadersOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointGetExecute(r ApiV1EndpointGetRequest) (EndpointOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  EndpointHeadersOut
+		localVarReturnValue  EndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
 
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
@@ -675,9 +665,6 @@ func (a *EndpointApiService) GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHe
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -774,81 +761,73 @@ func (a *EndpointApiService) GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHe
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest struct {
+type ApiV1EndpointGetHeadersRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
-	idempotencyKey *string
+	endpointId string
 }
 
-func (r ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest) Execute() (EndpointSecretOut, *_nethttp.Response, error) {
-	return r.ApiService.GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetExecute(r)
+func (r ApiV1EndpointGetHeadersRequest) Execute() (EndpointHeadersOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointGetHeadersExecute(r)
 }
 
 /*
- * GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet Get Endpoint Secret
- * Get the endpoint's signing secret.
-
-This is used to verify the authenticity of the webhook.
-For more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/).
+ * V1EndpointGetHeaders Get Endpoint Headers
+ * Get the additional headers to be sent with the webhook
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointGetHeadersRequest
  */
-func (a *EndpointApiService) GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet(ctx _context.Context, endpointId string, appId string) ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest {
-	return ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest{
+func (a *EndpointApiService) V1EndpointGetHeaders(ctx _context.Context, appId string, endpointId string) ApiV1EndpointGetHeadersRequest {
+	return ApiV1EndpointGetHeadersRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return EndpointSecretOut
+ * @return EndpointHeadersOut
  */
-func (a *EndpointApiService) GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetExecute(r ApiGetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetRequest) (EndpointSecretOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointGetHeadersExecute(r ApiV1EndpointGetHeadersRequest) (EndpointHeadersOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  EndpointSecretOut
+		localVarReturnValue  EndpointHeadersOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointGetHeaders")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
 
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
@@ -867,9 +846,6 @@ func (a *EndpointApiService) GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSec
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -966,78 +942,76 @@ func (a *EndpointApiService) GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSec
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest struct {
+type ApiV1EndpointGetSecretRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
-	idempotencyKey *string
+	endpointId string
 }
 
-func (r ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest) Execute() (EndpointStats, *_nethttp.Response, error) {
-	return r.ApiService.GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetExecute(r)
+func (r ApiV1EndpointGetSecretRequest) Execute() (EndpointSecretOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointGetSecretExecute(r)
 }
 
 /*
- * GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet Get Endpoint Stats
- * Get basic statistics for the endpoint.
+ * V1EndpointGetSecret Get Endpoint Secret
+ * Get the endpoint's signing secret.
+
+This is used to verify the authenticity of the webhook.
+For more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/).
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointGetSecretRequest
  */
-func (a *EndpointApiService) GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet(ctx _context.Context, endpointId string, appId string) ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest {
-	return ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest{
+func (a *EndpointApiService) V1EndpointGetSecret(ctx _context.Context, appId string, endpointId string) ApiV1EndpointGetSecretRequest {
+	return ApiV1EndpointGetSecretRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return EndpointStats
+ * @return EndpointSecretOut
  */
-func (a *EndpointApiService) GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetExecute(r ApiGetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetRequest) (EndpointStats, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointGetSecretExecute(r ApiV1EndpointGetSecretRequest) (EndpointSecretOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  EndpointStats
+		localVarReturnValue  EndpointSecretOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointGetSecret")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
 
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
@@ -1056,9 +1030,6 @@ func (a *EndpointApiService) GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStat
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1155,79 +1126,90 @@ func (a *EndpointApiService) GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStat
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest struct {
+type ApiV1EndpointGetStatsRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
-	idempotencyKey *string
+	endpointId string
+	since *time.Time
+	until *time.Time
 }
 
-func (r ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1EndpointGetStatsRequest) Since(since time.Time) ApiV1EndpointGetStatsRequest {
+	r.since = &since
+	return r
+}
+func (r ApiV1EndpointGetStatsRequest) Until(until time.Time) ApiV1EndpointGetStatsRequest {
+	r.until = &until
 	return r
 }
 
-func (r ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest) Execute() (EndpointTransformationOut, *_nethttp.Response, error) {
-	return r.ApiService.GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetExecute(r)
+func (r ApiV1EndpointGetStatsRequest) Execute() (EndpointStats, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointGetStatsExecute(r)
 }
 
 /*
- * GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet Get Endpoint Transformation
- * Get the transformation code associated with this endpoint
+ * V1EndpointGetStats Endpoint Stats
+ * Get basic statistics for the endpoint.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointGetStatsRequest
  */
-func (a *EndpointApiService) GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet(ctx _context.Context, endpointId string, appId string) ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest {
-	return ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest{
+func (a *EndpointApiService) V1EndpointGetStats(ctx _context.Context, appId string, endpointId string) ApiV1EndpointGetStatsRequest {
+	return ApiV1EndpointGetStatsRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return EndpointTransformationOut
+ * @return EndpointStats
  */
-func (a *EndpointApiService) GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetExecute(r ApiGetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetRequest) (EndpointTransformationOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointGetStatsExecute(r ApiV1EndpointGetStatsRequest) (EndpointStats, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  EndpointTransformationOut
+		localVarReturnValue  EndpointStats
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointGetStats")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
+	if strlen(r.appId) < 1 {
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
+	}
+	if strlen(r.appId) > 256 {
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	}
 	if strlen(r.endpointId) < 1 {
 		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
 	}
 	if strlen(r.endpointId) > 256 {
 		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
 	}
-	if strlen(r.appId) < 1 {
-		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
+
+	if r.since != nil {
+		localVarQueryParams.Add("since", parameterToString(*r.since, ""))
 	}
-	if strlen(r.appId) > 256 {
-		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	if r.until != nil {
+		localVarQueryParams.Add("until", parameterToString(*r.until, ""))
 	}
-
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -1245,9 +1227,6 @@ func (a *EndpointApiService) GetEndpointTransformationApiV1AppAppIdEndpointEndpo
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1344,46 +1323,41 @@ func (a *EndpointApiService) GetEndpointTransformationApiV1AppAppIdEndpointEndpo
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListEndpointsApiV1AppAppIdEndpointGetRequest struct {
+type ApiV1EndpointListRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
-	iterator *string
 	limit *int32
+	iterator *string
 	order *Ordering
-	idempotencyKey *string
 }
 
-func (r ApiListEndpointsApiV1AppAppIdEndpointGetRequest) Iterator(iterator string) ApiListEndpointsApiV1AppAppIdEndpointGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListEndpointsApiV1AppAppIdEndpointGetRequest) Limit(limit int32) ApiListEndpointsApiV1AppAppIdEndpointGetRequest {
+func (r ApiV1EndpointListRequest) Limit(limit int32) ApiV1EndpointListRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListEndpointsApiV1AppAppIdEndpointGetRequest) Order(order Ordering) ApiListEndpointsApiV1AppAppIdEndpointGetRequest {
-	r.order = &order
+func (r ApiV1EndpointListRequest) Iterator(iterator string) ApiV1EndpointListRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListEndpointsApiV1AppAppIdEndpointGetRequest) IdempotencyKey(idempotencyKey string) ApiListEndpointsApiV1AppAppIdEndpointGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1EndpointListRequest) Order(order Ordering) ApiV1EndpointListRequest {
+	r.order = &order
 	return r
 }
 
-func (r ApiListEndpointsApiV1AppAppIdEndpointGetRequest) Execute() (ListResponseEndpointOut, *_nethttp.Response, error) {
-	return r.ApiService.ListEndpointsApiV1AppAppIdEndpointGetExecute(r)
+func (r ApiV1EndpointListRequest) Execute() (ListResponseEndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointListExecute(r)
 }
 
 /*
- * ListEndpointsApiV1AppAppIdEndpointGet List Endpoints
+ * V1EndpointList List Endpoints
  * List the application's endpoints.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiListEndpointsApiV1AppAppIdEndpointGetRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1EndpointListRequest
  */
-func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGet(ctx _context.Context, appId string) ApiListEndpointsApiV1AppAppIdEndpointGetRequest {
-	return ApiListEndpointsApiV1AppAppIdEndpointGetRequest{
+func (a *EndpointApiService) V1EndpointList(ctx _context.Context, appId string) ApiV1EndpointListRequest {
+	return ApiV1EndpointListRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -1394,7 +1368,7 @@ func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGet(ctx _context.
  * Execute executes the request
  * @return ListResponseEndpointOut
  */
-func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGetExecute(r ApiListEndpointsApiV1AppAppIdEndpointGetRequest) (ListResponseEndpointOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointListExecute(r ApiV1EndpointListRequest) (ListResponseEndpointOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -1404,7 +1378,7 @@ func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGetExecute(r ApiL
 		localVarReturnValue  ListResponseEndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.ListEndpointsApiV1AppAppIdEndpointGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointList")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1422,12 +1396,12 @@ func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGetExecute(r ApiL
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
 
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
-	}
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
 	if r.order != nil {
 		localVarQueryParams.Add("order", parameterToString(*r.order, ""))
 	}
@@ -1448,9 +1422,6 @@ func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGetExecute(r ApiL
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1547,38 +1518,33 @@ func (a *EndpointApiService) ListEndpointsApiV1AppAppIdEndpointGetExecute(r ApiL
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest struct {
+type ApiV1EndpointPatchHeadersRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
 	endpointId string
 	endpointHeadersPatchIn *EndpointHeadersPatchIn
-	idempotencyKey *string
 }
 
-func (r ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest) EndpointHeadersPatchIn(endpointHeadersPatchIn EndpointHeadersPatchIn) ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest {
+func (r ApiV1EndpointPatchHeadersRequest) EndpointHeadersPatchIn(endpointHeadersPatchIn EndpointHeadersPatchIn) ApiV1EndpointPatchHeadersRequest {
 	r.endpointHeadersPatchIn = &endpointHeadersPatchIn
 	return r
 }
-func (r ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest) IdempotencyKey(idempotencyKey string) ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchExecute(r)
+func (r ApiV1EndpointPatchHeadersRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EndpointPatchHeadersExecute(r)
 }
 
 /*
- * PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch Patch Endpoint Headers
+ * V1EndpointPatchHeaders Patch Endpoint Headers
  * Partially set the additional headers to be sent with the webhook
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointPatchHeadersRequest
  */
-func (a *EndpointApiService) PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch(ctx _context.Context, appId string, endpointId string) ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest {
-	return ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest{
+func (a *EndpointApiService) V1EndpointPatchHeaders(ctx _context.Context, appId string, endpointId string) ApiV1EndpointPatchHeadersRequest {
+	return ApiV1EndpointPatchHeadersRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -1589,7 +1555,7 @@ func (a *EndpointApiService) PatchEndpointHeadersApiV1AppAppIdEndpointEndpointId
 /*
  * Execute executes the request
  */
-func (a *EndpointApiService) PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchExecute(r ApiPatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchRequest) (*_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointPatchHeadersExecute(r ApiV1EndpointPatchHeadersRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPatch
 		localVarPostBody     interface{}
@@ -1598,7 +1564,7 @@ func (a *EndpointApiService) PatchEndpointHeadersApiV1AppAppIdEndpointEndpointId
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointPatchHeaders")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1640,11 +1606,8 @@ func (a *EndpointApiService) PatchEndpointHeadersApiV1AppAppIdEndpointEndpointId
 
 	// set Accept header
 	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
-	if localVarHTTPHeaderAccept != "" {
-		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
-	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
 	// body params
 	localVarPostBody = r.endpointHeadersPatchIn
@@ -1735,7 +1698,7 @@ func (a *EndpointApiService) PatchEndpointHeadersApiV1AppAppIdEndpointEndpointId
 	return localVarHTTPResponse, nil
 }
 
-type ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest struct {
+type ApiV1EndpointRecoverRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
@@ -1744,29 +1707,29 @@ type ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest s
 	idempotencyKey *string
 }
 
-func (r ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest) RecoverIn(recoverIn RecoverIn) ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest {
+func (r ApiV1EndpointRecoverRequest) RecoverIn(recoverIn RecoverIn) ApiV1EndpointRecoverRequest {
 	r.recoverIn = &recoverIn
 	return r
 }
-func (r ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest) IdempotencyKey(idempotencyKey string) ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest {
+func (r ApiV1EndpointRecoverRequest) IdempotencyKey(idempotencyKey string) ApiV1EndpointRecoverRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest) Execute() (map[string]interface{}, *_nethttp.Response, error) {
-	return r.ApiService.RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostExecute(r)
+func (r ApiV1EndpointRecoverRequest) Execute() (RecoverOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointRecoverExecute(r)
 }
 
 /*
- * RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost Recover Failed Webhooks
+ * V1EndpointRecover Recover Failed Webhooks
  * Resend all failed messages since a given time.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointRecoverRequest
  */
-func (a *EndpointApiService) RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost(ctx _context.Context, appId string, endpointId string) ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest {
-	return ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest{
+func (a *EndpointApiService) V1EndpointRecover(ctx _context.Context, appId string, endpointId string) ApiV1EndpointRecoverRequest {
+	return ApiV1EndpointRecoverRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -1776,19 +1739,19 @@ func (a *EndpointApiService) RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointI
 
 /*
  * Execute executes the request
- * @return map[string]interface{}
+ * @return RecoverOut
  */
-func (a *EndpointApiService) RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostExecute(r ApiRecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostRequest) (map[string]interface{}, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointRecoverExecute(r ApiV1EndpointRecoverRequest) (RecoverOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  map[string]interface{}
+		localVarReturnValue  RecoverOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointRecover")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1934,7 +1897,7 @@ func (a *EndpointApiService) RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointI
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest struct {
+type ApiV1EndpointReplayRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
@@ -1943,29 +1906,29 @@ type ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostReq
 	idempotencyKey *string
 }
 
-func (r ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest) ReplayIn(replayIn ReplayIn) ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest {
+func (r ApiV1EndpointReplayRequest) ReplayIn(replayIn ReplayIn) ApiV1EndpointReplayRequest {
 	r.replayIn = &replayIn
 	return r
 }
-func (r ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest) IdempotencyKey(idempotencyKey string) ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest {
+func (r ApiV1EndpointReplayRequest) IdempotencyKey(idempotencyKey string) ApiV1EndpointReplayRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest) Execute() (map[string]interface{}, *_nethttp.Response, error) {
-	return r.ApiService.ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostExecute(r)
+func (r ApiV1EndpointReplayRequest) Execute() (ReplayOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointReplayExecute(r)
 }
 
 /*
- * ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPost Replay Missing Webhooks
+ * V1EndpointReplay Replay Missing Webhooks
  * Replays messages to the endpoint. Only messages that were created after `since` will be sent. Messages that were previously sent to the endpoint are not resent.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointReplayRequest
  */
-func (a *EndpointApiService) ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPost(ctx _context.Context, appId string, endpointId string) ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest {
-	return ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest{
+func (a *EndpointApiService) V1EndpointReplay(ctx _context.Context, appId string, endpointId string) ApiV1EndpointReplayRequest {
+	return ApiV1EndpointReplayRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -1975,19 +1938,19 @@ func (a *EndpointApiService) ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointI
 
 /*
  * Execute executes the request
- * @return map[string]interface{}
+ * @return ReplayOut
  */
-func (a *EndpointApiService) ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostExecute(r ApiReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostRequest) (map[string]interface{}, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointReplayExecute(r ApiV1EndpointReplayRequest) (ReplayOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  map[string]interface{}
+		localVarReturnValue  ReplayOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointReplay")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -2133,49 +2096,49 @@ func (a *EndpointApiService) ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointI
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest struct {
+type ApiV1EndpointRotateSecretRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
+	endpointId string
 	endpointSecretRotateIn *EndpointSecretRotateIn
 	idempotencyKey *string
 }
 
-func (r ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest) EndpointSecretRotateIn(endpointSecretRotateIn EndpointSecretRotateIn) ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest {
+func (r ApiV1EndpointRotateSecretRequest) EndpointSecretRotateIn(endpointSecretRotateIn EndpointSecretRotateIn) ApiV1EndpointRotateSecretRequest {
 	r.endpointSecretRotateIn = &endpointSecretRotateIn
 	return r
 }
-func (r ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest) IdempotencyKey(idempotencyKey string) ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest {
+func (r ApiV1EndpointRotateSecretRequest) IdempotencyKey(idempotencyKey string) ApiV1EndpointRotateSecretRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostExecute(r)
+func (r ApiV1EndpointRotateSecretRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EndpointRotateSecretExecute(r)
 }
 
 /*
- * RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost Rotate Endpoint Secret
+ * V1EndpointRotateSecret Rotate Endpoint Secret
  * Rotates the endpoint's signing secret.  The previous secret will be valid for the next 24 hours.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointRotateSecretRequest
  */
-func (a *EndpointApiService) RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost(ctx _context.Context, endpointId string, appId string) ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest {
-	return ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest{
+func (a *EndpointApiService) V1EndpointRotateSecret(ctx _context.Context, appId string, endpointId string) ApiV1EndpointRotateSecretRequest {
+	return ApiV1EndpointRotateSecretRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
  */
-func (a *EndpointApiService) RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostExecute(r ApiRotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostRequest) (*_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointRotateSecretExecute(r ApiV1EndpointRotateSecretRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -2184,30 +2147,30 @@ func (a *EndpointApiService) RotateEndpointSecretApiV1AppAppIdEndpointEndpointId
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointRotateSecret")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return nil, reportError("endpointId must have less than 256 elements")
+	}
 	if r.endpointSecretRotateIn == nil {
 		return nil, reportError("endpointSecretRotateIn is required and must be specified")
 	}
@@ -2256,16 +2219,6 @@ func (a *EndpointApiService) RotateEndpointSecretApiV1AppAppIdEndpointEndpointId
 			body:  localVarBody,
 			error: localVarHTTPResponse.Status,
 		}
-		if localVarHTTPResponse.StatusCode == 400 {
-			var v HttpErrorOut
-			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
-			if err != nil {
-				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
-			}
-			newErr.model = v
-			return localVarHTTPResponse, newErr
-		}
 		if localVarHTTPResponse.StatusCode == 401 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
@@ -2331,7 +2284,7 @@ func (a *EndpointApiService) RotateEndpointSecretApiV1AppAppIdEndpointEndpointId
 	return localVarHTTPResponse, nil
 }
 
-type ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest struct {
+type ApiV1EndpointSendExampleRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
@@ -2340,29 +2293,29 @@ type ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePos
 	idempotencyKey *string
 }
 
-func (r ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest) EventExampleIn(eventExampleIn EventExampleIn) ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest {
+func (r ApiV1EndpointSendExampleRequest) EventExampleIn(eventExampleIn EventExampleIn) ApiV1EndpointSendExampleRequest {
 	r.eventExampleIn = &eventExampleIn
 	return r
 }
-func (r ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest) IdempotencyKey(idempotencyKey string) ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest {
+func (r ApiV1EndpointSendExampleRequest) IdempotencyKey(idempotencyKey string) ApiV1EndpointSendExampleRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest) Execute() (MessageOut, *_nethttp.Response, error) {
-	return r.ApiService.SendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostExecute(r)
+func (r ApiV1EndpointSendExampleRequest) Execute() (MessageOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointSendExampleExecute(r)
 }
 
 /*
- * SendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePost Send Event Type Example Message
+ * V1EndpointSendExample Send Event Type Example Message
  * Send an example message for event
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointSendExampleRequest
  */
-func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePost(ctx _context.Context, appId string, endpointId string) ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest {
-	return ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest{
+func (a *EndpointApiService) V1EndpointSendExample(ctx _context.Context, appId string, endpointId string) ApiV1EndpointSendExampleRequest {
+	return ApiV1EndpointSendExampleRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -2374,7 +2327,7 @@ func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEnd
  * Execute executes the request
  * @return MessageOut
  */
-func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostExecute(r ApiSendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePostRequest) (MessageOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointSendExampleExecute(r ApiV1EndpointSendExampleRequest) (MessageOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -2384,7 +2337,7 @@ func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEnd
 		localVarReturnValue  MessageOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.SendEventTypeExampleMessageApiV1AppAppIdEndpointEndpointIdSendExamplePost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointSendExample")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -2456,7 +2409,37 @@ func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEnd
 			body:  localVarBody,
 			error: localVarHTTPResponse.Status,
 		}
-		if localVarHTTPResponse.StatusCode == 400 {
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
 			if err != nil {
@@ -2466,6 +2449,147 @@ func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEnd
 			newErr.model = v
 			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiV1EndpointTransformationGetRequest struct {
+	ctx _context.Context
+	ApiService *EndpointApiService
+	appId string
+	endpointId string
+}
+
+
+func (r ApiV1EndpointTransformationGetRequest) Execute() (EndpointTransformationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointTransformationGetExecute(r)
+}
+
+/*
+ * V1EndpointTransformationGet Get Endpoint Transformation
+ * Get the transformation code associated with this endpoint
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointTransformationGetRequest
+ */
+func (a *EndpointApiService) V1EndpointTransformationGet(ctx _context.Context, appId string, endpointId string) ApiV1EndpointTransformationGetRequest {
+	return ApiV1EndpointTransformationGetRequest{
+		ApiService: a,
+		ctx: ctx,
+		appId: appId,
+		endpointId: endpointId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return EndpointTransformationOut
+ */
+func (a *EndpointApiService) V1EndpointTransformationGetExecute(r ApiV1EndpointTransformationGetRequest) (EndpointTransformationOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodGet
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  EndpointTransformationOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointTransformationGet")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/"
+	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if strlen(r.appId) < 1 {
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
+	}
+	if strlen(r.appId) > 256 {
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
 		if localVarHTTPResponse.StatusCode == 401 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
@@ -2540,38 +2664,33 @@ func (a *EndpointApiService) SendEventTypeExampleMessageApiV1AppAppIdEndpointEnd
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest struct {
+type ApiV1EndpointTransformationPartialUpdateRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
 	endpointId string
 	endpointTransformationIn *EndpointTransformationIn
-	idempotencyKey *string
 }
 
-func (r ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest) EndpointTransformationIn(endpointTransformationIn EndpointTransformationIn) ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest {
+func (r ApiV1EndpointTransformationPartialUpdateRequest) EndpointTransformationIn(endpointTransformationIn EndpointTransformationIn) ApiV1EndpointTransformationPartialUpdateRequest {
 	r.endpointTransformationIn = &endpointTransformationIn
 	return r
 }
-func (r ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest) IdempotencyKey(idempotencyKey string) ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchExecute(r)
+func (r ApiV1EndpointTransformationPartialUpdateRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EndpointTransformationPartialUpdateExecute(r)
 }
 
 /*
- * SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch Set Endpoint Transformation
+ * V1EndpointTransformationPartialUpdate Set Endpoint Transformation
  * Set or unset the transformation code associated with this endpoint
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointTransformationPartialUpdateRequest
  */
-func (a *EndpointApiService) SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch(ctx _context.Context, appId string, endpointId string) ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest {
-	return ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest{
+func (a *EndpointApiService) V1EndpointTransformationPartialUpdate(ctx _context.Context, appId string, endpointId string) ApiV1EndpointTransformationPartialUpdateRequest {
+	return ApiV1EndpointTransformationPartialUpdateRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -2582,7 +2701,7 @@ func (a *EndpointApiService) SetEndpointTransformationApiV1AppAppIdEndpointEndpo
 /*
  * Execute executes the request
  */
-func (a *EndpointApiService) SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchExecute(r ApiSetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchRequest) (*_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointTransformationPartialUpdateExecute(r ApiV1EndpointTransformationPartialUpdateRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPatch
 		localVarPostBody     interface{}
@@ -2591,7 +2710,7 @@ func (a *EndpointApiService) SetEndpointTransformationApiV1AppAppIdEndpointEndpo
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointTransformationPartialUpdate")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -2636,9 +2755,6 @@ func (a *EndpointApiService) SetEndpointTransformationApiV1AppAppIdEndpointEndpo
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
 	localVarPostBody = r.endpointTransformationIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
@@ -2728,42 +2844,42 @@ func (a *EndpointApiService) SetEndpointTransformationApiV1AppAppIdEndpointEndpo
 	return localVarHTTPResponse, nil
 }
 
-type ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest struct {
+type ApiV1EndpointTransformationSimulateRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
+	endpointId string
 	endpointTransformationSimulateIn *EndpointTransformationSimulateIn
 	idempotencyKey *string
 }
 
-func (r ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest) EndpointTransformationSimulateIn(endpointTransformationSimulateIn EndpointTransformationSimulateIn) ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest {
+func (r ApiV1EndpointTransformationSimulateRequest) EndpointTransformationSimulateIn(endpointTransformationSimulateIn EndpointTransformationSimulateIn) ApiV1EndpointTransformationSimulateRequest {
 	r.endpointTransformationSimulateIn = &endpointTransformationSimulateIn
 	return r
 }
-func (r ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest) IdempotencyKey(idempotencyKey string) ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest {
+func (r ApiV1EndpointTransformationSimulateRequest) IdempotencyKey(idempotencyKey string) ApiV1EndpointTransformationSimulateRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest) Execute() (EndpointTransformationSimulateOut, *_nethttp.Response, error) {
-	return r.ApiService.SimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostExecute(r)
+func (r ApiV1EndpointTransformationSimulateRequest) Execute() (EndpointTransformationSimulateOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointTransformationSimulateExecute(r)
 }
 
 /*
- * SimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePost Simulate Endpoint Transformation
+ * V1EndpointTransformationSimulate Simulate
  * Simulate running the transformation on the payload and code
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointTransformationSimulateRequest
  */
-func (a *EndpointApiService) SimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePost(ctx _context.Context, endpointId string, appId string) ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest {
-	return ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest{
+func (a *EndpointApiService) V1EndpointTransformationSimulate(ctx _context.Context, appId string, endpointId string) ApiV1EndpointTransformationSimulateRequest {
+	return ApiV1EndpointTransformationSimulateRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
@@ -2771,7 +2887,7 @@ func (a *EndpointApiService) SimulateEndpointTransformationApiV1AppAppIdEndpoint
  * Execute executes the request
  * @return EndpointTransformationSimulateOut
  */
-func (a *EndpointApiService) SimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostExecute(r ApiSimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePostRequest) (EndpointTransformationSimulateOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointTransformationSimulateExecute(r ApiV1EndpointTransformationSimulateRequest) (EndpointTransformationSimulateOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -2781,30 +2897,30 @@ func (a *EndpointApiService) SimulateEndpointTransformationApiV1AppAppIdEndpoint
 		localVarReturnValue  EndpointTransformationSimulateOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.SimulateEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationSimulatePost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointTransformationSimulate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/simulate/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
 	if r.endpointTransformationSimulateIn == nil {
 		return localVarReturnValue, nil, reportError("endpointTransformationSimulateIn is required and must be specified")
 	}
@@ -2853,16 +2969,6 @@ func (a *EndpointApiService) SimulateEndpointTransformationApiV1AppAppIdEndpoint
 			body:  localVarBody,
 			error: localVarHTTPResponse.Status,
 		}
-		if localVarHTTPResponse.StatusCode == 400 {
-			var v HttpErrorOut
-			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
-			if err != nil {
-				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
-			}
-			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
-		}
 		if localVarHTTPResponse.StatusCode == 401 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
@@ -2937,42 +3043,37 @@ func (a *EndpointApiService) SimulateEndpointTransformationApiV1AppAppIdEndpoint
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest struct {
+type ApiV1EndpointUpdateRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
-	endpointId string
 	appId string
+	endpointId string
 	endpointUpdate *EndpointUpdate
-	idempotencyKey *string
 }
 
-func (r ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest) EndpointUpdate(endpointUpdate EndpointUpdate) ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest {
+func (r ApiV1EndpointUpdateRequest) EndpointUpdate(endpointUpdate EndpointUpdate) ApiV1EndpointUpdateRequest {
 	r.endpointUpdate = &endpointUpdate
 	return r
 }
-func (r ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest) IdempotencyKey(idempotencyKey string) ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
-	return r.ApiService.UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutExecute(r)
+func (r ApiV1EndpointUpdateRequest) Execute() (EndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EndpointUpdateExecute(r)
 }
 
 /*
- * UpdateEndpointApiV1AppAppIdEndpointEndpointIdPut Update Endpoint
+ * V1EndpointUpdate Update Endpoint
  * Update an endpoint.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointUpdateRequest
  */
-func (a *EndpointApiService) UpdateEndpointApiV1AppAppIdEndpointEndpointIdPut(ctx _context.Context, endpointId string, appId string) ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest {
-	return ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest{
+func (a *EndpointApiService) V1EndpointUpdate(ctx _context.Context, appId string, endpointId string) ApiV1EndpointUpdateRequest {
+	return ApiV1EndpointUpdateRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
@@ -2980,7 +3081,7 @@ func (a *EndpointApiService) UpdateEndpointApiV1AppAppIdEndpointEndpointIdPut(ct
  * Execute executes the request
  * @return EndpointOut
  */
-func (a *EndpointApiService) UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutExecute(r ApiUpdateEndpointApiV1AppAppIdEndpointEndpointIdPutRequest) (EndpointOut, *_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointUpdateExecute(r ApiV1EndpointUpdateRequest) (EndpointOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPut
 		localVarPostBody     interface{}
@@ -2990,30 +3091,30 @@ func (a *EndpointApiService) UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutExe
 		localVarReturnValue  EndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.UpdateEndpointApiV1AppAppIdEndpointEndpointIdPut")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointUpdate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
 	if r.endpointUpdate == nil {
 		return localVarReturnValue, nil, reportError("endpointUpdate is required and must be specified")
 	}
@@ -3035,9 +3136,6 @@ func (a *EndpointApiService) UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutExe
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
 	localVarPostBody = r.endpointUpdate
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
@@ -3136,38 +3234,33 @@ func (a *EndpointApiService) UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutExe
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest struct {
+type ApiV1EndpointUpdateHeadersRequest struct {
 	ctx _context.Context
 	ApiService *EndpointApiService
 	appId string
 	endpointId string
 	endpointHeadersIn *EndpointHeadersIn
-	idempotencyKey *string
 }
 
-func (r ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest) EndpointHeadersIn(endpointHeadersIn EndpointHeadersIn) ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest {
+func (r ApiV1EndpointUpdateHeadersRequest) EndpointHeadersIn(endpointHeadersIn EndpointHeadersIn) ApiV1EndpointUpdateHeadersRequest {
 	r.endpointHeadersIn = &endpointHeadersIn
 	return r
 }
-func (r ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest) IdempotencyKey(idempotencyKey string) ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutExecute(r)
+func (r ApiV1EndpointUpdateHeadersRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EndpointUpdateHeadersExecute(r)
 }
 
 /*
- * UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut Update Endpoint Headers
+ * V1EndpointUpdateHeaders Update Endpoint Headers
  * Set the additional headers to be sent with the webhook
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1EndpointUpdateHeadersRequest
  */
-func (a *EndpointApiService) UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut(ctx _context.Context, appId string, endpointId string) ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest {
-	return ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest{
+func (a *EndpointApiService) V1EndpointUpdateHeaders(ctx _context.Context, appId string, endpointId string) ApiV1EndpointUpdateHeadersRequest {
+	return ApiV1EndpointUpdateHeadersRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -3178,7 +3271,7 @@ func (a *EndpointApiService) UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointI
 /*
  * Execute executes the request
  */
-func (a *EndpointApiService) UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutExecute(r ApiUpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutRequest) (*_nethttp.Response, error) {
+func (a *EndpointApiService) V1EndpointUpdateHeadersExecute(r ApiV1EndpointUpdateHeadersRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPut
 		localVarPostBody     interface{}
@@ -3187,7 +3280,7 @@ func (a *EndpointApiService) UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointI
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EndpointApiService.V1EndpointUpdateHeaders")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -3232,9 +3325,6 @@ func (a *EndpointApiService) UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointI
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
 	localVarPostBody = r.endpointHeadersIn
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
diff --git a/go/internal/openapi/api_environment.go b/go/internal/openapi/api_environment.go
index 409dcc737..7dcf2443a 100644
--- a/go/internal/openapi/api_environment.go
+++ b/go/internal/openapi/api_environment.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -26,34 +26,34 @@ var (
 // EnvironmentApiService EnvironmentApi service
 type EnvironmentApiService service
 
-type ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest struct {
+type ApiV1EnvironmentExportRequest struct {
 	ctx _context.Context
 	ApiService *EnvironmentApiService
 	body *map[string]interface{}
 	idempotencyKey *string
 }
 
-func (r ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest) Body(body map[string]interface{}) ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest {
+func (r ApiV1EnvironmentExportRequest) Body(body map[string]interface{}) ApiV1EnvironmentExportRequest {
 	r.body = &body
 	return r
 }
-func (r ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest) IdempotencyKey(idempotencyKey string) ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest {
+func (r ApiV1EnvironmentExportRequest) IdempotencyKey(idempotencyKey string) ApiV1EnvironmentExportRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest) Execute() (EnvironmentOut, *_nethttp.Response, error) {
-	return r.ApiService.ExportEnvironmentConfigurationApiV1EnvironmentExportPostExecute(r)
+func (r ApiV1EnvironmentExportRequest) Execute() (EnvironmentOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EnvironmentExportExecute(r)
 }
 
 /*
- * ExportEnvironmentConfigurationApiV1EnvironmentExportPost Export Environment Configuration
+ * V1EnvironmentExport Export Environment Configuration
  * Download a JSON file containing all org-settings and event types
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest
+ * @return ApiV1EnvironmentExportRequest
  */
-func (a *EnvironmentApiService) ExportEnvironmentConfigurationApiV1EnvironmentExportPost(ctx _context.Context) ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest {
-	return ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest{
+func (a *EnvironmentApiService) V1EnvironmentExport(ctx _context.Context) ApiV1EnvironmentExportRequest {
+	return ApiV1EnvironmentExportRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -63,7 +63,7 @@ func (a *EnvironmentApiService) ExportEnvironmentConfigurationApiV1EnvironmentEx
  * Execute executes the request
  * @return EnvironmentOut
  */
-func (a *EnvironmentApiService) ExportEnvironmentConfigurationApiV1EnvironmentExportPostExecute(r ApiExportEnvironmentConfigurationApiV1EnvironmentExportPostRequest) (EnvironmentOut, *_nethttp.Response, error) {
+func (a *EnvironmentApiService) V1EnvironmentExportExecute(r ApiV1EnvironmentExportRequest) (EnvironmentOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -73,7 +73,7 @@ func (a *EnvironmentApiService) ExportEnvironmentConfigurationApiV1EnvironmentEx
 		localVarReturnValue  EnvironmentOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EnvironmentApiService.ExportEnvironmentConfigurationApiV1EnvironmentExportPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EnvironmentApiService.V1EnvironmentExport")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -205,35 +205,35 @@ func (a *EnvironmentApiService) ExportEnvironmentConfigurationApiV1EnvironmentEx
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest struct {
+type ApiV1EnvironmentImportRequest struct {
 	ctx _context.Context
 	ApiService *EnvironmentApiService
 	environmentIn *EnvironmentIn
 	idempotencyKey *string
 }
 
-func (r ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest) EnvironmentIn(environmentIn EnvironmentIn) ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest {
+func (r ApiV1EnvironmentImportRequest) EnvironmentIn(environmentIn EnvironmentIn) ApiV1EnvironmentImportRequest {
 	r.environmentIn = &environmentIn
 	return r
 }
-func (r ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest) IdempotencyKey(idempotencyKey string) ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest {
+func (r ApiV1EnvironmentImportRequest) IdempotencyKey(idempotencyKey string) ApiV1EnvironmentImportRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.ImportEnvironmentConfigurationApiV1EnvironmentImportPostExecute(r)
+func (r ApiV1EnvironmentImportRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EnvironmentImportExecute(r)
 }
 
 /*
- * ImportEnvironmentConfigurationApiV1EnvironmentImportPost Import Environment Configuration
+ * V1EnvironmentImport Import Environment Configuration
  * Import a configuration into the active organization.
 It doesn't delete anything, only adds/updates what was passed to it.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest
+ * @return ApiV1EnvironmentImportRequest
  */
-func (a *EnvironmentApiService) ImportEnvironmentConfigurationApiV1EnvironmentImportPost(ctx _context.Context) ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest {
-	return ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest{
+func (a *EnvironmentApiService) V1EnvironmentImport(ctx _context.Context) ApiV1EnvironmentImportRequest {
+	return ApiV1EnvironmentImportRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -242,7 +242,7 @@ func (a *EnvironmentApiService) ImportEnvironmentConfigurationApiV1EnvironmentIm
 /*
  * Execute executes the request
  */
-func (a *EnvironmentApiService) ImportEnvironmentConfigurationApiV1EnvironmentImportPostExecute(r ApiImportEnvironmentConfigurationApiV1EnvironmentImportPostRequest) (*_nethttp.Response, error) {
+func (a *EnvironmentApiService) V1EnvironmentImportExecute(r ApiV1EnvironmentImportRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -251,7 +251,7 @@ func (a *EnvironmentApiService) ImportEnvironmentConfigurationApiV1EnvironmentIm
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EnvironmentApiService.ImportEnvironmentConfigurationApiV1EnvironmentImportPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EnvironmentApiService.V1EnvironmentImport")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
diff --git a/go/internal/openapi/api_environment_settings.go b/go/internal/openapi/api_environment_settings.go
index 0c09aeae5..ca3d8222d 100644
--- a/go/internal/openapi/api_environment_settings.go
+++ b/go/internal/openapi/api_environment_settings.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -26,29 +26,24 @@ var (
 // EnvironmentSettingsApiService EnvironmentSettingsApi service
 type EnvironmentSettingsApiService service
 
-type ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest struct {
+type ApiV1EnvironmentGetSettingsRequest struct {
 	ctx _context.Context
 	ApiService *EnvironmentSettingsApiService
-	idempotencyKey *string
 }
 
-func (r ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest) IdempotencyKey(idempotencyKey string) ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest) Execute() (EnvironmentSettingsOut, *_nethttp.Response, error) {
-	return r.ApiService.GetOrgSettingsApiV1EnvironmentSettingsGetExecute(r)
+func (r ApiV1EnvironmentGetSettingsRequest) Execute() (EnvironmentSettingsOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EnvironmentGetSettingsExecute(r)
 }
 
 /*
- * GetOrgSettingsApiV1EnvironmentSettingsGet Get Org Settings
+ * V1EnvironmentGetSettings Get Org Settings
  * Get the environment's settings
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest
+ * @return ApiV1EnvironmentGetSettingsRequest
  */
-func (a *EnvironmentSettingsApiService) GetOrgSettingsApiV1EnvironmentSettingsGet(ctx _context.Context) ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest {
-	return ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest{
+func (a *EnvironmentSettingsApiService) V1EnvironmentGetSettings(ctx _context.Context) ApiV1EnvironmentGetSettingsRequest {
+	return ApiV1EnvironmentGetSettingsRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -58,7 +53,7 @@ func (a *EnvironmentSettingsApiService) GetOrgSettingsApiV1EnvironmentSettingsGe
  * Execute executes the request
  * @return EnvironmentSettingsOut
  */
-func (a *EnvironmentSettingsApiService) GetOrgSettingsApiV1EnvironmentSettingsGetExecute(r ApiGetOrgSettingsApiV1EnvironmentSettingsGetRequest) (EnvironmentSettingsOut, *_nethttp.Response, error) {
+func (a *EnvironmentSettingsApiService) V1EnvironmentGetSettingsExecute(r ApiV1EnvironmentGetSettingsRequest) (EnvironmentSettingsOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -68,7 +63,7 @@ func (a *EnvironmentSettingsApiService) GetOrgSettingsApiV1EnvironmentSettingsGe
 		localVarReturnValue  EnvironmentSettingsOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EnvironmentSettingsApiService.GetOrgSettingsApiV1EnvironmentSettingsGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EnvironmentSettingsApiService.V1EnvironmentGetSettings")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -96,9 +91,6 @@ func (a *EnvironmentSettingsApiService) GetOrgSettingsApiV1EnvironmentSettingsGe
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
diff --git a/go/internal/openapi/api_event_type.go b/go/internal/openapi/api_event_type.go
index 2b4aba51e..a33269db7 100644
--- a/go/internal/openapi/api_event_type.go
+++ b/go/internal/openapi/api_event_type.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -27,38 +27,216 @@ var (
 // EventTypeApiService EventTypeApi service
 type EventTypeApiService service
 
-type ApiCreateEventTypeApiV1EventTypePostRequest struct {
+type ApiPatchEventTypeRequest struct {
+	ctx _context.Context
+	ApiService *EventTypeApiService
+	eventTypeName string
+	eventTypePatch *EventTypePatch
+}
+
+func (r ApiPatchEventTypeRequest) EventTypePatch(eventTypePatch EventTypePatch) ApiPatchEventTypeRequest {
+	r.eventTypePatch = &eventTypePatch
+	return r
+}
+
+func (r ApiPatchEventTypeRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
+	return r.ApiService.PatchEventTypeExecute(r)
+}
+
+/*
+ * PatchEventType Patch Event Type
+ * Partially update an event type.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param eventTypeName The event type's name
+ * @return ApiPatchEventTypeRequest
+ */
+func (a *EventTypeApiService) PatchEventType(ctx _context.Context, eventTypeName string) ApiPatchEventTypeRequest {
+	return ApiPatchEventTypeRequest{
+		ApiService: a,
+		ctx: ctx,
+		eventTypeName: eventTypeName,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return EventTypeOut
+ */
+func (a *EventTypeApiService) PatchEventTypeExecute(r ApiPatchEventTypeRequest) (EventTypeOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPatch
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  EventTypeOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.PatchEventType")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/event-type/{event_type_name}/"
+	localVarPath = strings.Replace(localVarPath, "{"+"event_type_name"+"}", _neturl.PathEscape(parameterToString(r.eventTypeName, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if strlen(r.eventTypeName) > 256 {
+		return localVarReturnValue, nil, reportError("eventTypeName must have less than 256 elements")
+	}
+	if r.eventTypePatch == nil {
+		return localVarReturnValue, nil, reportError("eventTypePatch is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	// body params
+	localVarPostBody = r.eventTypePatch
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiV1EventTypeCreateRequest struct {
 	ctx _context.Context
 	ApiService *EventTypeApiService
 	eventTypeIn *EventTypeIn
 	idempotencyKey *string
 }
 
-func (r ApiCreateEventTypeApiV1EventTypePostRequest) EventTypeIn(eventTypeIn EventTypeIn) ApiCreateEventTypeApiV1EventTypePostRequest {
+func (r ApiV1EventTypeCreateRequest) EventTypeIn(eventTypeIn EventTypeIn) ApiV1EventTypeCreateRequest {
 	r.eventTypeIn = &eventTypeIn
 	return r
 }
-func (r ApiCreateEventTypeApiV1EventTypePostRequest) IdempotencyKey(idempotencyKey string) ApiCreateEventTypeApiV1EventTypePostRequest {
+func (r ApiV1EventTypeCreateRequest) IdempotencyKey(idempotencyKey string) ApiV1EventTypeCreateRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiCreateEventTypeApiV1EventTypePostRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
-	return r.ApiService.CreateEventTypeApiV1EventTypePostExecute(r)
+func (r ApiV1EventTypeCreateRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EventTypeCreateExecute(r)
 }
 
 /*
- * CreateEventTypeApiV1EventTypePost Create Event Type
+ * V1EventTypeCreate Create Event Type
  * Create new or unarchive existing event type.
 
 Unarchiving an event type will allow endpoints to filter on it and messages to be sent with it.
 Endpoints filtering on the event type before archival will continue to filter on it.
 This operation does not preserve the description and schemas.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiCreateEventTypeApiV1EventTypePostRequest
+ * @return ApiV1EventTypeCreateRequest
  */
-func (a *EventTypeApiService) CreateEventTypeApiV1EventTypePost(ctx _context.Context) ApiCreateEventTypeApiV1EventTypePostRequest {
-	return ApiCreateEventTypeApiV1EventTypePostRequest{
+func (a *EventTypeApiService) V1EventTypeCreate(ctx _context.Context) ApiV1EventTypeCreateRequest {
+	return ApiV1EventTypeCreateRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -68,7 +246,7 @@ func (a *EventTypeApiService) CreateEventTypeApiV1EventTypePost(ctx _context.Con
  * Execute executes the request
  * @return EventTypeOut
  */
-func (a *EventTypeApiService) CreateEventTypeApiV1EventTypePostExecute(r ApiCreateEventTypeApiV1EventTypePostRequest) (EventTypeOut, *_nethttp.Response, error) {
+func (a *EventTypeApiService) V1EventTypeCreateExecute(r ApiV1EventTypeCreateRequest) (EventTypeOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -78,7 +256,7 @@ func (a *EventTypeApiService) CreateEventTypeApiV1EventTypePostExecute(r ApiCrea
 		localVarReturnValue  EventTypeOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.CreateEventTypeApiV1EventTypePost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.V1EventTypeCreate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -210,44 +388,36 @@ func (a *EventTypeApiService) CreateEventTypeApiV1EventTypePostExecute(r ApiCrea
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest struct {
+type ApiV1EventTypeDeleteRequest struct {
 	ctx _context.Context
 	ApiService *EventTypeApiService
 	eventTypeName string
 	expunge *bool
-	idempotencyKey *string
 }
 
-func (r ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest) Expunge(expunge bool) ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest {
+func (r ApiV1EventTypeDeleteRequest) Expunge(expunge bool) ApiV1EventTypeDeleteRequest {
 	r.expunge = &expunge
 	return r
 }
-func (r ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest) IdempotencyKey(idempotencyKey string) ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.DeleteEventTypeApiV1EventTypeEventTypeNameDeleteExecute(r)
+func (r ApiV1EventTypeDeleteRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1EventTypeDeleteExecute(r)
 }
 
 /*
- * DeleteEventTypeApiV1EventTypeEventTypeNameDelete Archive Event Type
+ * V1EventTypeDelete Delete Event Type
  * Archive an event type.
 
 Endpoints already configured to filter on an event type will continue to do so after archival.
 However, new messages can not be sent with it and endpoints can not filter on it.
 An event type can be unarchived with the
 [create operation](#operation/create_event_type_api_v1_event_type__post).
-
-If `expunge=true` is set then the event type is deleted instead of archived.
-This can only be used in development environments.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param eventTypeName
- * @return ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest
+ * @param eventTypeName The event type's name
+ * @return ApiV1EventTypeDeleteRequest
  */
-func (a *EventTypeApiService) DeleteEventTypeApiV1EventTypeEventTypeNameDelete(ctx _context.Context, eventTypeName string) ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest {
-	return ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest{
+func (a *EventTypeApiService) V1EventTypeDelete(ctx _context.Context, eventTypeName string) ApiV1EventTypeDeleteRequest {
+	return ApiV1EventTypeDeleteRequest{
 		ApiService: a,
 		ctx: ctx,
 		eventTypeName: eventTypeName,
@@ -257,7 +427,7 @@ func (a *EventTypeApiService) DeleteEventTypeApiV1EventTypeEventTypeNameDelete(c
 /*
  * Execute executes the request
  */
-func (a *EventTypeApiService) DeleteEventTypeApiV1EventTypeEventTypeNameDeleteExecute(r ApiDeleteEventTypeApiV1EventTypeEventTypeNameDeleteRequest) (*_nethttp.Response, error) {
+func (a *EventTypeApiService) V1EventTypeDeleteExecute(r ApiV1EventTypeDeleteRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodDelete
 		localVarPostBody     interface{}
@@ -266,7 +436,7 @@ func (a *EventTypeApiService) DeleteEventTypeApiV1EventTypeEventTypeNameDeleteEx
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.DeleteEventTypeApiV1EventTypeEventTypeNameDelete")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.V1EventTypeDelete")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -301,9 +471,6 @@ func (a *EventTypeApiService) DeleteEventTypeApiV1EventTypeEventTypeNameDeleteEx
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return nil, err
@@ -391,34 +558,34 @@ func (a *EventTypeApiService) DeleteEventTypeApiV1EventTypeEventTypeNameDeleteEx
 	return localVarHTTPResponse, nil
 }
 
-type ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest struct {
+type ApiV1EventTypeGenerateExampleRequest struct {
 	ctx _context.Context
 	ApiService *EventTypeApiService
 	eventTypeSchemaIn *EventTypeSchemaIn
 	idempotencyKey *string
 }
 
-func (r ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest) EventTypeSchemaIn(eventTypeSchemaIn EventTypeSchemaIn) ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest {
+func (r ApiV1EventTypeGenerateExampleRequest) EventTypeSchemaIn(eventTypeSchemaIn EventTypeSchemaIn) ApiV1EventTypeGenerateExampleRequest {
 	r.eventTypeSchemaIn = &eventTypeSchemaIn
 	return r
 }
-func (r ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest) IdempotencyKey(idempotencyKey string) ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest {
+func (r ApiV1EventTypeGenerateExampleRequest) IdempotencyKey(idempotencyKey string) ApiV1EventTypeGenerateExampleRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest) Execute() (EventTypeExampleOut, *_nethttp.Response, error) {
-	return r.ApiService.GenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostExecute(r)
+func (r ApiV1EventTypeGenerateExampleRequest) Execute() (EventTypeExampleOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EventTypeGenerateExampleExecute(r)
 }
 
 /*
- * GenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePost Generate Schema Example
+ * V1EventTypeGenerateExample Generate Schema Example
  * Generates a fake example from the given JSONSchema
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest
+ * @return ApiV1EventTypeGenerateExampleRequest
  */
-func (a *EventTypeApiService) GenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePost(ctx _context.Context) ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest {
-	return ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest{
+func (a *EventTypeApiService) V1EventTypeGenerateExample(ctx _context.Context) ApiV1EventTypeGenerateExampleRequest {
+	return ApiV1EventTypeGenerateExampleRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -428,7 +595,7 @@ func (a *EventTypeApiService) GenerateSchemaExampleApiV1EventTypeSchemaGenerateE
  * Execute executes the request
  * @return EventTypeExampleOut
  */
-func (a *EventTypeApiService) GenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostExecute(r ApiGenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePostRequest) (EventTypeExampleOut, *_nethttp.Response, error) {
+func (a *EventTypeApiService) V1EventTypeGenerateExampleExecute(r ApiV1EventTypeGenerateExampleRequest) (EventTypeExampleOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -438,7 +605,7 @@ func (a *EventTypeApiService) GenerateSchemaExampleApiV1EventTypeSchemaGenerateE
 		localVarReturnValue  EventTypeExampleOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.GenerateSchemaExampleApiV1EventTypeSchemaGenerateExamplePost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.V1EventTypeGenerateExample")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -570,31 +737,26 @@ func (a *EventTypeApiService) GenerateSchemaExampleApiV1EventTypeSchemaGenerateE
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest struct {
+type ApiV1EventTypeGetRequest struct {
 	ctx _context.Context
 	ApiService *EventTypeApiService
 	eventTypeName string
-	idempotencyKey *string
 }
 
-func (r ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
-	return r.ApiService.GetEventTypeApiV1EventTypeEventTypeNameGetExecute(r)
+func (r ApiV1EventTypeGetRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EventTypeGetExecute(r)
 }
 
 /*
- * GetEventTypeApiV1EventTypeEventTypeNameGet Get Event Type
+ * V1EventTypeGet Get Event Type
  * Get an event type.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param eventTypeName
- * @return ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest
+ * @param eventTypeName The event type's name
+ * @return ApiV1EventTypeGetRequest
  */
-func (a *EventTypeApiService) GetEventTypeApiV1EventTypeEventTypeNameGet(ctx _context.Context, eventTypeName string) ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest {
-	return ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest{
+func (a *EventTypeApiService) V1EventTypeGet(ctx _context.Context, eventTypeName string) ApiV1EventTypeGetRequest {
+	return ApiV1EventTypeGetRequest{
 		ApiService: a,
 		ctx: ctx,
 		eventTypeName: eventTypeName,
@@ -605,7 +767,7 @@ func (a *EventTypeApiService) GetEventTypeApiV1EventTypeEventTypeNameGet(ctx _co
  * Execute executes the request
  * @return EventTypeOut
  */
-func (a *EventTypeApiService) GetEventTypeApiV1EventTypeEventTypeNameGetExecute(r ApiGetEventTypeApiV1EventTypeEventTypeNameGetRequest) (EventTypeOut, *_nethttp.Response, error) {
+func (a *EventTypeApiService) V1EventTypeGetExecute(r ApiV1EventTypeGetRequest) (EventTypeOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -615,7 +777,7 @@ func (a *EventTypeApiService) GetEventTypeApiV1EventTypeEventTypeNameGetExecute(
 		localVarReturnValue  EventTypeOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.GetEventTypeApiV1EventTypeEventTypeNameGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.V1EventTypeGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -647,9 +809,6 @@ func (a *EventTypeApiService) GetEventTypeApiV1EventTypeEventTypeNameGetExecute(
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -746,49 +905,49 @@ func (a *EventTypeApiService) GetEventTypeApiV1EventTypeEventTypeNameGetExecute(
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListEventTypesApiV1EventTypeGetRequest struct {
+type ApiV1EventTypeListRequest struct {
 	ctx _context.Context
 	ApiService *EventTypeApiService
-	iterator *string
 	limit *int32
-	withContent *bool
+	iterator *string
+	order *Ordering
 	includeArchived *bool
-	idempotencyKey *string
+	withContent *bool
 }
 
-func (r ApiListEventTypesApiV1EventTypeGetRequest) Iterator(iterator string) ApiListEventTypesApiV1EventTypeGetRequest {
-	r.iterator = &iterator
+func (r ApiV1EventTypeListRequest) Limit(limit int32) ApiV1EventTypeListRequest {
+	r.limit = &limit
 	return r
 }
-func (r ApiListEventTypesApiV1EventTypeGetRequest) Limit(limit int32) ApiListEventTypesApiV1EventTypeGetRequest {
-	r.limit = &limit
+func (r ApiV1EventTypeListRequest) Iterator(iterator string) ApiV1EventTypeListRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListEventTypesApiV1EventTypeGetRequest) WithContent(withContent bool) ApiListEventTypesApiV1EventTypeGetRequest {
-	r.withContent = &withContent
+func (r ApiV1EventTypeListRequest) Order(order Ordering) ApiV1EventTypeListRequest {
+	r.order = &order
 	return r
 }
-func (r ApiListEventTypesApiV1EventTypeGetRequest) IncludeArchived(includeArchived bool) ApiListEventTypesApiV1EventTypeGetRequest {
+func (r ApiV1EventTypeListRequest) IncludeArchived(includeArchived bool) ApiV1EventTypeListRequest {
 	r.includeArchived = &includeArchived
 	return r
 }
-func (r ApiListEventTypesApiV1EventTypeGetRequest) IdempotencyKey(idempotencyKey string) ApiListEventTypesApiV1EventTypeGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1EventTypeListRequest) WithContent(withContent bool) ApiV1EventTypeListRequest {
+	r.withContent = &withContent
 	return r
 }
 
-func (r ApiListEventTypesApiV1EventTypeGetRequest) Execute() (ListResponseEventTypeOut, *_nethttp.Response, error) {
-	return r.ApiService.ListEventTypesApiV1EventTypeGetExecute(r)
+func (r ApiV1EventTypeListRequest) Execute() (ListResponseEventTypeOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EventTypeListExecute(r)
 }
 
 /*
- * ListEventTypesApiV1EventTypeGet List Event Types
+ * V1EventTypeList List Event Types
  * Return the list of event types.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiListEventTypesApiV1EventTypeGetRequest
+ * @return ApiV1EventTypeListRequest
  */
-func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGet(ctx _context.Context) ApiListEventTypesApiV1EventTypeGetRequest {
-	return ApiListEventTypesApiV1EventTypeGetRequest{
+func (a *EventTypeApiService) V1EventTypeList(ctx _context.Context) ApiV1EventTypeListRequest {
+	return ApiV1EventTypeListRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -798,7 +957,7 @@ func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGet(ctx _context.Conte
  * Execute executes the request
  * @return ListResponseEventTypeOut
  */
-func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGetExecute(r ApiListEventTypesApiV1EventTypeGetRequest) (ListResponseEventTypeOut, *_nethttp.Response, error) {
+func (a *EventTypeApiService) V1EventTypeListExecute(r ApiV1EventTypeListRequest) (ListResponseEventTypeOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -808,7 +967,7 @@ func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGetExecute(r ApiListEv
 		localVarReturnValue  ListResponseEventTypeOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.ListEventTypesApiV1EventTypeGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.V1EventTypeList")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -819,18 +978,21 @@ func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGetExecute(r ApiListEv
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
 
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
-	}
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
-	if r.withContent != nil {
-		localVarQueryParams.Add("with_content", parameterToString(*r.withContent, ""))
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
+	if r.order != nil {
+		localVarQueryParams.Add("order", parameterToString(*r.order, ""))
 	}
 	if r.includeArchived != nil {
 		localVarQueryParams.Add("include_archived", parameterToString(*r.includeArchived, ""))
 	}
+	if r.withContent != nil {
+		localVarQueryParams.Add("with_content", parameterToString(*r.withContent, ""))
+	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -848,9 +1010,6 @@ func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGetExecute(r ApiListEv
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -947,36 +1106,31 @@ func (a *EventTypeApiService) ListEventTypesApiV1EventTypeGetExecute(r ApiListEv
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest struct {
+type ApiV1EventTypeUpdateRequest struct {
 	ctx _context.Context
 	ApiService *EventTypeApiService
 	eventTypeName string
 	eventTypeUpdate *EventTypeUpdate
-	idempotencyKey *string
 }
 
-func (r ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest) EventTypeUpdate(eventTypeUpdate EventTypeUpdate) ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest {
+func (r ApiV1EventTypeUpdateRequest) EventTypeUpdate(eventTypeUpdate EventTypeUpdate) ApiV1EventTypeUpdateRequest {
 	r.eventTypeUpdate = &eventTypeUpdate
 	return r
 }
-func (r ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest) IdempotencyKey(idempotencyKey string) ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
-	return r.ApiService.UpdateEventTypeApiV1EventTypeEventTypeNamePutExecute(r)
+func (r ApiV1EventTypeUpdateRequest) Execute() (EventTypeOut, *_nethttp.Response, error) {
+	return r.ApiService.V1EventTypeUpdateExecute(r)
 }
 
 /*
- * UpdateEventTypeApiV1EventTypeEventTypeNamePut Update Event Type
+ * V1EventTypeUpdate Update Event Type
  * Update an event type.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param eventTypeName
- * @return ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest
+ * @param eventTypeName The event type's name
+ * @return ApiV1EventTypeUpdateRequest
  */
-func (a *EventTypeApiService) UpdateEventTypeApiV1EventTypeEventTypeNamePut(ctx _context.Context, eventTypeName string) ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest {
-	return ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest{
+func (a *EventTypeApiService) V1EventTypeUpdate(ctx _context.Context, eventTypeName string) ApiV1EventTypeUpdateRequest {
+	return ApiV1EventTypeUpdateRequest{
 		ApiService: a,
 		ctx: ctx,
 		eventTypeName: eventTypeName,
@@ -987,7 +1141,7 @@ func (a *EventTypeApiService) UpdateEventTypeApiV1EventTypeEventTypeNamePut(ctx
  * Execute executes the request
  * @return EventTypeOut
  */
-func (a *EventTypeApiService) UpdateEventTypeApiV1EventTypeEventTypeNamePutExecute(r ApiUpdateEventTypeApiV1EventTypeEventTypeNamePutRequest) (EventTypeOut, *_nethttp.Response, error) {
+func (a *EventTypeApiService) V1EventTypeUpdateExecute(r ApiV1EventTypeUpdateRequest) (EventTypeOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPut
 		localVarPostBody     interface{}
@@ -997,7 +1151,7 @@ func (a *EventTypeApiService) UpdateEventTypeApiV1EventTypeEventTypeNamePutExecu
 		localVarReturnValue  EventTypeOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.UpdateEventTypeApiV1EventTypeEventTypeNamePut")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "EventTypeApiService.V1EventTypeUpdate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1032,9 +1186,6 @@ func (a *EventTypeApiService) UpdateEventTypeApiV1EventTypeEventTypeNamePutExecu
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
 	localVarPostBody = r.eventTypeUpdate
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
diff --git a/go/internal/openapi/api_health.go b/go/internal/openapi/api_health.go
index 8a20500e1..e43f56886 100644
--- a/go/internal/openapi/api_health.go
+++ b/go/internal/openapi/api_health.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -26,29 +26,24 @@ var (
 // HealthApiService HealthApi service
 type HealthApiService service
 
-type ApiHealthApiV1HealthGetRequest struct {
+type ApiV1HealthGetRequest struct {
 	ctx _context.Context
 	ApiService *HealthApiService
-	idempotencyKey *string
 }
 
-func (r ApiHealthApiV1HealthGetRequest) IdempotencyKey(idempotencyKey string) ApiHealthApiV1HealthGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiHealthApiV1HealthGetRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.HealthApiV1HealthGetExecute(r)
+func (r ApiV1HealthGetRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1HealthGetExecute(r)
 }
 
 /*
- * HealthApiV1HealthGet Health
+ * V1HealthGet Health
  * Verify the API server is up and running.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @return ApiHealthApiV1HealthGetRequest
+ * @return ApiV1HealthGetRequest
  */
-func (a *HealthApiService) HealthApiV1HealthGet(ctx _context.Context) ApiHealthApiV1HealthGetRequest {
-	return ApiHealthApiV1HealthGetRequest{
+func (a *HealthApiService) V1HealthGet(ctx _context.Context) ApiV1HealthGetRequest {
+	return ApiV1HealthGetRequest{
 		ApiService: a,
 		ctx: ctx,
 	}
@@ -57,7 +52,7 @@ func (a *HealthApiService) HealthApiV1HealthGet(ctx _context.Context) ApiHealthA
 /*
  * Execute executes the request
  */
-func (a *HealthApiService) HealthApiV1HealthGetExecute(r ApiHealthApiV1HealthGetRequest) (*_nethttp.Response, error) {
+func (a *HealthApiService) V1HealthGetExecute(r ApiV1HealthGetRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -66,7 +61,7 @@ func (a *HealthApiService) HealthApiV1HealthGetExecute(r ApiHealthApiV1HealthGet
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "HealthApiService.HealthApiV1HealthGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "HealthApiService.V1HealthGet")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -94,9 +89,6 @@ func (a *HealthApiService) HealthApiV1HealthGetExecute(r ApiHealthApiV1HealthGet
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return nil, err
@@ -119,6 +111,46 @@ func (a *HealthApiService) HealthApiV1HealthGetExecute(r ApiHealthApiV1HealthGet
 			body:  localVarBody,
 			error: localVarHTTPResponse.Status,
 		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
 		if localVarHTTPResponse.StatusCode == 422 {
 			var v HTTPValidationError
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
@@ -127,6 +159,16 @@ func (a *HealthApiService) HealthApiV1HealthGetExecute(r ApiHealthApiV1HealthGet
 				return localVarHTTPResponse, newErr
 			}
 			newErr.model = v
+			return localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarHTTPResponse, newErr
+			}
+			newErr.model = v
 		}
 		return localVarHTTPResponse, newErr
 	}
diff --git a/go/internal/openapi/api_integration.go b/go/internal/openapi/api_integration.go
index 3e432fbe1..f1383ba87 100644
--- a/go/internal/openapi/api_integration.go
+++ b/go/internal/openapi/api_integration.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -27,7 +27,7 @@ var (
 // IntegrationApiService IntegrationApi service
 type IntegrationApiService service
 
-type ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest struct {
+type ApiV1IntegrationCreateRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
 	appId string
@@ -35,28 +35,28 @@ type ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest struct {
 	idempotencyKey *string
 }
 
-func (r ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest) IntegrationIn(integrationIn IntegrationIn) ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest {
+func (r ApiV1IntegrationCreateRequest) IntegrationIn(integrationIn IntegrationIn) ApiV1IntegrationCreateRequest {
 	r.integrationIn = &integrationIn
 	return r
 }
-func (r ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest) IdempotencyKey(idempotencyKey string) ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest {
+func (r ApiV1IntegrationCreateRequest) IdempotencyKey(idempotencyKey string) ApiV1IntegrationCreateRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest) Execute() (IntegrationOut, *_nethttp.Response, error) {
-	return r.ApiService.CreateIntegrationApiV1AppAppIdIntegrationPostExecute(r)
+func (r ApiV1IntegrationCreateRequest) Execute() (IntegrationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationCreateExecute(r)
 }
 
 /*
- * CreateIntegrationApiV1AppAppIdIntegrationPost Create Integration
+ * V1IntegrationCreate Create Integration
  * Create an integration.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1IntegrationCreateRequest
  */
-func (a *IntegrationApiService) CreateIntegrationApiV1AppAppIdIntegrationPost(ctx _context.Context, appId string) ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest {
-	return ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest{
+func (a *IntegrationApiService) V1IntegrationCreate(ctx _context.Context, appId string) ApiV1IntegrationCreateRequest {
+	return ApiV1IntegrationCreateRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -67,7 +67,7 @@ func (a *IntegrationApiService) CreateIntegrationApiV1AppAppIdIntegrationPost(ct
  * Execute executes the request
  * @return IntegrationOut
  */
-func (a *IntegrationApiService) CreateIntegrationApiV1AppAppIdIntegrationPostExecute(r ApiCreateIntegrationApiV1AppAppIdIntegrationPostRequest) (IntegrationOut, *_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationCreateExecute(r ApiV1IntegrationCreateRequest) (IntegrationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -77,7 +77,7 @@ func (a *IntegrationApiService) CreateIntegrationApiV1AppAppIdIntegrationPostExe
 		localVarReturnValue  IntegrationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.CreateIntegrationApiV1AppAppIdIntegrationPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationCreate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -216,44 +216,39 @@ func (a *IntegrationApiService) CreateIntegrationApiV1AppAppIdIntegrationPostExe
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest struct {
+type ApiV1IntegrationDeleteRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
-	integId string
 	appId string
-	idempotencyKey *string
+	integId string
 }
 
-func (r ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest) IdempotencyKey(idempotencyKey string) ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteExecute(r)
+func (r ApiV1IntegrationDeleteRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationDeleteExecute(r)
 }
 
 /*
- * DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete Delete Integration
- * Delete an integration and revoke it's key.
+ * V1IntegrationDelete Delete Integration
+ * Delete an integration.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param integId
- * @param appId
- * @return ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest
+ * @param appId The app's ID or UID
+ * @param integId The integ's ID
+ * @return ApiV1IntegrationDeleteRequest
  */
-func (a *IntegrationApiService) DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete(ctx _context.Context, integId string, appId string) ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest {
-	return ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest{
+func (a *IntegrationApiService) V1IntegrationDelete(ctx _context.Context, appId string, integId string) ApiV1IntegrationDeleteRequest {
+	return ApiV1IntegrationDeleteRequest{
 		ApiService: a,
 		ctx: ctx,
-		integId: integId,
 		appId: appId,
+		integId: integId,
 	}
 }
 
 /*
  * Execute executes the request
  */
-func (a *IntegrationApiService) DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteExecute(r ApiDeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteRequest) (*_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationDeleteExecute(r ApiV1IntegrationDeleteRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodDelete
 		localVarPostBody     interface{}
@@ -262,14 +257,14 @@ func (a *IntegrationApiService) DeleteIntegrationApiV1AppAppIdIntegrationIntegId
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationDelete")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/integration/{integ_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -298,9 +293,6 @@ func (a *IntegrationApiService) DeleteIntegrationApiV1AppAppIdIntegrationIntegId
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return nil, err
@@ -388,37 +380,32 @@ func (a *IntegrationApiService) DeleteIntegrationApiV1AppAppIdIntegrationIntegId
 	return localVarHTTPResponse, nil
 }
 
-type ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest struct {
+type ApiV1IntegrationGetRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
-	integId string
 	appId string
-	idempotencyKey *string
+	integId string
 }
 
-func (r ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest) IdempotencyKey(idempotencyKey string) ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest) Execute() (IntegrationOut, *_nethttp.Response, error) {
-	return r.ApiService.GetIntegrationApiV1AppAppIdIntegrationIntegIdGetExecute(r)
+func (r ApiV1IntegrationGetRequest) Execute() (IntegrationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationGetExecute(r)
 }
 
 /*
- * GetIntegrationApiV1AppAppIdIntegrationIntegIdGet Get Integration
+ * V1IntegrationGet Get Integration
  * Get an integration.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param integId
- * @param appId
- * @return ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest
+ * @param appId The app's ID or UID
+ * @param integId The integ's ID
+ * @return ApiV1IntegrationGetRequest
  */
-func (a *IntegrationApiService) GetIntegrationApiV1AppAppIdIntegrationIntegIdGet(ctx _context.Context, integId string, appId string) ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest {
-	return ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest{
+func (a *IntegrationApiService) V1IntegrationGet(ctx _context.Context, appId string, integId string) ApiV1IntegrationGetRequest {
+	return ApiV1IntegrationGetRequest{
 		ApiService: a,
 		ctx: ctx,
-		integId: integId,
 		appId: appId,
+		integId: integId,
 	}
 }
 
@@ -426,7 +413,7 @@ func (a *IntegrationApiService) GetIntegrationApiV1AppAppIdIntegrationIntegIdGet
  * Execute executes the request
  * @return IntegrationOut
  */
-func (a *IntegrationApiService) GetIntegrationApiV1AppAppIdIntegrationIntegIdGetExecute(r ApiGetIntegrationApiV1AppAppIdIntegrationIntegIdGetRequest) (IntegrationOut, *_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationGetExecute(r ApiV1IntegrationGetRequest) (IntegrationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -436,14 +423,14 @@ func (a *IntegrationApiService) GetIntegrationApiV1AppAppIdIntegrationIntegIdGet
 		localVarReturnValue  IntegrationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.GetIntegrationApiV1AppAppIdIntegrationIntegIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/integration/{integ_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -472,9 +459,6 @@ func (a *IntegrationApiService) GetIntegrationApiV1AppAppIdIntegrationIntegIdGet
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -571,37 +555,32 @@ func (a *IntegrationApiService) GetIntegrationApiV1AppAppIdIntegrationIntegIdGet
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest struct {
+type ApiV1IntegrationGetKeyRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
-	integId string
 	appId string
-	idempotencyKey *string
+	integId string
 }
 
-func (r ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest) IdempotencyKey(idempotencyKey string) ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest) Execute() (IntegrationKeyOut, *_nethttp.Response, error) {
-	return r.ApiService.GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetExecute(r)
+func (r ApiV1IntegrationGetKeyRequest) Execute() (IntegrationKeyOut, *_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationGetKeyExecute(r)
 }
 
 /*
- * GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet Get Integration Key
+ * V1IntegrationGetKey Get Integration Key
  * Get an integration's key.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param integId
- * @param appId
- * @return ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest
+ * @param appId The app's ID or UID
+ * @param integId The integ's ID
+ * @return ApiV1IntegrationGetKeyRequest
  */
-func (a *IntegrationApiService) GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet(ctx _context.Context, integId string, appId string) ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest {
-	return ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest{
+func (a *IntegrationApiService) V1IntegrationGetKey(ctx _context.Context, appId string, integId string) ApiV1IntegrationGetKeyRequest {
+	return ApiV1IntegrationGetKeyRequest{
 		ApiService: a,
 		ctx: ctx,
-		integId: integId,
 		appId: appId,
+		integId: integId,
 	}
 }
 
@@ -609,7 +588,7 @@ func (a *IntegrationApiService) GetIntegrationKeyApiV1AppAppIdIntegrationIntegId
  * Execute executes the request
  * @return IntegrationKeyOut
  */
-func (a *IntegrationApiService) GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetExecute(r ApiGetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetRequest) (IntegrationKeyOut, *_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationGetKeyExecute(r ApiV1IntegrationGetKeyRequest) (IntegrationKeyOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -619,14 +598,14 @@ func (a *IntegrationApiService) GetIntegrationKeyApiV1AppAppIdIntegrationIntegId
 		localVarReturnValue  IntegrationKeyOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationGetKey")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/integration/{integ_id}/key/"
-	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -655,9 +634,6 @@ func (a *IntegrationApiService) GetIntegrationKeyApiV1AppAppIdIntegrationIntegId
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -754,41 +730,36 @@ func (a *IntegrationApiService) GetIntegrationKeyApiV1AppAppIdIntegrationIntegId
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest struct {
+type ApiV1IntegrationListRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
 	appId string
-	iterator *string
 	limit *int32
-	idempotencyKey *string
+	iterator *string
 }
 
-func (r ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest) Iterator(iterator string) ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest) Limit(limit int32) ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest {
+func (r ApiV1IntegrationListRequest) Limit(limit int32) ApiV1IntegrationListRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest) IdempotencyKey(idempotencyKey string) ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1IntegrationListRequest) Iterator(iterator string) ApiV1IntegrationListRequest {
+	r.iterator = &iterator
 	return r
 }
 
-func (r ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest) Execute() (ListResponseIntegrationOut, *_nethttp.Response, error) {
-	return r.ApiService.ListIntegrationsApiV1AppAppIdIntegrationGetExecute(r)
+func (r ApiV1IntegrationListRequest) Execute() (ListResponseIntegrationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationListExecute(r)
 }
 
 /*
- * ListIntegrationsApiV1AppAppIdIntegrationGet List Integrations
+ * V1IntegrationList List Integrations
  * List the application's integrations.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1IntegrationListRequest
  */
-func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGet(ctx _context.Context, appId string) ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest {
-	return ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest{
+func (a *IntegrationApiService) V1IntegrationList(ctx _context.Context, appId string) ApiV1IntegrationListRequest {
+	return ApiV1IntegrationListRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -799,7 +770,7 @@ func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGet(ctx
  * Execute executes the request
  * @return ListResponseIntegrationOut
  */
-func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGetExecute(r ApiListIntegrationsApiV1AppAppIdIntegrationGetRequest) (ListResponseIntegrationOut, *_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationListExecute(r ApiV1IntegrationListRequest) (ListResponseIntegrationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -809,7 +780,7 @@ func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGetExecu
 		localVarReturnValue  ListResponseIntegrationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.ListIntegrationsApiV1AppAppIdIntegrationGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationList")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -827,12 +798,12 @@ func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGetExecu
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
 
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
-	}
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -850,9 +821,6 @@ func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGetExecu
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -949,37 +917,37 @@ func (a *IntegrationApiService) ListIntegrationsApiV1AppAppIdIntegrationGetExecu
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest struct {
+type ApiV1IntegrationRotateKeyRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
-	integId string
 	appId string
+	integId string
 	idempotencyKey *string
 }
 
-func (r ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest) IdempotencyKey(idempotencyKey string) ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest {
+func (r ApiV1IntegrationRotateKeyRequest) IdempotencyKey(idempotencyKey string) ApiV1IntegrationRotateKeyRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest) Execute() (IntegrationKeyOut, *_nethttp.Response, error) {
-	return r.ApiService.RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostExecute(r)
+func (r ApiV1IntegrationRotateKeyRequest) Execute() (IntegrationKeyOut, *_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationRotateKeyExecute(r)
 }
 
 /*
- * RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost Rotate Integration Key
+ * V1IntegrationRotateKey Rotate Integration Key
  * Rotate the integration's key. The previous key will be immediately revoked.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param integId
- * @param appId
- * @return ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest
+ * @param appId The app's ID or UID
+ * @param integId The integ's ID
+ * @return ApiV1IntegrationRotateKeyRequest
  */
-func (a *IntegrationApiService) RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost(ctx _context.Context, integId string, appId string) ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest {
-	return ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest{
+func (a *IntegrationApiService) V1IntegrationRotateKey(ctx _context.Context, appId string, integId string) ApiV1IntegrationRotateKeyRequest {
+	return ApiV1IntegrationRotateKeyRequest{
 		ApiService: a,
 		ctx: ctx,
-		integId: integId,
 		appId: appId,
+		integId: integId,
 	}
 }
 
@@ -987,7 +955,7 @@ func (a *IntegrationApiService) RotateIntegrationKeyApiV1AppAppIdIntegrationInte
  * Execute executes the request
  * @return IntegrationKeyOut
  */
-func (a *IntegrationApiService) RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostExecute(r ApiRotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostRequest) (IntegrationKeyOut, *_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationRotateKeyExecute(r ApiV1IntegrationRotateKeyRequest) (IntegrationKeyOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -997,14 +965,14 @@ func (a *IntegrationApiService) RotateIntegrationKeyApiV1AppAppIdIntegrationInte
 		localVarReturnValue  IntegrationKeyOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationRotateKey")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/integration/{integ_id}/key/rotate/"
-	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -1132,42 +1100,37 @@ func (a *IntegrationApiService) RotateIntegrationKeyApiV1AppAppIdIntegrationInte
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest struct {
+type ApiV1IntegrationUpdateRequest struct {
 	ctx _context.Context
 	ApiService *IntegrationApiService
-	integId string
 	appId string
+	integId string
 	integrationUpdate *IntegrationUpdate
-	idempotencyKey *string
 }
 
-func (r ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest) IntegrationUpdate(integrationUpdate IntegrationUpdate) ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest {
+func (r ApiV1IntegrationUpdateRequest) IntegrationUpdate(integrationUpdate IntegrationUpdate) ApiV1IntegrationUpdateRequest {
 	r.integrationUpdate = &integrationUpdate
 	return r
 }
-func (r ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest) IdempotencyKey(idempotencyKey string) ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest) Execute() (IntegrationOut, *_nethttp.Response, error) {
-	return r.ApiService.UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutExecute(r)
+func (r ApiV1IntegrationUpdateRequest) Execute() (IntegrationOut, *_nethttp.Response, error) {
+	return r.ApiService.V1IntegrationUpdateExecute(r)
 }
 
 /*
- * UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPut Update Integration
+ * V1IntegrationUpdate Update Integration
  * Update an integration.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param integId
- * @param appId
- * @return ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest
+ * @param appId The app's ID or UID
+ * @param integId The integ's ID
+ * @return ApiV1IntegrationUpdateRequest
  */
-func (a *IntegrationApiService) UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPut(ctx _context.Context, integId string, appId string) ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest {
-	return ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest{
+func (a *IntegrationApiService) V1IntegrationUpdate(ctx _context.Context, appId string, integId string) ApiV1IntegrationUpdateRequest {
+	return ApiV1IntegrationUpdateRequest{
 		ApiService: a,
 		ctx: ctx,
-		integId: integId,
 		appId: appId,
+		integId: integId,
 	}
 }
 
@@ -1175,7 +1138,7 @@ func (a *IntegrationApiService) UpdateIntegrationApiV1AppAppIdIntegrationIntegId
  * Execute executes the request
  * @return IntegrationOut
  */
-func (a *IntegrationApiService) UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutExecute(r ApiUpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutRequest) (IntegrationOut, *_nethttp.Response, error) {
+func (a *IntegrationApiService) V1IntegrationUpdateExecute(r ApiV1IntegrationUpdateRequest) (IntegrationOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPut
 		localVarPostBody     interface{}
@@ -1185,14 +1148,14 @@ func (a *IntegrationApiService) UpdateIntegrationApiV1AppAppIdIntegrationIntegId
 		localVarReturnValue  IntegrationOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPut")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "IntegrationApiService.V1IntegrationUpdate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/integration/{integ_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"integ_id"+"}", _neturl.PathEscape(parameterToString(r.integId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -1224,9 +1187,6 @@ func (a *IntegrationApiService) UpdateIntegrationApiV1AppAppIdIntegrationIntegId
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	// body params
 	localVarPostBody = r.integrationUpdate
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
diff --git a/go/internal/openapi/api_message.go b/go/internal/openapi/api_message.go
index bbff05f27..69c994c70 100644
--- a/go/internal/openapi/api_message.go
+++ b/go/internal/openapi/api_message.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,8 +17,8 @@ import (
 	_nethttp "net/http"
 	_neturl "net/url"
 	"strings"
-	"reflect"
 	"time"
+	"reflect"
 )
 
 // Linger please
@@ -29,7 +29,207 @@ var (
 // MessageApiService MessageApi service
 type MessageApiService service
 
-type ApiCreateMessageApiV1AppAppIdMsgPostRequest struct {
+type ApiCreateMessageAttemptForEndpointRequest struct {
+	ctx _context.Context
+	ApiService *MessageApiService
+	appId string
+	endpointId string
+	messageIn *MessageIn
+	idempotencyKey *string
+}
+
+func (r ApiCreateMessageAttemptForEndpointRequest) MessageIn(messageIn MessageIn) ApiCreateMessageAttemptForEndpointRequest {
+	r.messageIn = &messageIn
+	return r
+}
+func (r ApiCreateMessageAttemptForEndpointRequest) IdempotencyKey(idempotencyKey string) ApiCreateMessageAttemptForEndpointRequest {
+	r.idempotencyKey = &idempotencyKey
+	return r
+}
+
+func (r ApiCreateMessageAttemptForEndpointRequest) Execute() (MessageAttemptOut, *_nethttp.Response, error) {
+	return r.ApiService.CreateMessageAttemptForEndpointExecute(r)
+}
+
+/*
+ * CreateMessageAttemptForEndpoint Create Message Attempt For Endpoint
+ * Creates and sends a message to the specified endpoint. The message attempt and response from the endpoint is returned.
+FIXME: use MessageIn for expediency, even though the `application` parameter is unused. Since this endpoint isn't publicly documented anyway, it should be fine
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiCreateMessageAttemptForEndpointRequest
+ */
+func (a *MessageApiService) CreateMessageAttemptForEndpoint(ctx _context.Context, appId string, endpointId string) ApiCreateMessageAttemptForEndpointRequest {
+	return ApiCreateMessageAttemptForEndpointRequest{
+		ApiService: a,
+		ctx: ctx,
+		appId: appId,
+		endpointId: endpointId,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return MessageAttemptOut
+ */
+func (a *MessageApiService) CreateMessageAttemptForEndpointExecute(r ApiCreateMessageAttemptForEndpointRequest) (MessageAttemptOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  MessageAttemptOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.CreateMessageAttemptForEndpoint")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/test-attempt/"
+	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if strlen(r.appId) < 1 {
+		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
+	}
+	if strlen(r.appId) > 256 {
+		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
+	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
+	if r.messageIn == nil {
+		return localVarReturnValue, nil, reportError("messageIn is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	if r.idempotencyKey != nil {
+		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
+	}
+	// body params
+	localVarPostBody = r.messageIn
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiV1MessageCreateRequest struct {
 	ctx _context.Context
 	ApiService *MessageApiService
 	appId string
@@ -38,25 +238,25 @@ type ApiCreateMessageApiV1AppAppIdMsgPostRequest struct {
 	idempotencyKey *string
 }
 
-func (r ApiCreateMessageApiV1AppAppIdMsgPostRequest) MessageIn(messageIn MessageIn) ApiCreateMessageApiV1AppAppIdMsgPostRequest {
+func (r ApiV1MessageCreateRequest) MessageIn(messageIn MessageIn) ApiV1MessageCreateRequest {
 	r.messageIn = &messageIn
 	return r
 }
-func (r ApiCreateMessageApiV1AppAppIdMsgPostRequest) WithContent(withContent bool) ApiCreateMessageApiV1AppAppIdMsgPostRequest {
+func (r ApiV1MessageCreateRequest) WithContent(withContent bool) ApiV1MessageCreateRequest {
 	r.withContent = &withContent
 	return r
 }
-func (r ApiCreateMessageApiV1AppAppIdMsgPostRequest) IdempotencyKey(idempotencyKey string) ApiCreateMessageApiV1AppAppIdMsgPostRequest {
+func (r ApiV1MessageCreateRequest) IdempotencyKey(idempotencyKey string) ApiV1MessageCreateRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiCreateMessageApiV1AppAppIdMsgPostRequest) Execute() (MessageOut, *_nethttp.Response, error) {
-	return r.ApiService.CreateMessageApiV1AppAppIdMsgPostExecute(r)
+func (r ApiV1MessageCreateRequest) Execute() (MessageOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageCreateExecute(r)
 }
 
 /*
- * CreateMessageApiV1AppAppIdMsgPost Create Message
+ * V1MessageCreate Create Message
  * Creates a new message and dispatches it to all of the application's endpoints.
 
 The `eventId` is an optional custom unique ID. It's verified to be unique only up to a day, after that no verification will be made.
@@ -67,11 +267,11 @@ Messages can also have `channels`, which similar to event types let endpoints fi
 
 The `payload` property is the webhook's body (the actual webhook message). Svix supports payload sizes of up to ~350kb, though it's generally a good idea to keep webhook payloads small, probably no larger than 40kb.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiCreateMessageApiV1AppAppIdMsgPostRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1MessageCreateRequest
  */
-func (a *MessageApiService) CreateMessageApiV1AppAppIdMsgPost(ctx _context.Context, appId string) ApiCreateMessageApiV1AppAppIdMsgPostRequest {
-	return ApiCreateMessageApiV1AppAppIdMsgPostRequest{
+func (a *MessageApiService) V1MessageCreate(ctx _context.Context, appId string) ApiV1MessageCreateRequest {
+	return ApiV1MessageCreateRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -82,7 +282,7 @@ func (a *MessageApiService) CreateMessageApiV1AppAppIdMsgPost(ctx _context.Conte
  * Execute executes the request
  * @return MessageOut
  */
-func (a *MessageApiService) CreateMessageApiV1AppAppIdMsgPostExecute(r ApiCreateMessageApiV1AppAppIdMsgPostRequest) (MessageOut, *_nethttp.Response, error) {
+func (a *MessageApiService) V1MessageCreateExecute(r ApiV1MessageCreateRequest) (MessageOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -92,7 +292,7 @@ func (a *MessageApiService) CreateMessageApiV1AppAppIdMsgPostExecute(r ApiCreate
 		localVarReturnValue  MessageOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.CreateMessageApiV1AppAppIdMsgPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.V1MessageCreate")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -200,16 +400,6 @@ func (a *MessageApiService) CreateMessageApiV1AppAppIdMsgPostExecute(r ApiCreate
 			newErr.model = v
 			return localVarReturnValue, localVarHTTPResponse, newErr
 		}
-		if localVarHTTPResponse.StatusCode == 413 {
-			var v HttpErrorOut
-			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
-			if err != nil {
-				newErr.error = err.Error()
-				return localVarReturnValue, localVarHTTPResponse, newErr
-			}
-			newErr.model = v
-			return localVarReturnValue, localVarHTTPResponse, newErr
-		}
 		if localVarHTTPResponse.StatusCode == 422 {
 			var v HTTPValidationError
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
@@ -244,46 +434,41 @@ func (a *MessageApiService) CreateMessageApiV1AppAppIdMsgPostExecute(r ApiCreate
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest struct {
+type ApiV1MessageExpungeContentRequest struct {
 	ctx _context.Context
 	ApiService *MessageApiService
-	msgId string
 	appId string
-	idempotencyKey *string
+	msgId string
 }
 
-func (r ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest) IdempotencyKey(idempotencyKey string) ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteExecute(r)
+func (r ApiV1MessageExpungeContentRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1MessageExpungeContentExecute(r)
 }
 
 /*
- * ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete Delete message payload
+ * V1MessageExpungeContent Delete message payload
  * Delete the given message's payload. Useful in cases when a message was accidentally sent with sensitive content.
 
 The message can't be replayed or resent once its payload has been deleted or expired.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param msgId
- * @param appId
- * @return ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @return ApiV1MessageExpungeContentRequest
  */
-func (a *MessageApiService) ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete(ctx _context.Context, msgId string, appId string) ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest {
-	return ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest{
+func (a *MessageApiService) V1MessageExpungeContent(ctx _context.Context, appId string, msgId string) ApiV1MessageExpungeContentRequest {
+	return ApiV1MessageExpungeContentRequest{
 		ApiService: a,
 		ctx: ctx,
-		msgId: msgId,
 		appId: appId,
+		msgId: msgId,
 	}
 }
 
 /*
  * Execute executes the request
  */
-func (a *MessageApiService) ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteExecute(r ApiExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteRequest) (*_nethttp.Response, error) {
+func (a *MessageApiService) V1MessageExpungeContentExecute(r ApiV1MessageExpungeContentRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodDelete
 		localVarPostBody     interface{}
@@ -292,30 +477,30 @@ func (a *MessageApiService) ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDel
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.V1MessageExpungeContent")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/content/"
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.msgId) < 1 {
-		return nil, reportError("msgId must have at least 1 elements")
-	}
-	if strlen(r.msgId) > 256 {
-		return nil, reportError("msgId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.msgId) < 1 {
+		return nil, reportError("msgId must have at least 1 elements")
+	}
+	if strlen(r.msgId) > 256 {
+		return nil, reportError("msgId must have less than 256 elements")
+	}
 
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
@@ -334,9 +519,6 @@ func (a *MessageApiService) ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDel
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return nil, err
@@ -424,37 +606,37 @@ func (a *MessageApiService) ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDel
 	return localVarHTTPResponse, nil
 }
 
-type ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest struct {
+type ApiV1MessageGetRequest struct {
 	ctx _context.Context
 	ApiService *MessageApiService
-	msgId string
 	appId string
-	idempotencyKey *string
+	msgId string
+	withContent *bool
 }
 
-func (r ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest) IdempotencyKey(idempotencyKey string) ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageGetRequest) WithContent(withContent bool) ApiV1MessageGetRequest {
+	r.withContent = &withContent
 	return r
 }
 
-func (r ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest) Execute() (MessageOut, *_nethttp.Response, error) {
-	return r.ApiService.GetMessageApiV1AppAppIdMsgMsgIdGetExecute(r)
+func (r ApiV1MessageGetRequest) Execute() (MessageOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageGetExecute(r)
 }
 
 /*
- * GetMessageApiV1AppAppIdMsgMsgIdGet Get Message
+ * V1MessageGet Get Message
  * Get a message by its ID or eventID.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param msgId
- * @param appId
- * @return ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @return ApiV1MessageGetRequest
  */
-func (a *MessageApiService) GetMessageApiV1AppAppIdMsgMsgIdGet(ctx _context.Context, msgId string, appId string) ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest {
-	return ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest{
+func (a *MessageApiService) V1MessageGet(ctx _context.Context, appId string, msgId string) ApiV1MessageGetRequest {
+	return ApiV1MessageGetRequest{
 		ApiService: a,
 		ctx: ctx,
-		msgId: msgId,
 		appId: appId,
+		msgId: msgId,
 	}
 }
 
@@ -462,7 +644,7 @@ func (a *MessageApiService) GetMessageApiV1AppAppIdMsgMsgIdGet(ctx _context.Cont
  * Execute executes the request
  * @return MessageOut
  */
-func (a *MessageApiService) GetMessageApiV1AppAppIdMsgMsgIdGetExecute(r ApiGetMessageApiV1AppAppIdMsgMsgIdGetRequest) (MessageOut, *_nethttp.Response, error) {
+func (a *MessageApiService) V1MessageGetExecute(r ApiV1MessageGetRequest) (MessageOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -472,31 +654,34 @@ func (a *MessageApiService) GetMessageApiV1AppAppIdMsgMsgIdGetExecute(r ApiGetMe
 		localVarReturnValue  MessageOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.GetMessageApiV1AppAppIdMsgMsgIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.V1MessageGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.msgId) < 1 {
-		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
-	}
-	if strlen(r.msgId) > 256 {
-		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.msgId) < 1 {
+		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
+	}
+	if strlen(r.msgId) > 256 {
+		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
+	}
 
+	if r.withContent != nil {
+		localVarQueryParams.Add("with_content", parameterToString(*r.withContent, ""))
+	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -514,9 +699,6 @@ func (a *MessageApiService) GetMessageApiV1AppAppIdMsgMsgIdGetExecute(r ApiGetMe
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -613,65 +795,64 @@ func (a *MessageApiService) GetMessageApiV1AppAppIdMsgMsgIdGetExecute(r ApiGetMe
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListMessagesApiV1AppAppIdMsgGetRequest struct {
+type ApiV1MessageListRequest struct {
 	ctx _context.Context
 	ApiService *MessageApiService
 	appId string
-	iterator *string
 	limit *int32
-	eventTypes *[]string
+	iterator *string
 	channel *string
 	before *time.Time
 	after *time.Time
-	idempotencyKey *string
+	withContent *bool
+	eventTypes *[]string
 }
 
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) Iterator(iterator string) ApiListMessagesApiV1AppAppIdMsgGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) Limit(limit int32) ApiListMessagesApiV1AppAppIdMsgGetRequest {
+func (r ApiV1MessageListRequest) Limit(limit int32) ApiV1MessageListRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) EventTypes(eventTypes []string) ApiListMessagesApiV1AppAppIdMsgGetRequest {
-	r.eventTypes = &eventTypes
+func (r ApiV1MessageListRequest) Iterator(iterator string) ApiV1MessageListRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) Channel(channel string) ApiListMessagesApiV1AppAppIdMsgGetRequest {
+func (r ApiV1MessageListRequest) Channel(channel string) ApiV1MessageListRequest {
 	r.channel = &channel
 	return r
 }
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) Before(before time.Time) ApiListMessagesApiV1AppAppIdMsgGetRequest {
+func (r ApiV1MessageListRequest) Before(before time.Time) ApiV1MessageListRequest {
 	r.before = &before
 	return r
 }
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) After(after time.Time) ApiListMessagesApiV1AppAppIdMsgGetRequest {
+func (r ApiV1MessageListRequest) After(after time.Time) ApiV1MessageListRequest {
 	r.after = &after
 	return r
 }
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) IdempotencyKey(idempotencyKey string) ApiListMessagesApiV1AppAppIdMsgGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageListRequest) WithContent(withContent bool) ApiV1MessageListRequest {
+	r.withContent = &withContent
+	return r
+}
+func (r ApiV1MessageListRequest) EventTypes(eventTypes []string) ApiV1MessageListRequest {
+	r.eventTypes = &eventTypes
 	return r
 }
 
-func (r ApiListMessagesApiV1AppAppIdMsgGetRequest) Execute() (ListResponseMessageOut, *_nethttp.Response, error) {
-	return r.ApiService.ListMessagesApiV1AppAppIdMsgGetExecute(r)
+func (r ApiV1MessageListRequest) Execute() (ListResponseMessageOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageListExecute(r)
 }
 
 /*
- * ListMessagesApiV1AppAppIdMsgGet List Messages
+ * V1MessageList List Messages
  * List all of the application's messages.
 
-The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
-The `after` parameter lets you filter all items created after a certain date and is ignored if an iterator is passed.
-`before` and `after` cannot be used simultaneously.
+The `before` and `after` parameters let you filter all items created before or after a certain date. These can be used alongside an iterator to paginate over results
+within a certain window.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiListMessagesApiV1AppAppIdMsgGetRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1MessageListRequest
  */
-func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGet(ctx _context.Context, appId string) ApiListMessagesApiV1AppAppIdMsgGetRequest {
-	return ApiListMessagesApiV1AppAppIdMsgGetRequest{
+func (a *MessageApiService) V1MessageList(ctx _context.Context, appId string) ApiV1MessageListRequest {
+	return ApiV1MessageListRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -682,7 +863,7 @@ func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGet(ctx _context.Context
  * Execute executes the request
  * @return ListResponseMessageOut
  */
-func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGetExecute(r ApiListMessagesApiV1AppAppIdMsgGetRequest) (ListResponseMessageOut, *_nethttp.Response, error) {
+func (a *MessageApiService) V1MessageListExecute(r ApiV1MessageListRequest) (ListResponseMessageOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -692,7 +873,7 @@ func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGetExecute(r ApiListMess
 		localVarReturnValue  ListResponseMessageOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.ListMessagesApiV1AppAppIdMsgGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageApiService.V1MessageList")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -710,11 +891,23 @@ func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGetExecute(r ApiListMess
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
 
+	if r.limit != nil {
+		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	}
 	if r.iterator != nil {
 		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
 	}
-	if r.limit != nil {
-		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	if r.channel != nil {
+		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
+	}
+	if r.before != nil {
+		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
+	}
+	if r.after != nil {
+		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
+	}
+	if r.withContent != nil {
+		localVarQueryParams.Add("with_content", parameterToString(*r.withContent, ""))
 	}
 	if r.eventTypes != nil {
 		t := *r.eventTypes
@@ -727,15 +920,6 @@ func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGetExecute(r ApiListMess
 			localVarQueryParams.Add("event_types", parameterToString(t, "multi"))
 		}
 	}
-	if r.channel != nil {
-		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
-	}
-	if r.before != nil {
-		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
-	}
-	if r.after != nil {
-		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
-	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -753,9 +937,6 @@ func (a *MessageApiService) ListMessagesApiV1AppAppIdMsgGetExecute(r ApiListMess
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
diff --git a/go/internal/openapi/api_message_attempt.go b/go/internal/openapi/api_message_attempt.go
index 77f0f6816..2f3efe787 100644
--- a/go/internal/openapi/api_message_attempt.go
+++ b/go/internal/openapi/api_message_attempt.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -29,47 +29,42 @@ var (
 // MessageAttemptApiService MessageAttemptApi service
 type MessageAttemptApiService service
 
-type ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest struct {
+type ApiV1MessageAttemptExpungeContentRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
-	attemptId string
-	msgId string
 	appId string
-	idempotencyKey *string
+	msgId string
+	attemptId string
 }
 
-func (r ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest) IdempotencyKey(idempotencyKey string) ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteExecute(r)
+func (r ApiV1MessageAttemptExpungeContentRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptExpungeContentExecute(r)
 }
 
 /*
- * ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete Delete attempt response body
- * Deletes the given attempt's repsonse body. Useful when an endpoint accidentally returned sensitive content.
+ * V1MessageAttemptExpungeContent Delete attempt response body
+ * Deletes the given attempt's response body. Useful when an endpoint accidentally returned sensitive content.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param attemptId
- * @param msgId
- * @param appId
- * @return ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @param attemptId The attempt's ID
+ * @return ApiV1MessageAttemptExpungeContentRequest
  */
-func (a *MessageAttemptApiService) ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete(ctx _context.Context, attemptId string, msgId string, appId string) ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest {
-	return ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptExpungeContent(ctx _context.Context, appId string, msgId string, attemptId string) ApiV1MessageAttemptExpungeContentRequest {
+	return ApiV1MessageAttemptExpungeContentRequest{
 		ApiService: a,
 		ctx: ctx,
-		attemptId: attemptId,
-		msgId: msgId,
 		appId: appId,
+		msgId: msgId,
+		attemptId: attemptId,
 	}
 }
 
 /*
  * Execute executes the request
  */
-func (a *MessageAttemptApiService) ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteExecute(r ApiExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteRequest) (*_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptExpungeContentExecute(r ApiV1MessageAttemptExpungeContentRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodDelete
 		localVarPostBody     interface{}
@@ -78,31 +73,31 @@ func (a *MessageAttemptApiService) ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAtt
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptExpungeContent")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content/"
-	localVarPath = strings.Replace(localVarPath, "{"+"attempt_id"+"}", _neturl.PathEscape(parameterToString(r.attemptId, "")), -1)
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"attempt_id"+"}", _neturl.PathEscape(parameterToString(r.attemptId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.msgId) < 1 {
-		return nil, reportError("msgId must have at least 1 elements")
-	}
-	if strlen(r.msgId) > 256 {
-		return nil, reportError("msgId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.msgId) < 1 {
+		return nil, reportError("msgId must have at least 1 elements")
+	}
+	if strlen(r.msgId) > 256 {
+		return nil, reportError("msgId must have less than 256 elements")
+	}
 
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
@@ -121,9 +116,6 @@ func (a *MessageAttemptApiService) ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAtt
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return nil, err
@@ -211,40 +203,35 @@ func (a *MessageAttemptApiService) ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAtt
 	return localVarHTTPResponse, nil
 }
 
-type ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest struct {
+type ApiV1MessageAttemptGetRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
-	attemptId string
-	msgId string
 	appId string
-	idempotencyKey *string
+	msgId string
+	attemptId string
 }
 
-func (r ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest) IdempotencyKey(idempotencyKey string) ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest) Execute() (MessageAttemptOut, *_nethttp.Response, error) {
-	return r.ApiService.GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetExecute(r)
+func (r ApiV1MessageAttemptGetRequest) Execute() (MessageAttemptOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptGetExecute(r)
 }
 
 /*
- * GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet Get Attempt
+ * V1MessageAttemptGet Get Attempt
  * `msg_id`: Use a message id or a message `eventId`
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param attemptId
- * @param msgId
- * @param appId
- * @return ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @param attemptId The attempt's ID
+ * @return ApiV1MessageAttemptGetRequest
  */
-func (a *MessageAttemptApiService) GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet(ctx _context.Context, attemptId string, msgId string, appId string) ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest {
-	return ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptGet(ctx _context.Context, appId string, msgId string, attemptId string) ApiV1MessageAttemptGetRequest {
+	return ApiV1MessageAttemptGetRequest{
 		ApiService: a,
 		ctx: ctx,
-		attemptId: attemptId,
-		msgId: msgId,
 		appId: appId,
+		msgId: msgId,
+		attemptId: attemptId,
 	}
 }
 
@@ -252,7 +239,7 @@ func (a *MessageAttemptApiService) GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttempt
  * Execute executes the request
  * @return MessageAttemptOut
  */
-func (a *MessageAttemptApiService) GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetExecute(r ApiGetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetRequest) (MessageAttemptOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptGetExecute(r ApiV1MessageAttemptGetRequest) (MessageAttemptOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -262,31 +249,31 @@ func (a *MessageAttemptApiService) GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttempt
 		localVarReturnValue  MessageAttemptOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptGet")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/"
-	localVarPath = strings.Replace(localVarPath, "{"+"attempt_id"+"}", _neturl.PathEscape(parameterToString(r.attemptId, "")), -1)
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"attempt_id"+"}", _neturl.PathEscape(parameterToString(r.attemptId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.msgId) < 1 {
-		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
-	}
-	if strlen(r.msgId) > 256 {
-		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.msgId) < 1 {
+		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
+	}
+	if strlen(r.msgId) > 256 {
+		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
+	}
 
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
@@ -305,9 +292,6 @@ func (a *MessageAttemptApiService) GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttempt
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -404,35 +388,30 @@ func (a *MessageAttemptApiService) GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttempt
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest struct {
+type ApiV1MessageAttemptGetHeadersRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
 	appId string
 	msgId string
 	attemptId string
-	idempotencyKey *string
 }
 
-func (r ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest) IdempotencyKey(idempotencyKey string) ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest) Execute() (MessageAttemptHeadersOut, *_nethttp.Response, error) {
-	return r.ApiService.GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetExecute(r)
+func (r ApiV1MessageAttemptGetHeadersRequest) Execute() (MessageAttemptHeadersOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptGetHeadersExecute(r)
 }
 
 /*
- * GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGet Get Attempt Headers
+ * V1MessageAttemptGetHeaders Get Attempt Headers
  * Calculate and return headers used on a given message attempt
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param msgId
- * @param attemptId
- * @return ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @param attemptId The attempt's ID
+ * @return ApiV1MessageAttemptGetHeadersRequest
  */
-func (a *MessageAttemptApiService) GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGet(ctx _context.Context, appId string, msgId string, attemptId string) ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest {
-	return ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptGetHeaders(ctx _context.Context, appId string, msgId string, attemptId string) ApiV1MessageAttemptGetHeadersRequest {
+	return ApiV1MessageAttemptGetHeadersRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -445,7 +424,7 @@ func (a *MessageAttemptApiService) GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttempt
  * Execute executes the request
  * @return MessageAttemptHeadersOut
  */
-func (a *MessageAttemptApiService) GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetExecute(r ApiGetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGetRequest) (MessageAttemptHeadersOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptGetHeadersExecute(r ApiV1MessageAttemptGetHeadersRequest) (MessageAttemptHeadersOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -455,7 +434,7 @@ func (a *MessageAttemptApiService) GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttempt
 		localVarReturnValue  MessageAttemptHeadersOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttemptAttemptIdHeadersGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptGetHeaders")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -498,9 +477,6 @@ func (a *MessageAttemptApiService) GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttempt
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -597,47 +573,42 @@ func (a *MessageAttemptApiService) GetAttemptHeadersApiV1AppAppIdMsgMsgIdAttempt
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest struct {
+type ApiV1MessageAttemptListAttemptedDestinationsRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
-	msgId string
 	appId string
-	iterator *string
+	msgId string
 	limit *int32
-	idempotencyKey *string
+	iterator *string
 }
 
-func (r ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest) Iterator(iterator string) ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest) Limit(limit int32) ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest {
+func (r ApiV1MessageAttemptListAttemptedDestinationsRequest) Limit(limit int32) ApiV1MessageAttemptListAttemptedDestinationsRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest) IdempotencyKey(idempotencyKey string) ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageAttemptListAttemptedDestinationsRequest) Iterator(iterator string) ApiV1MessageAttemptListAttemptedDestinationsRequest {
+	r.iterator = &iterator
 	return r
 }
 
-func (r ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest) Execute() (ListResponseMessageEndpointOut, *_nethttp.Response, error) {
-	return r.ApiService.ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetExecute(r)
+func (r ApiV1MessageAttemptListAttemptedDestinationsRequest) Execute() (ListResponseMessageEndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptListAttemptedDestinationsExecute(r)
 }
 
 /*
- * ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet List Attempted Destinations
+ * V1MessageAttemptListAttemptedDestinations List Attempted Destinations
  * `msg_id`: Use a message id or a message `eventId`
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param msgId
- * @param appId
- * @return ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @return ApiV1MessageAttemptListAttemptedDestinationsRequest
  */
-func (a *MessageAttemptApiService) ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet(ctx _context.Context, msgId string, appId string) ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest {
-	return ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptListAttemptedDestinations(ctx _context.Context, appId string, msgId string) ApiV1MessageAttemptListAttemptedDestinationsRequest {
+	return ApiV1MessageAttemptListAttemptedDestinationsRequest{
 		ApiService: a,
 		ctx: ctx,
-		msgId: msgId,
 		appId: appId,
+		msgId: msgId,
 	}
 }
 
@@ -645,7 +616,7 @@ func (a *MessageAttemptApiService) ListAttemptedDestinationsApiV1AppAppIdMsgMsgI
  * Execute executes the request
  * @return ListResponseMessageEndpointOut
  */
-func (a *MessageAttemptApiService) ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetExecute(r ApiListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetRequest) (ListResponseMessageEndpointOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptListAttemptedDestinationsExecute(r ApiV1MessageAttemptListAttemptedDestinationsRequest) (ListResponseMessageEndpointOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -655,37 +626,37 @@ func (a *MessageAttemptApiService) ListAttemptedDestinationsApiV1AppAppIdMsgMsgI
 		localVarReturnValue  ListResponseMessageEndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptListAttemptedDestinations")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/"
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.msgId) < 1 {
-		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
-	}
-	if strlen(r.msgId) > 256 {
-		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	if strlen(r.msgId) < 1 {
+		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
 	}
+	if strlen(r.msgId) > 256 {
+		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
+	}
+
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -703,9 +674,6 @@ func (a *MessageAttemptApiService) ListAttemptedDestinationsApiV1AppAppIdMsgMsgI
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -802,69 +770,69 @@ func (a *MessageAttemptApiService) ListAttemptedDestinationsApiV1AppAppIdMsgMsgI
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest struct {
+type ApiV1MessageAttemptListAttemptedMessagesRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
-	endpointId string
 	appId string
-	iterator *string
+	endpointId string
 	limit *int32
+	iterator *string
 	channel *string
 	status *MessageStatus
 	before *time.Time
 	after *time.Time
-	idempotencyKey *string
+	withContent *bool
 }
 
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) Iterator(iterator string) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
-	r.iterator = &iterator
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Limit(limit int32) ApiV1MessageAttemptListAttemptedMessagesRequest {
+	r.limit = &limit
 	return r
 }
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) Limit(limit int32) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
-	r.limit = &limit
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Iterator(iterator string) ApiV1MessageAttemptListAttemptedMessagesRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) Channel(channel string) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Channel(channel string) ApiV1MessageAttemptListAttemptedMessagesRequest {
 	r.channel = &channel
 	return r
 }
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) Status(status MessageStatus) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Status(status MessageStatus) ApiV1MessageAttemptListAttemptedMessagesRequest {
 	r.status = &status
 	return r
 }
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) Before(before time.Time) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Before(before time.Time) ApiV1MessageAttemptListAttemptedMessagesRequest {
 	r.before = &before
 	return r
 }
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) After(after time.Time) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) After(after time.Time) ApiV1MessageAttemptListAttemptedMessagesRequest {
 	r.after = &after
 	return r
 }
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) IdempotencyKey(idempotencyKey string) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) WithContent(withContent bool) ApiV1MessageAttemptListAttemptedMessagesRequest {
+	r.withContent = &withContent
 	return r
 }
 
-func (r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) Execute() (ListResponseEndpointMessageOut, *_nethttp.Response, error) {
-	return r.ApiService.ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetExecute(r)
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Execute() (ListResponseEndpointMessageOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptListAttemptedMessagesExecute(r)
 }
 
 /*
- * ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet List Attempted Messages
+ * V1MessageAttemptListAttemptedMessages List Attempted Messages
  * List messages for a particular endpoint. Additionally includes metadata about the latest message attempt.
 
 The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1MessageAttemptListAttemptedMessagesRequest
  */
-func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet(ctx _context.Context, endpointId string, appId string) ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest {
-	return ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptListAttemptedMessages(ctx _context.Context, appId string, endpointId string) ApiV1MessageAttemptListAttemptedMessagesRequest {
+	return ApiV1MessageAttemptListAttemptedMessagesRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
@@ -872,7 +840,7 @@ func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEnd
  * Execute executes the request
  * @return ListResponseEndpointMessageOut
  */
-func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetExecute(r ApiListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetRequest) (ListResponseEndpointMessageOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptListAttemptedMessagesExecute(r ApiV1MessageAttemptListAttemptedMessagesRequest) (ListResponseEndpointMessageOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -882,37 +850,37 @@ func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEnd
 		localVarReturnValue  ListResponseEndpointMessageOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptListAttemptedMessages")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
 	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
+
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
 	if r.channel != nil {
 		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
 	}
@@ -925,6 +893,9 @@ func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEnd
 	if r.after != nil {
 		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
 	}
+	if r.withContent != nil {
+		localVarQueryParams.Add("with_content", parameterToString(*r.withContent, ""))
+	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -942,9 +913,6 @@ func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEnd
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1041,79 +1009,72 @@ func (a *MessageAttemptApiService) ListAttemptedMessagesApiV1AppAppIdEndpointEnd
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest struct {
+type ApiV1MessageAttemptListByEndpointRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
 	appId string
-	msgId string
-	iterator *string
+	endpointId string
 	limit *int32
-	endpointId *string
-	eventTypes *[]string
-	channel *string
+	iterator *string
 	status *MessageStatus
+	statusCodeClass *StatusCodeClass
+	channel *string
 	before *time.Time
 	after *time.Time
-	idempotencyKey *string
+	eventTypes *[]string
 }
 
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) Iterator(iterator string) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) Limit(limit int32) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByEndpointRequest) Limit(limit int32) ApiV1MessageAttemptListByEndpointRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) EndpointId(endpointId string) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	r.endpointId = &endpointId
+func (r ApiV1MessageAttemptListByEndpointRequest) Iterator(iterator string) ApiV1MessageAttemptListByEndpointRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) EventTypes(eventTypes []string) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	r.eventTypes = &eventTypes
+func (r ApiV1MessageAttemptListByEndpointRequest) Status(status MessageStatus) ApiV1MessageAttemptListByEndpointRequest {
+	r.status = &status
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) Channel(channel string) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	r.channel = &channel
+func (r ApiV1MessageAttemptListByEndpointRequest) StatusCodeClass(statusCodeClass StatusCodeClass) ApiV1MessageAttemptListByEndpointRequest {
+	r.statusCodeClass = &statusCodeClass
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) Status(status MessageStatus) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	r.status = &status
+func (r ApiV1MessageAttemptListByEndpointRequest) Channel(channel string) ApiV1MessageAttemptListByEndpointRequest {
+	r.channel = &channel
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) Before(before time.Time) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByEndpointRequest) Before(before time.Time) ApiV1MessageAttemptListByEndpointRequest {
 	r.before = &before
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) After(after time.Time) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByEndpointRequest) After(after time.Time) ApiV1MessageAttemptListByEndpointRequest {
 	r.after = &after
 	return r
 }
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) IdempotencyKey(idempotencyKey string) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageAttemptListByEndpointRequest) EventTypes(eventTypes []string) ApiV1MessageAttemptListByEndpointRequest {
+	r.eventTypes = &eventTypes
 	return r
 }
 
-func (r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) Execute() (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
-	return r.ApiService.ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetExecute(r)
+func (r ApiV1MessageAttemptListByEndpointRequest) Execute() (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptListByEndpointExecute(r)
 }
 
 /*
- * ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGet List Attempts
- * Deprecated: Please use "List Attempts by Endpoint" and "List Attempts by Msg" instead.
-
-`msg_id`: Use a message id or a message `eventId`
+ * V1MessageAttemptListByEndpoint List Attempts By Endpoint
+ * List attempts by endpoint id
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param msgId
- * @return ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1MessageAttemptListByEndpointRequest
  */
-func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGet(ctx _context.Context, appId string, msgId string) ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest {
-	return ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptListByEndpoint(ctx _context.Context, appId string, endpointId string) ApiV1MessageAttemptListByEndpointRequest {
+	return ApiV1MessageAttemptListByEndpointRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
-		msgId: msgId,
+		endpointId: endpointId,
 	}
 }
 
@@ -1121,7 +1082,7 @@ func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGet(c
  * Execute executes the request
  * @return ListResponseMessageAttemptOut
  */
-func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetExecute(r ApiListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetRequest) (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptListByEndpointExecute(r ApiV1MessageAttemptListByEndpointRequest) (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -1131,14 +1092,14 @@ func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetEx
 		localVarReturnValue  ListResponseMessageAttemptOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptListByEndpoint")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/attempt/"
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
@@ -1149,21 +1110,33 @@ func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetEx
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-	if strlen(r.msgId) < 1 {
-		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
 	}
-	if strlen(r.msgId) > 256 {
-		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
 	}
 
+	if r.limit != nil {
+		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	}
 	if r.iterator != nil {
 		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
 	}
-	if r.limit != nil {
-		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	if r.status != nil {
+		localVarQueryParams.Add("status", parameterToString(*r.status, ""))
 	}
-	if r.endpointId != nil {
-		localVarQueryParams.Add("endpoint_id", parameterToString(*r.endpointId, ""))
+	if r.statusCodeClass != nil {
+		localVarQueryParams.Add("status_code_class", parameterToString(*r.statusCodeClass, ""))
+	}
+	if r.channel != nil {
+		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
+	}
+	if r.before != nil {
+		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
+	}
+	if r.after != nil {
+		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
 	}
 	if r.eventTypes != nil {
 		t := *r.eventTypes
@@ -1176,18 +1149,6 @@ func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetEx
 			localVarQueryParams.Add("event_types", parameterToString(t, "multi"))
 		}
 	}
-	if r.channel != nil {
-		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
-	}
-	if r.status != nil {
-		localVarQueryParams.Add("status", parameterToString(*r.status, ""))
-	}
-	if r.before != nil {
-		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
-	}
-	if r.after != nil {
-		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
-	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -1205,9 +1166,6 @@ func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetEx
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1304,101 +1262,101 @@ func (a *MessageAttemptApiService) ListAttemptsApiV1AppAppIdMsgMsgIdAttemptGetEx
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest struct {
+type ApiV1MessageAttemptListByEndpointDeprecatedRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
 	appId string
+	msgId string
 	endpointId string
-	iterator *string
 	limit *int32
-	status *MessageStatus
-	statusCodeClass *StatusCodeClass
-	eventTypes *[]string
+	iterator *string
 	channel *string
+	status *MessageStatus
 	before *time.Time
 	after *time.Time
-	idempotencyKey *string
+	eventTypes *[]string
 }
 
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) Iterator(iterator string) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	r.iterator = &iterator
-	return r
-}
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) Limit(limit int32) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) Limit(limit int32) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
 	r.limit = &limit
 	return r
 }
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) Status(status MessageStatus) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	r.status = &status
-	return r
-}
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) StatusCodeClass(statusCodeClass StatusCodeClass) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	r.statusCodeClass = &statusCodeClass
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) Iterator(iterator string) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) EventTypes(eventTypes []string) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	r.eventTypes = &eventTypes
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) Channel(channel string) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
+	r.channel = &channel
 	return r
 }
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) Channel(channel string) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	r.channel = &channel
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) Status(status MessageStatus) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
+	r.status = &status
 	return r
 }
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) Before(before time.Time) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) Before(before time.Time) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
 	r.before = &before
 	return r
 }
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) After(after time.Time) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) After(after time.Time) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
 	r.after = &after
 	return r
 }
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) IdempotencyKey(idempotencyKey string) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) EventTypes(eventTypes []string) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
+	r.eventTypes = &eventTypes
 	return r
 }
 
-func (r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) Execute() (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
-	return r.ApiService.ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetExecute(r)
+func (r ApiV1MessageAttemptListByEndpointDeprecatedRequest) Execute() (ListResponseMessageAttemptEndpointOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptListByEndpointDeprecatedExecute(r)
 }
 
 /*
- * ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet List Attempts By Endpoint
- * List attempts by endpoint id
+ * V1MessageAttemptListByEndpointDeprecated List Attempts For Endpoint
+ * DEPRECATED: please use list_attempts with endpoint_id as a query parameter instead.
+
+List the message attempts for a particular endpoint.
+
+Returning the endpoint.
+
+The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param endpointId
- * @return ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1MessageAttemptListByEndpointDeprecatedRequest
  */
-func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet(ctx _context.Context, appId string, endpointId string) ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest {
-	return ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptListByEndpointDeprecated(ctx _context.Context, appId string, msgId string, endpointId string) ApiV1MessageAttemptListByEndpointDeprecatedRequest {
+	return ApiV1MessageAttemptListByEndpointDeprecatedRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
+		msgId: msgId,
 		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return ListResponseMessageAttemptOut
+ * @return ListResponseMessageAttemptEndpointOut
  */
-func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetExecute(r ApiListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetRequest) (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptListByEndpointDeprecatedExecute(r ApiV1MessageAttemptListByEndpointDeprecatedRequest) (ListResponseMessageAttemptEndpointOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  ListResponseMessageAttemptOut
+		localVarReturnValue  ListResponseMessageAttemptEndpointOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptListByEndpointDeprecated")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}/"
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
@@ -1410,6 +1368,12 @@ func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEnd
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.msgId) < 1 {
+		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
+	}
+	if strlen(r.msgId) > 256 {
+		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
+	}
 	if strlen(r.endpointId) < 1 {
 		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
 	}
@@ -1417,17 +1381,23 @@ func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEnd
 		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
 	}
 
+	if r.limit != nil {
+		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	}
 	if r.iterator != nil {
 		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
 	}
-	if r.limit != nil {
-		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
+	if r.channel != nil {
+		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
 	}
 	if r.status != nil {
 		localVarQueryParams.Add("status", parameterToString(*r.status, ""))
 	}
-	if r.statusCodeClass != nil {
-		localVarQueryParams.Add("status_code_class", parameterToString(*r.statusCodeClass, ""))
+	if r.before != nil {
+		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
+	}
+	if r.after != nil {
+		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
 	}
 	if r.eventTypes != nil {
 		t := *r.eventTypes
@@ -1440,15 +1410,6 @@ func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEnd
 			localVarQueryParams.Add("event_types", parameterToString(t, "multi"))
 		}
 	}
-	if r.channel != nil {
-		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
-	}
-	if r.before != nil {
-		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
-	}
-	if r.after != nil {
-		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
-	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -1466,9 +1427,6 @@ func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEnd
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1565,78 +1523,73 @@ func (a *MessageAttemptApiService) ListAttemptsByEndpointApiV1AppAppIdAttemptEnd
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest struct {
+type ApiV1MessageAttemptListByMsgRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
 	appId string
 	msgId string
-	endpointId *string
-	iterator *string
 	limit *int32
+	iterator *string
 	status *MessageStatus
 	statusCodeClass *StatusCodeClass
-	eventTypes *[]string
 	channel *string
+	endpointId *string
 	before *time.Time
 	after *time.Time
-	idempotencyKey *string
+	eventTypes *[]string
 }
 
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) EndpointId(endpointId string) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
-	r.endpointId = &endpointId
+func (r ApiV1MessageAttemptListByMsgRequest) Limit(limit int32) ApiV1MessageAttemptListByMsgRequest {
+	r.limit = &limit
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) Iterator(iterator string) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
+func (r ApiV1MessageAttemptListByMsgRequest) Iterator(iterator string) ApiV1MessageAttemptListByMsgRequest {
 	r.iterator = &iterator
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) Limit(limit int32) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
-	r.limit = &limit
-	return r
-}
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) Status(status MessageStatus) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
+func (r ApiV1MessageAttemptListByMsgRequest) Status(status MessageStatus) ApiV1MessageAttemptListByMsgRequest {
 	r.status = &status
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) StatusCodeClass(statusCodeClass StatusCodeClass) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
+func (r ApiV1MessageAttemptListByMsgRequest) StatusCodeClass(statusCodeClass StatusCodeClass) ApiV1MessageAttemptListByMsgRequest {
 	r.statusCodeClass = &statusCodeClass
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) EventTypes(eventTypes []string) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
-	r.eventTypes = &eventTypes
+func (r ApiV1MessageAttemptListByMsgRequest) Channel(channel string) ApiV1MessageAttemptListByMsgRequest {
+	r.channel = &channel
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) Channel(channel string) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
-	r.channel = &channel
+func (r ApiV1MessageAttemptListByMsgRequest) EndpointId(endpointId string) ApiV1MessageAttemptListByMsgRequest {
+	r.endpointId = &endpointId
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) Before(before time.Time) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
+func (r ApiV1MessageAttemptListByMsgRequest) Before(before time.Time) ApiV1MessageAttemptListByMsgRequest {
 	r.before = &before
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) After(after time.Time) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
+func (r ApiV1MessageAttemptListByMsgRequest) After(after time.Time) ApiV1MessageAttemptListByMsgRequest {
 	r.after = &after
 	return r
 }
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) IdempotencyKey(idempotencyKey string) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageAttemptListByMsgRequest) EventTypes(eventTypes []string) ApiV1MessageAttemptListByMsgRequest {
+	r.eventTypes = &eventTypes
 	return r
 }
 
-func (r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) Execute() (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
-	return r.ApiService.ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetExecute(r)
+func (r ApiV1MessageAttemptListByMsgRequest) Execute() (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptListByMsgExecute(r)
 }
 
 /*
- * ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet List Attempts By Msg
+ * V1MessageAttemptListByMsg List Attempts By Msg
  * List attempts by message id
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @param msgId
- * @return ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @return ApiV1MessageAttemptListByMsgRequest
  */
-func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet(ctx _context.Context, appId string, msgId string) ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest {
-	return ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptListByMsg(ctx _context.Context, appId string, msgId string) ApiV1MessageAttemptListByMsgRequest {
+	return ApiV1MessageAttemptListByMsgRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -1648,7 +1601,7 @@ func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgId
  * Execute executes the request
  * @return ListResponseMessageAttemptOut
  */
-func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetExecute(r ApiListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetRequest) (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptListByMsgExecute(r ApiV1MessageAttemptListByMsgRequest) (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -1658,7 +1611,7 @@ func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgId
 		localVarReturnValue  ListResponseMessageAttemptOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptListByMsg")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -1683,21 +1636,30 @@ func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgId
 		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
 	}
 
-	if r.endpointId != nil {
-		localVarQueryParams.Add("endpoint_id", parameterToString(*r.endpointId, ""))
+	if r.limit != nil {
+		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
 	if r.iterator != nil {
 		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
 	}
-	if r.limit != nil {
-		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
-	}
 	if r.status != nil {
 		localVarQueryParams.Add("status", parameterToString(*r.status, ""))
 	}
 	if r.statusCodeClass != nil {
 		localVarQueryParams.Add("status_code_class", parameterToString(*r.statusCodeClass, ""))
 	}
+	if r.channel != nil {
+		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
+	}
+	if r.endpointId != nil {
+		localVarQueryParams.Add("endpoint_id", parameterToString(*r.endpointId, ""))
+	}
+	if r.before != nil {
+		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
+	}
+	if r.after != nil {
+		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
+	}
 	if r.eventTypes != nil {
 		t := *r.eventTypes
 		if reflect.TypeOf(t).Kind() == reflect.Slice {
@@ -1709,15 +1671,6 @@ func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgId
 			localVarQueryParams.Add("event_types", parameterToString(t, "multi"))
 		}
 	}
-	if r.channel != nil {
-		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
-	}
-	if r.before != nil {
-		localVarQueryParams.Add("before", parameterToString(*r.before, ""))
-	}
-	if r.after != nil {
-		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
-	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -1735,9 +1688,6 @@ func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgId
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -1834,146 +1784,129 @@ func (a *MessageAttemptApiService) ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgId
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest struct {
+type ApiV1MessageAttemptListByMsgDeprecatedRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
-	msgId string
 	appId string
-	endpointId string
-	iterator *string
+	msgId string
 	limit *int32
-	eventTypes *[]string
+	iterator *string
+	endpointId *string
 	channel *string
 	status *MessageStatus
 	before *time.Time
 	after *time.Time
-	idempotencyKey *string
+	statusCodeClass *StatusCodeClass
+	eventTypes *[]string
 }
 
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) Iterator(iterator string) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
-	r.iterator = &iterator
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) Limit(limit int32) ApiV1MessageAttemptListByMsgDeprecatedRequest {
+	r.limit = &limit
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) Limit(limit int32) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
-	r.limit = &limit
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) Iterator(iterator string) ApiV1MessageAttemptListByMsgDeprecatedRequest {
+	r.iterator = &iterator
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) EventTypes(eventTypes []string) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
-	r.eventTypes = &eventTypes
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) EndpointId(endpointId string) ApiV1MessageAttemptListByMsgDeprecatedRequest {
+	r.endpointId = &endpointId
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) Channel(channel string) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) Channel(channel string) ApiV1MessageAttemptListByMsgDeprecatedRequest {
 	r.channel = &channel
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) Status(status MessageStatus) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) Status(status MessageStatus) ApiV1MessageAttemptListByMsgDeprecatedRequest {
 	r.status = &status
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) Before(before time.Time) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) Before(before time.Time) ApiV1MessageAttemptListByMsgDeprecatedRequest {
 	r.before = &before
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) After(after time.Time) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) After(after time.Time) ApiV1MessageAttemptListByMsgDeprecatedRequest {
 	r.after = &after
 	return r
 }
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) IdempotencyKey(idempotencyKey string) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
-	r.idempotencyKey = &idempotencyKey
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) StatusCodeClass(statusCodeClass StatusCodeClass) ApiV1MessageAttemptListByMsgDeprecatedRequest {
+	r.statusCodeClass = &statusCodeClass
+	return r
+}
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) EventTypes(eventTypes []string) ApiV1MessageAttemptListByMsgDeprecatedRequest {
+	r.eventTypes = &eventTypes
 	return r
 }
 
-func (r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) Execute() (ListResponseMessageAttemptEndpointOut, *_nethttp.Response, error) {
-	return r.ApiService.ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetExecute(r)
+func (r ApiV1MessageAttemptListByMsgDeprecatedRequest) Execute() (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptListByMsgDeprecatedExecute(r)
 }
 
 /*
- * ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet List Attempts For Endpoint
- * DEPRECATED: please use list_attempts with endpoint_id as a query parameter instead.
-
-List the message attempts for a particular endpoint.
-
-Returning the endpoint.
+ * V1MessageAttemptListByMsgDeprecated List Attempts
+ * Deprecated: Please use "List Attempts by Endpoint" and "List Attempts by Msg" instead.
 
-The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
+`msg_id`: Use a message id or a message `eventId`
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param msgId
- * @param appId
- * @param endpointId
- * @return ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @return ApiV1MessageAttemptListByMsgDeprecatedRequest
  */
-func (a *MessageAttemptApiService) ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet(ctx _context.Context, msgId string, appId string, endpointId string) ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest {
-	return ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptListByMsgDeprecated(ctx _context.Context, appId string, msgId string) ApiV1MessageAttemptListByMsgDeprecatedRequest {
+	return ApiV1MessageAttemptListByMsgDeprecatedRequest{
 		ApiService: a,
 		ctx: ctx,
-		msgId: msgId,
 		appId: appId,
-		endpointId: endpointId,
+		msgId: msgId,
 	}
 }
 
 /*
  * Execute executes the request
- * @return ListResponseMessageAttemptEndpointOut
+ * @return ListResponseMessageAttemptOut
  */
-func (a *MessageAttemptApiService) ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetExecute(r ApiListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetRequest) (ListResponseMessageAttemptEndpointOut, *_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptListByMsgDeprecatedExecute(r ApiV1MessageAttemptListByMsgDeprecatedRequest) (ListResponseMessageAttemptOut, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
 		localVarFormFileName string
 		localVarFileName     string
 		localVarFileBytes    []byte
-		localVarReturnValue  ListResponseMessageAttemptEndpointOut
+		localVarReturnValue  ListResponseMessageAttemptOut
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptListByMsgDeprecated")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
-	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/"
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
+	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/attempt/"
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.msgId) < 1 {
-		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
-	}
-	if strlen(r.msgId) > 256 {
-		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	if strlen(r.msgId) < 1 {
+		return localVarReturnValue, nil, reportError("msgId must have at least 1 elements")
 	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	if strlen(r.msgId) > 256 {
+		return localVarReturnValue, nil, reportError("msgId must have less than 256 elements")
 	}
 
-	if r.iterator != nil {
-		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
-	}
 	if r.limit != nil {
 		localVarQueryParams.Add("limit", parameterToString(*r.limit, ""))
 	}
-	if r.eventTypes != nil {
-		t := *r.eventTypes
-		if reflect.TypeOf(t).Kind() == reflect.Slice {
-			s := reflect.ValueOf(t)
-			for i := 0; i < s.Len(); i++ {
-				localVarQueryParams.Add("event_types", parameterToString(s.Index(i), "multi"))
-			}
-		} else {
-			localVarQueryParams.Add("event_types", parameterToString(t, "multi"))
-		}
+	if r.iterator != nil {
+		localVarQueryParams.Add("iterator", parameterToString(*r.iterator, ""))
+	}
+	if r.endpointId != nil {
+		localVarQueryParams.Add("endpoint_id", parameterToString(*r.endpointId, ""))
 	}
 	if r.channel != nil {
 		localVarQueryParams.Add("channel", parameterToString(*r.channel, ""))
@@ -1987,6 +1920,20 @@ func (a *MessageAttemptApiService) ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdE
 	if r.after != nil {
 		localVarQueryParams.Add("after", parameterToString(*r.after, ""))
 	}
+	if r.statusCodeClass != nil {
+		localVarQueryParams.Add("status_code_class", parameterToString(*r.statusCodeClass, ""))
+	}
+	if r.eventTypes != nil {
+		t := *r.eventTypes
+		if reflect.TypeOf(t).Kind() == reflect.Slice {
+			s := reflect.ValueOf(t)
+			for i := 0; i < s.Len(); i++ {
+				localVarQueryParams.Add("event_types", parameterToString(s.Index(i), "multi"))
+			}
+		} else {
+			localVarQueryParams.Add("event_types", parameterToString(t, "multi"))
+		}
+	}
 	// to determine the Content-Type header
 	localVarHTTPContentTypes := []string{}
 
@@ -2004,9 +1951,6 @@ func (a *MessageAttemptApiService) ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdE
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -2103,47 +2047,47 @@ func (a *MessageAttemptApiService) ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdE
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest struct {
+type ApiV1MessageAttemptResendRequest struct {
 	ctx _context.Context
 	ApiService *MessageAttemptApiService
-	endpointId string
-	msgId string
 	appId string
+	msgId string
+	endpointId string
 	idempotencyKey *string
 }
 
-func (r ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest) IdempotencyKey(idempotencyKey string) ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest {
+func (r ApiV1MessageAttemptResendRequest) IdempotencyKey(idempotencyKey string) ApiV1MessageAttemptResendRequest {
 	r.idempotencyKey = &idempotencyKey
 	return r
 }
 
-func (r ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest) Execute() (*_nethttp.Response, error) {
-	return r.ApiService.ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostExecute(r)
+func (r ApiV1MessageAttemptResendRequest) Execute() (*_nethttp.Response, error) {
+	return r.ApiService.V1MessageAttemptResendExecute(r)
 }
 
 /*
- * ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost Resend Webhook
+ * V1MessageAttemptResend Resend Webhook
  * Resend a message to the specified endpoint.
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param msgId
- * @param appId
- * @return ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest
+ * @param appId The app's ID or UID
+ * @param msgId The msg's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1MessageAttemptResendRequest
  */
-func (a *MessageAttemptApiService) ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost(ctx _context.Context, endpointId string, msgId string, appId string) ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest {
-	return ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest{
+func (a *MessageAttemptApiService) V1MessageAttemptResend(ctx _context.Context, appId string, msgId string, endpointId string) ApiV1MessageAttemptResendRequest {
+	return ApiV1MessageAttemptResendRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
-		msgId: msgId,
 		appId: appId,
+		msgId: msgId,
+		endpointId: endpointId,
 	}
 }
 
 /*
  * Execute executes the request
  */
-func (a *MessageAttemptApiService) ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostExecute(r ApiResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostRequest) (*_nethttp.Response, error) {
+func (a *MessageAttemptApiService) V1MessageAttemptResendExecute(r ApiV1MessageAttemptResendRequest) (*_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodPost
 		localVarPostBody     interface{}
@@ -2152,24 +2096,24 @@ func (a *MessageAttemptApiService) ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEnd
 		localVarFileBytes    []byte
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "MessageAttemptApiService.V1MessageAttemptResend")
 	if err != nil {
 		return nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
-	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"msg_id"+"}", _neturl.PathEscape(parameterToString(r.msgId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return nil, reportError("endpointId must have at least 1 elements")
+	if strlen(r.appId) < 1 {
+		return nil, reportError("appId must have at least 1 elements")
 	}
-	if strlen(r.endpointId) > 256 {
-		return nil, reportError("endpointId must have less than 256 elements")
+	if strlen(r.appId) > 256 {
+		return nil, reportError("appId must have less than 256 elements")
 	}
 	if strlen(r.msgId) < 1 {
 		return nil, reportError("msgId must have at least 1 elements")
@@ -2177,11 +2121,11 @@ func (a *MessageAttemptApiService) ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEnd
 	if strlen(r.msgId) > 256 {
 		return nil, reportError("msgId must have less than 256 elements")
 	}
-	if strlen(r.appId) < 1 {
-		return nil, reportError("appId must have at least 1 elements")
+	if strlen(r.endpointId) < 1 {
+		return nil, reportError("endpointId must have at least 1 elements")
 	}
-	if strlen(r.appId) > 256 {
-		return nil, reportError("appId must have less than 256 elements")
+	if strlen(r.endpointId) > 256 {
+		return nil, reportError("endpointId must have less than 256 elements")
 	}
 
 	// to determine the Content-Type header
@@ -2226,16 +2170,6 @@ func (a *MessageAttemptApiService) ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEnd
 			body:  localVarBody,
 			error: localVarHTTPResponse.Status,
 		}
-		if localVarHTTPResponse.StatusCode == 400 {
-			var v HttpErrorOut
-			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
-			if err != nil {
-				newErr.error = err.Error()
-				return localVarHTTPResponse, newErr
-			}
-			newErr.model = v
-			return localVarHTTPResponse, newErr
-		}
 		if localVarHTTPResponse.StatusCode == 401 {
 			var v HttpErrorOut
 			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
diff --git a/go/internal/openapi/api_statistics.go b/go/internal/openapi/api_statistics.go
index a9ba7c173..8c139123f 100644
--- a/go/internal/openapi/api_statistics.go
+++ b/go/internal/openapi/api_statistics.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -28,41 +28,215 @@ var (
 // StatisticsApiService StatisticsApi service
 type StatisticsApiService service
 
-type ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest struct {
+type ApiCalculateAggregateAppStatsRequest struct {
+	ctx _context.Context
+	ApiService *StatisticsApiService
+	appUsageStatsIn *AppUsageStatsIn
+	idempotencyKey *string
+}
+
+func (r ApiCalculateAggregateAppStatsRequest) AppUsageStatsIn(appUsageStatsIn AppUsageStatsIn) ApiCalculateAggregateAppStatsRequest {
+	r.appUsageStatsIn = &appUsageStatsIn
+	return r
+}
+func (r ApiCalculateAggregateAppStatsRequest) IdempotencyKey(idempotencyKey string) ApiCalculateAggregateAppStatsRequest {
+	r.idempotencyKey = &idempotencyKey
+	return r
+}
+
+func (r ApiCalculateAggregateAppStatsRequest) Execute() (AppUsageStatsOut, *_nethttp.Response, error) {
+	return r.ApiService.CalculateAggregateAppStatsExecute(r)
+}
+
+/*
+ * CalculateAggregateAppStats Calculate Aggregate App Stats
+ * Creates a background task to calculate the message destinations for all applications in the environment.
+ * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
+ * @return ApiCalculateAggregateAppStatsRequest
+ */
+func (a *StatisticsApiService) CalculateAggregateAppStats(ctx _context.Context) ApiCalculateAggregateAppStatsRequest {
+	return ApiCalculateAggregateAppStatsRequest{
+		ApiService: a,
+		ctx: ctx,
+	}
+}
+
+/*
+ * Execute executes the request
+ * @return AppUsageStatsOut
+ */
+func (a *StatisticsApiService) CalculateAggregateAppStatsExecute(r ApiCalculateAggregateAppStatsRequest) (AppUsageStatsOut, *_nethttp.Response, error) {
+	var (
+		localVarHTTPMethod   = _nethttp.MethodPost
+		localVarPostBody     interface{}
+		localVarFormFileName string
+		localVarFileName     string
+		localVarFileBytes    []byte
+		localVarReturnValue  AppUsageStatsOut
+	)
+
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "StatisticsApiService.CalculateAggregateAppStats")
+	if err != nil {
+		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
+	}
+
+	localVarPath := localBasePath + "/api/v1/stats/usage/app/"
+
+	localVarHeaderParams := make(map[string]string)
+	localVarQueryParams := _neturl.Values{}
+	localVarFormParams := _neturl.Values{}
+	if r.appUsageStatsIn == nil {
+		return localVarReturnValue, nil, reportError("appUsageStatsIn is required and must be specified")
+	}
+
+	// to determine the Content-Type header
+	localVarHTTPContentTypes := []string{"application/json"}
+
+	// set Content-Type header
+	localVarHTTPContentType := selectHeaderContentType(localVarHTTPContentTypes)
+	if localVarHTTPContentType != "" {
+		localVarHeaderParams["Content-Type"] = localVarHTTPContentType
+	}
+
+	// to determine the Accept header
+	localVarHTTPHeaderAccepts := []string{"application/json"}
+
+	// set Accept header
+	localVarHTTPHeaderAccept := selectHeaderAccept(localVarHTTPHeaderAccepts)
+	if localVarHTTPHeaderAccept != "" {
+		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
+	}
+	if r.idempotencyKey != nil {
+		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
+	}
+	// body params
+	localVarPostBody = r.appUsageStatsIn
+	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
+	if err != nil {
+		return localVarReturnValue, nil, err
+	}
+
+	localVarHTTPResponse, err := a.client.callAPI(req)
+	if err != nil || localVarHTTPResponse == nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	localVarBody, err := _ioutil.ReadAll(localVarHTTPResponse.Body)
+	localVarHTTPResponse.Body.Close()
+	localVarHTTPResponse.Body = _ioutil.NopCloser(bytes.NewBuffer(localVarBody))
+	if err != nil {
+		return localVarReturnValue, localVarHTTPResponse, err
+	}
+
+	if localVarHTTPResponse.StatusCode >= 300 {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: localVarHTTPResponse.Status,
+		}
+		if localVarHTTPResponse.StatusCode == 401 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 403 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 404 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 409 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 422 {
+			var v HTTPValidationError
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+			return localVarReturnValue, localVarHTTPResponse, newErr
+		}
+		if localVarHTTPResponse.StatusCode == 429 {
+			var v HttpErrorOut
+			err = a.client.decode(&v, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+			if err != nil {
+				newErr.error = err.Error()
+				return localVarReturnValue, localVarHTTPResponse, newErr
+			}
+			newErr.model = v
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	err = a.client.decode(&localVarReturnValue, localVarBody, localVarHTTPResponse.Header.Get("Content-Type"))
+	if err != nil {
+		newErr := GenericOpenAPIError{
+			body:  localVarBody,
+			error: err.Error(),
+		}
+		return localVarReturnValue, localVarHTTPResponse, newErr
+	}
+
+	return localVarReturnValue, localVarHTTPResponse, nil
+}
+
+type ApiV1StatsAppAttemptsRequest struct {
 	ctx _context.Context
 	ApiService *StatisticsApiService
 	appId string
 	startDate *time.Time
 	endDate *time.Time
-	idempotencyKey *string
 }
 
-func (r ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest) StartDate(startDate time.Time) ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest {
+func (r ApiV1StatsAppAttemptsRequest) StartDate(startDate time.Time) ApiV1StatsAppAttemptsRequest {
 	r.startDate = &startDate
 	return r
 }
-func (r ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest) EndDate(endDate time.Time) ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest {
+func (r ApiV1StatsAppAttemptsRequest) EndDate(endDate time.Time) ApiV1StatsAppAttemptsRequest {
 	r.endDate = &endDate
 	return r
 }
-func (r ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest) IdempotencyKey(idempotencyKey string) ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest) Execute() (AttemptStatisticsResponse, *_nethttp.Response, error) {
-	return r.ApiService.GetAppAttemptStatsApiV1StatsAppAppIdAttemptGetExecute(r)
+func (r ApiV1StatsAppAttemptsRequest) Execute() (AttemptStatisticsResponse, *_nethttp.Response, error) {
+	return r.ApiService.V1StatsAppAttemptsExecute(r)
 }
 
 /*
- * GetAppAttemptStatsApiV1StatsAppAppIdAttemptGet Get App Attempt Stats
+ * V1StatsAppAttempts Get App Attempt Stats
  * Returns application-level statistics on message attempts
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param appId
- * @return ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest
+ * @param appId The app's ID or UID
+ * @return ApiV1StatsAppAttemptsRequest
  */
-func (a *StatisticsApiService) GetAppAttemptStatsApiV1StatsAppAppIdAttemptGet(ctx _context.Context, appId string) ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest {
-	return ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest{
+func (a *StatisticsApiService) V1StatsAppAttempts(ctx _context.Context, appId string) ApiV1StatsAppAttemptsRequest {
+	return ApiV1StatsAppAttemptsRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
@@ -73,7 +247,7 @@ func (a *StatisticsApiService) GetAppAttemptStatsApiV1StatsAppAppIdAttemptGet(ct
  * Execute executes the request
  * @return AttemptStatisticsResponse
  */
-func (a *StatisticsApiService) GetAppAttemptStatsApiV1StatsAppAppIdAttemptGetExecute(r ApiGetAppAttemptStatsApiV1StatsAppAppIdAttemptGetRequest) (AttemptStatisticsResponse, *_nethttp.Response, error) {
+func (a *StatisticsApiService) V1StatsAppAttemptsExecute(r ApiV1StatsAppAttemptsRequest) (AttemptStatisticsResponse, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -83,7 +257,7 @@ func (a *StatisticsApiService) GetAppAttemptStatsApiV1StatsAppAppIdAttemptGetExe
 		localVarReturnValue  AttemptStatisticsResponse
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "StatisticsApiService.GetAppAttemptStatsApiV1StatsAppAppIdAttemptGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "StatisticsApiService.V1StatsAppAttempts")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
@@ -124,9 +298,6 @@ func (a *StatisticsApiService) GetAppAttemptStatsApiV1StatsAppAppIdAttemptGetExe
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
@@ -223,47 +394,42 @@ func (a *StatisticsApiService) GetAppAttemptStatsApiV1StatsAppAppIdAttemptGetExe
 	return localVarReturnValue, localVarHTTPResponse, nil
 }
 
-type ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest struct {
+type ApiV1StatsEndpointAttemptsRequest struct {
 	ctx _context.Context
 	ApiService *StatisticsApiService
-	endpointId string
 	appId string
+	endpointId string
 	startDate *time.Time
 	endDate *time.Time
-	idempotencyKey *string
 }
 
-func (r ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest) StartDate(startDate time.Time) ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest {
+func (r ApiV1StatsEndpointAttemptsRequest) StartDate(startDate time.Time) ApiV1StatsEndpointAttemptsRequest {
 	r.startDate = &startDate
 	return r
 }
-func (r ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest) EndDate(endDate time.Time) ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest {
+func (r ApiV1StatsEndpointAttemptsRequest) EndDate(endDate time.Time) ApiV1StatsEndpointAttemptsRequest {
 	r.endDate = &endDate
 	return r
 }
-func (r ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest) IdempotencyKey(idempotencyKey string) ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest {
-	r.idempotencyKey = &idempotencyKey
-	return r
-}
 
-func (r ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest) Execute() (AttemptStatisticsResponse, *_nethttp.Response, error) {
-	return r.ApiService.GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetExecute(r)
+func (r ApiV1StatsEndpointAttemptsRequest) Execute() (AttemptStatisticsResponse, *_nethttp.Response, error) {
+	return r.ApiService.V1StatsEndpointAttemptsExecute(r)
 }
 
 /*
- * GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGet Get Ep Stats
+ * V1StatsEndpointAttempts Get Ep Stats
  * Returns endpoint-level statistics on message attempts
  * @param ctx _context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
- * @param endpointId
- * @param appId
- * @return ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest
+ * @param appId The app's ID or UID
+ * @param endpointId The ep's ID or UID
+ * @return ApiV1StatsEndpointAttemptsRequest
  */
-func (a *StatisticsApiService) GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGet(ctx _context.Context, endpointId string, appId string) ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest {
-	return ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest{
+func (a *StatisticsApiService) V1StatsEndpointAttempts(ctx _context.Context, appId string, endpointId string) ApiV1StatsEndpointAttemptsRequest {
+	return ApiV1StatsEndpointAttemptsRequest{
 		ApiService: a,
 		ctx: ctx,
-		endpointId: endpointId,
 		appId: appId,
+		endpointId: endpointId,
 	}
 }
 
@@ -271,7 +437,7 @@ func (a *StatisticsApiService) GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGe
  * Execute executes the request
  * @return AttemptStatisticsResponse
  */
-func (a *StatisticsApiService) GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetExecute(r ApiGetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGetRequest) (AttemptStatisticsResponse, *_nethttp.Response, error) {
+func (a *StatisticsApiService) V1StatsEndpointAttemptsExecute(r ApiV1StatsEndpointAttemptsRequest) (AttemptStatisticsResponse, *_nethttp.Response, error) {
 	var (
 		localVarHTTPMethod   = _nethttp.MethodGet
 		localVarPostBody     interface{}
@@ -281,30 +447,30 @@ func (a *StatisticsApiService) GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGe
 		localVarReturnValue  AttemptStatisticsResponse
 	)
 
-	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "StatisticsApiService.GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGet")
+	localBasePath, err := a.client.cfg.ServerURLWithContext(r.ctx, "StatisticsApiService.V1StatsEndpointAttempts")
 	if err != nil {
 		return localVarReturnValue, nil, GenericOpenAPIError{error: err.Error()}
 	}
 
 	localVarPath := localBasePath + "/api/v1/stats/app/{app_id}/ep/{endpoint_id}/attempt/"
-	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 	localVarPath = strings.Replace(localVarPath, "{"+"app_id"+"}", _neturl.PathEscape(parameterToString(r.appId, "")), -1)
+	localVarPath = strings.Replace(localVarPath, "{"+"endpoint_id"+"}", _neturl.PathEscape(parameterToString(r.endpointId, "")), -1)
 
 	localVarHeaderParams := make(map[string]string)
 	localVarQueryParams := _neturl.Values{}
 	localVarFormParams := _neturl.Values{}
-	if strlen(r.endpointId) < 1 {
-		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
-	}
-	if strlen(r.endpointId) > 256 {
-		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
-	}
 	if strlen(r.appId) < 1 {
 		return localVarReturnValue, nil, reportError("appId must have at least 1 elements")
 	}
 	if strlen(r.appId) > 256 {
 		return localVarReturnValue, nil, reportError("appId must have less than 256 elements")
 	}
+	if strlen(r.endpointId) < 1 {
+		return localVarReturnValue, nil, reportError("endpointId must have at least 1 elements")
+	}
+	if strlen(r.endpointId) > 256 {
+		return localVarReturnValue, nil, reportError("endpointId must have less than 256 elements")
+	}
 
 	if r.startDate != nil {
 		localVarQueryParams.Add("startDate", parameterToString(*r.startDate, ""))
@@ -329,9 +495,6 @@ func (a *StatisticsApiService) GetEpStatsApiV1StatsAppAppIdEpEndpointIdAttemptGe
 	if localVarHTTPHeaderAccept != "" {
 		localVarHeaderParams["Accept"] = localVarHTTPHeaderAccept
 	}
-	if r.idempotencyKey != nil {
-		localVarHeaderParams["idempotency-key"] = parameterToString(*r.idempotencyKey, "")
-	}
 	req, err := a.client.prepareRequest(r.ctx, localVarPath, localVarHTTPMethod, localVarPostBody, localVarHeaderParams, localVarQueryParams, localVarFormParams, localVarFormFileName, localVarFileName, localVarFileBytes)
 	if err != nil {
 		return localVarReturnValue, nil, err
diff --git a/go/internal/openapi/client.go b/go/internal/openapi/client.go
index 618379487..2bad55fba 100644
--- a/go/internal/openapi/client.go
+++ b/go/internal/openapi/client.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -44,7 +44,7 @@ var (
 	xmlCheck  = regexp.MustCompile(`(?i:(?:application|text)/xml)`)
 )
 
-// APIClient manages communication with the Svix API API v1.4
+// APIClient manages communication with the Svix API API v1.4.1
 // In most cases there should be only one, shared, APIClient.
 type APIClient struct {
 	cfg    *Configuration
@@ -56,6 +56,10 @@ type APIClient struct {
 
 	AuthenticationApi *AuthenticationApiService
 
+	BackgroundTasksApi *BackgroundTasksApiService
+
+	BroadcastApi *BroadcastApiService
+
 	EndpointApi *EndpointApiService
 
 	EnvironmentApi *EnvironmentApiService
@@ -93,6 +97,8 @@ func NewAPIClient(cfg *Configuration) *APIClient {
 	// API Services
 	c.ApplicationApi = (*ApplicationApiService)(&c.common)
 	c.AuthenticationApi = (*AuthenticationApiService)(&c.common)
+	c.BackgroundTasksApi = (*BackgroundTasksApiService)(&c.common)
+	c.BroadcastApi = (*BroadcastApiService)(&c.common)
 	c.EndpointApi = (*EndpointApiService)(&c.common)
 	c.EnvironmentApi = (*EnvironmentApiService)(&c.common)
 	c.EnvironmentSettingsApi = (*EnvironmentSettingsApiService)(&c.common)
diff --git a/go/internal/openapi/configuration.go b/go/internal/openapi/configuration.go
index 23254bcd7..b9b023bdb 100644
--- a/go/internal/openapi/configuration.go
+++ b/go/internal/openapi/configuration.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_app_portal_access_in.go b/go/internal/openapi/model_app_portal_access_in.go
index b44d9975b..1eaa23959 100644
--- a/go/internal/openapi/model_app_portal_access_in.go
+++ b/go/internal/openapi/model_app_portal_access_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,6 +16,7 @@ import (
 
 // AppPortalAccessIn struct for AppPortalAccessIn
 type AppPortalAccessIn struct {
+	// The set of feature flags the created token will have access to.
 	FeatureFlags *[]string `json:"featureFlags,omitempty"`
 }
 
diff --git a/go/internal/openapi/model_app_portal_access_out.go b/go/internal/openapi/model_app_portal_access_out.go
index d3adb4768..ffb7a6d22 100644
--- a/go/internal/openapi/model_app_portal_access_out.go
+++ b/go/internal/openapi/model_app_portal_access_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_app_usage_stats_in.go b/go/internal/openapi/model_app_usage_stats_in.go
new file mode 100644
index 000000000..6f6a00333
--- /dev/null
+++ b/go/internal/openapi/model_app_usage_stats_in.go
@@ -0,0 +1,175 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"time"
+)
+
+// AppUsageStatsIn struct for AppUsageStatsIn
+type AppUsageStatsIn struct {
+	AppIds []string `json:"appIds,omitempty"`
+	Since time.Time `json:"since"`
+	Until time.Time `json:"until"`
+}
+
+// NewAppUsageStatsIn instantiates a new AppUsageStatsIn object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewAppUsageStatsIn(since time.Time, until time.Time) *AppUsageStatsIn {
+	this := AppUsageStatsIn{}
+	this.Since = since
+	this.Until = until
+	return &this
+}
+
+// NewAppUsageStatsInWithDefaults instantiates a new AppUsageStatsIn object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewAppUsageStatsInWithDefaults() *AppUsageStatsIn {
+	this := AppUsageStatsIn{}
+	return &this
+}
+
+// GetAppIds returns the AppIds field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *AppUsageStatsIn) GetAppIds() []string {
+	if o == nil  {
+		var ret []string
+		return ret
+	}
+	return o.AppIds
+}
+
+// GetAppIdsOk returns a tuple with the AppIds field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *AppUsageStatsIn) GetAppIdsOk() (*[]string, bool) {
+	if o == nil || o.AppIds == nil {
+		return nil, false
+	}
+	return &o.AppIds, true
+}
+
+// HasAppIds returns a boolean if a field has been set.
+func (o *AppUsageStatsIn) HasAppIds() bool {
+	if o != nil && o.AppIds != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetAppIds gets a reference to the given []string and assigns it to the AppIds field.
+func (o *AppUsageStatsIn) SetAppIds(v []string) {
+	o.AppIds = v
+}
+
+// GetSince returns the Since field value
+func (o *AppUsageStatsIn) GetSince() time.Time {
+	if o == nil {
+		var ret time.Time
+		return ret
+	}
+
+	return o.Since
+}
+
+// GetSinceOk returns a tuple with the Since field value
+// and a boolean to check if the value has been set.
+func (o *AppUsageStatsIn) GetSinceOk() (*time.Time, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Since, true
+}
+
+// SetSince sets field value
+func (o *AppUsageStatsIn) SetSince(v time.Time) {
+	o.Since = v
+}
+
+// GetUntil returns the Until field value
+func (o *AppUsageStatsIn) GetUntil() time.Time {
+	if o == nil {
+		var ret time.Time
+		return ret
+	}
+
+	return o.Until
+}
+
+// GetUntilOk returns a tuple with the Until field value
+// and a boolean to check if the value has been set.
+func (o *AppUsageStatsIn) GetUntilOk() (*time.Time, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Until, true
+}
+
+// SetUntil sets field value
+func (o *AppUsageStatsIn) SetUntil(v time.Time) {
+	o.Until = v
+}
+
+func (o AppUsageStatsIn) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.AppIds != nil {
+		toSerialize["appIds"] = o.AppIds
+	}
+	if true {
+		toSerialize["since"] = o.Since
+	}
+	if true {
+		toSerialize["until"] = o.Until
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableAppUsageStatsIn struct {
+	value *AppUsageStatsIn
+	isSet bool
+}
+
+func (v NullableAppUsageStatsIn) Get() *AppUsageStatsIn {
+	return v.value
+}
+
+func (v *NullableAppUsageStatsIn) Set(val *AppUsageStatsIn) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableAppUsageStatsIn) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableAppUsageStatsIn) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableAppUsageStatsIn(val *AppUsageStatsIn) *NullableAppUsageStatsIn {
+	return &NullableAppUsageStatsIn{value: val, isSet: true}
+}
+
+func (v NullableAppUsageStatsIn) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableAppUsageStatsIn) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_app_usage_stats_out.go b/go/internal/openapi/model_app_usage_stats_out.go
new file mode 100644
index 000000000..d0a03a0f1
--- /dev/null
+++ b/go/internal/openapi/model_app_usage_stats_out.go
@@ -0,0 +1,166 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// AppUsageStatsOut struct for AppUsageStatsOut
+type AppUsageStatsOut struct {
+	Id string `json:"id"`
+	Status BackgroundTaskStatus `json:"status"`
+	Task BackgroundTaskType `json:"task"`
+}
+
+// NewAppUsageStatsOut instantiates a new AppUsageStatsOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewAppUsageStatsOut(id string, status BackgroundTaskStatus, task BackgroundTaskType) *AppUsageStatsOut {
+	this := AppUsageStatsOut{}
+	this.Id = id
+	this.Status = status
+	this.Task = task
+	return &this
+}
+
+// NewAppUsageStatsOutWithDefaults instantiates a new AppUsageStatsOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewAppUsageStatsOutWithDefaults() *AppUsageStatsOut {
+	this := AppUsageStatsOut{}
+	return &this
+}
+
+// GetId returns the Id field value
+func (o *AppUsageStatsOut) GetId() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Id
+}
+
+// GetIdOk returns a tuple with the Id field value
+// and a boolean to check if the value has been set.
+func (o *AppUsageStatsOut) GetIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Id, true
+}
+
+// SetId sets field value
+func (o *AppUsageStatsOut) SetId(v string) {
+	o.Id = v
+}
+
+// GetStatus returns the Status field value
+func (o *AppUsageStatsOut) GetStatus() BackgroundTaskStatus {
+	if o == nil {
+		var ret BackgroundTaskStatus
+		return ret
+	}
+
+	return o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value
+// and a boolean to check if the value has been set.
+func (o *AppUsageStatsOut) GetStatusOk() (*BackgroundTaskStatus, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Status, true
+}
+
+// SetStatus sets field value
+func (o *AppUsageStatsOut) SetStatus(v BackgroundTaskStatus) {
+	o.Status = v
+}
+
+// GetTask returns the Task field value
+func (o *AppUsageStatsOut) GetTask() BackgroundTaskType {
+	if o == nil {
+		var ret BackgroundTaskType
+		return ret
+	}
+
+	return o.Task
+}
+
+// GetTaskOk returns a tuple with the Task field value
+// and a boolean to check if the value has been set.
+func (o *AppUsageStatsOut) GetTaskOk() (*BackgroundTaskType, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Task, true
+}
+
+// SetTask sets field value
+func (o *AppUsageStatsOut) SetTask(v BackgroundTaskType) {
+	o.Task = v
+}
+
+func (o AppUsageStatsOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["id"] = o.Id
+	}
+	if true {
+		toSerialize["status"] = o.Status
+	}
+	if true {
+		toSerialize["task"] = o.Task
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableAppUsageStatsOut struct {
+	value *AppUsageStatsOut
+	isSet bool
+}
+
+func (v NullableAppUsageStatsOut) Get() *AppUsageStatsOut {
+	return v.value
+}
+
+func (v *NullableAppUsageStatsOut) Set(val *AppUsageStatsOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableAppUsageStatsOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableAppUsageStatsOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableAppUsageStatsOut(val *AppUsageStatsOut) *NullableAppUsageStatsOut {
+	return &NullableAppUsageStatsOut{value: val, isSet: true}
+}
+
+func (v NullableAppUsageStatsOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableAppUsageStatsOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_application_in.go b/go/internal/openapi/model_application_in.go
index 20a6fa2b8..7e60f3d17 100644
--- a/go/internal/openapi/model_application_in.go
+++ b/go/internal/openapi/model_application_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,7 +16,7 @@ import (
 
 // ApplicationIn struct for ApplicationIn
 type ApplicationIn struct {
-	Metadata map[string]string `json:"metadata,omitempty"`
+	Metadata *map[string]string `json:"metadata,omitempty"`
 	Name string `json:"name"`
 	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
 	// Optional unique identifier for the application
@@ -41,23 +41,22 @@ func NewApplicationInWithDefaults() *ApplicationIn {
 	return &this
 }
 
-// GetMetadata returns the Metadata field value if set, zero value otherwise (both if not set or set to explicit null).
+// GetMetadata returns the Metadata field value if set, zero value otherwise.
 func (o *ApplicationIn) GetMetadata() map[string]string {
-	if o == nil  {
+	if o == nil || o.Metadata == nil {
 		var ret map[string]string
 		return ret
 	}
-	return o.Metadata
+	return *o.Metadata
 }
 
 // GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
 // and a boolean to check if the value has been set.
-// NOTE: If the value is an explicit nil, `nil, true` will be returned
 func (o *ApplicationIn) GetMetadataOk() (*map[string]string, bool) {
 	if o == nil || o.Metadata == nil {
 		return nil, false
 	}
-	return &o.Metadata, true
+	return o.Metadata, true
 }
 
 // HasMetadata returns a boolean if a field has been set.
@@ -71,7 +70,7 @@ func (o *ApplicationIn) HasMetadata() bool {
 
 // SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
 func (o *ApplicationIn) SetMetadata(v map[string]string) {
-	o.Metadata = v
+	o.Metadata = &v
 }
 
 // GetName returns the Name field value
diff --git a/go/internal/openapi/model_application_out.go b/go/internal/openapi/model_application_out.go
index 3e55a63ba..3b2775745 100644
--- a/go/internal/openapi/model_application_out.go
+++ b/go/internal/openapi/model_application_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -18,11 +18,12 @@ import (
 // ApplicationOut struct for ApplicationOut
 type ApplicationOut struct {
 	CreatedAt time.Time `json:"createdAt"`
+	// The app's ID
 	Id string `json:"id"`
-	Metadata map[string]string `json:"metadata,omitempty"`
+	Metadata map[string]string `json:"metadata"`
 	Name string `json:"name"`
 	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
-	// Optional unique identifier for the application
+	// The app's UID
 	Uid NullableString `json:"uid,omitempty"`
 	UpdatedAt time.Time `json:"updatedAt"`
 }
@@ -31,10 +32,11 @@ type ApplicationOut struct {
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewApplicationOut(createdAt time.Time, id string, name string, updatedAt time.Time) *ApplicationOut {
+func NewApplicationOut(createdAt time.Time, id string, metadata map[string]string, name string, updatedAt time.Time) *ApplicationOut {
 	this := ApplicationOut{}
 	this.CreatedAt = createdAt
 	this.Id = id
+	this.Metadata = metadata
 	this.Name = name
 	this.UpdatedAt = updatedAt
 	return &this
@@ -96,35 +98,26 @@ func (o *ApplicationOut) SetId(v string) {
 	o.Id = v
 }
 
-// GetMetadata returns the Metadata field value if set, zero value otherwise (both if not set or set to explicit null).
+// GetMetadata returns the Metadata field value
 func (o *ApplicationOut) GetMetadata() map[string]string {
-	if o == nil  {
+	if o == nil {
 		var ret map[string]string
 		return ret
 	}
+
 	return o.Metadata
 }
 
-// GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
+// GetMetadataOk returns a tuple with the Metadata field value
 // and a boolean to check if the value has been set.
-// NOTE: If the value is an explicit nil, `nil, true` will be returned
 func (o *ApplicationOut) GetMetadataOk() (*map[string]string, bool) {
-	if o == nil || o.Metadata == nil {
+	if o == nil  {
 		return nil, false
 	}
 	return &o.Metadata, true
 }
 
-// HasMetadata returns a boolean if a field has been set.
-func (o *ApplicationOut) HasMetadata() bool {
-	if o != nil && o.Metadata != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
+// SetMetadata sets field value
 func (o *ApplicationOut) SetMetadata(v map[string]string) {
 	o.Metadata = v
 }
@@ -269,7 +262,7 @@ func (o ApplicationOut) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["id"] = o.Id
 	}
-	if o.Metadata != nil {
+	if true {
 		toSerialize["metadata"] = o.Metadata
 	}
 	if true {
diff --git a/go/internal/openapi/model_application_patch.go b/go/internal/openapi/model_application_patch.go
new file mode 100644
index 000000000..1aa4432e5
--- /dev/null
+++ b/go/internal/openapi/model_application_patch.go
@@ -0,0 +1,244 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// ApplicationPatch struct for ApplicationPatch
+type ApplicationPatch struct {
+	Metadata *map[string]string `json:"metadata,omitempty"`
+	Name *string `json:"name,omitempty"`
+	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
+	// The app's UID
+	Uid NullableString `json:"uid,omitempty"`
+}
+
+// NewApplicationPatch instantiates a new ApplicationPatch object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewApplicationPatch() *ApplicationPatch {
+	this := ApplicationPatch{}
+	return &this
+}
+
+// NewApplicationPatchWithDefaults instantiates a new ApplicationPatch object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewApplicationPatchWithDefaults() *ApplicationPatch {
+	this := ApplicationPatch{}
+	return &this
+}
+
+// GetMetadata returns the Metadata field value if set, zero value otherwise.
+func (o *ApplicationPatch) GetMetadata() map[string]string {
+	if o == nil || o.Metadata == nil {
+		var ret map[string]string
+		return ret
+	}
+	return *o.Metadata
+}
+
+// GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ApplicationPatch) GetMetadataOk() (*map[string]string, bool) {
+	if o == nil || o.Metadata == nil {
+		return nil, false
+	}
+	return o.Metadata, true
+}
+
+// HasMetadata returns a boolean if a field has been set.
+func (o *ApplicationPatch) HasMetadata() bool {
+	if o != nil && o.Metadata != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
+func (o *ApplicationPatch) SetMetadata(v map[string]string) {
+	o.Metadata = &v
+}
+
+// GetName returns the Name field value if set, zero value otherwise.
+func (o *ApplicationPatch) GetName() string {
+	if o == nil || o.Name == nil {
+		var ret string
+		return ret
+	}
+	return *o.Name
+}
+
+// GetNameOk returns a tuple with the Name field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *ApplicationPatch) GetNameOk() (*string, bool) {
+	if o == nil || o.Name == nil {
+		return nil, false
+	}
+	return o.Name, true
+}
+
+// HasName returns a boolean if a field has been set.
+func (o *ApplicationPatch) HasName() bool {
+	if o != nil && o.Name != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetName gets a reference to the given string and assigns it to the Name field.
+func (o *ApplicationPatch) SetName(v string) {
+	o.Name = &v
+}
+
+// GetRateLimit returns the RateLimit field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ApplicationPatch) GetRateLimit() int32 {
+	if o == nil || o.RateLimit.Get() == nil {
+		var ret int32
+		return ret
+	}
+	return *o.RateLimit.Get()
+}
+
+// GetRateLimitOk returns a tuple with the RateLimit field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ApplicationPatch) GetRateLimitOk() (*int32, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.RateLimit.Get(), o.RateLimit.IsSet()
+}
+
+// HasRateLimit returns a boolean if a field has been set.
+func (o *ApplicationPatch) HasRateLimit() bool {
+	if o != nil && o.RateLimit.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetRateLimit gets a reference to the given NullableInt32 and assigns it to the RateLimit field.
+func (o *ApplicationPatch) SetRateLimit(v int32) {
+	o.RateLimit.Set(&v)
+}
+// SetRateLimitNil sets the value for RateLimit to be an explicit nil
+func (o *ApplicationPatch) SetRateLimitNil() {
+	o.RateLimit.Set(nil)
+}
+
+// UnsetRateLimit ensures that no value is present for RateLimit, not even an explicit nil
+func (o *ApplicationPatch) UnsetRateLimit() {
+	o.RateLimit.Unset()
+}
+
+// GetUid returns the Uid field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ApplicationPatch) GetUid() string {
+	if o == nil || o.Uid.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.Uid.Get()
+}
+
+// GetUidOk returns a tuple with the Uid field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ApplicationPatch) GetUidOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.Uid.Get(), o.Uid.IsSet()
+}
+
+// HasUid returns a boolean if a field has been set.
+func (o *ApplicationPatch) HasUid() bool {
+	if o != nil && o.Uid.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetUid gets a reference to the given NullableString and assigns it to the Uid field.
+func (o *ApplicationPatch) SetUid(v string) {
+	o.Uid.Set(&v)
+}
+// SetUidNil sets the value for Uid to be an explicit nil
+func (o *ApplicationPatch) SetUidNil() {
+	o.Uid.Set(nil)
+}
+
+// UnsetUid ensures that no value is present for Uid, not even an explicit nil
+func (o *ApplicationPatch) UnsetUid() {
+	o.Uid.Unset()
+}
+
+func (o ApplicationPatch) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Metadata != nil {
+		toSerialize["metadata"] = o.Metadata
+	}
+	if o.Name != nil {
+		toSerialize["name"] = o.Name
+	}
+	if o.RateLimit.IsSet() {
+		toSerialize["rateLimit"] = o.RateLimit.Get()
+	}
+	if o.Uid.IsSet() {
+		toSerialize["uid"] = o.Uid.Get()
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableApplicationPatch struct {
+	value *ApplicationPatch
+	isSet bool
+}
+
+func (v NullableApplicationPatch) Get() *ApplicationPatch {
+	return v.value
+}
+
+func (v *NullableApplicationPatch) Set(val *ApplicationPatch) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableApplicationPatch) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableApplicationPatch) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableApplicationPatch(val *ApplicationPatch) *NullableApplicationPatch {
+	return &NullableApplicationPatch{value: val, isSet: true}
+}
+
+func (v NullableApplicationPatch) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableApplicationPatch) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_application_stats.go b/go/internal/openapi/model_application_stats.go
index 8d81b1f5c..48d951391 100644
--- a/go/internal/openapi/model_application_stats.go
+++ b/go/internal/openapi/model_application_stats.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,8 +16,9 @@ import (
 
 // ApplicationStats struct for ApplicationStats
 type ApplicationStats struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
 	MessageDestinations int32 `json:"messageDestinations"`
 }
diff --git a/go/internal/openapi/model_application_token_expire_in.go b/go/internal/openapi/model_application_token_expire_in.go
index 8decbb917..dabe68127 100644
--- a/go/internal/openapi/model_application_token_expire_in.go
+++ b/go/internal/openapi/model_application_token_expire_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,7 +17,7 @@ import (
 // ApplicationTokenExpireIn struct for ApplicationTokenExpireIn
 type ApplicationTokenExpireIn struct {
 	// How many seconds until the old key is expired.
-	Expiry NullableInt32 `json:"expiry,omitempty"`
+	Expiry NullableInt64 `json:"expiry,omitempty"`
 }
 
 // NewApplicationTokenExpireIn instantiates a new ApplicationTokenExpireIn object
@@ -38,9 +38,9 @@ func NewApplicationTokenExpireInWithDefaults() *ApplicationTokenExpireIn {
 }
 
 // GetExpiry returns the Expiry field value if set, zero value otherwise (both if not set or set to explicit null).
-func (o *ApplicationTokenExpireIn) GetExpiry() int32 {
+func (o *ApplicationTokenExpireIn) GetExpiry() int64 {
 	if o == nil || o.Expiry.Get() == nil {
-		var ret int32
+		var ret int64
 		return ret
 	}
 	return *o.Expiry.Get()
@@ -49,7 +49,7 @@ func (o *ApplicationTokenExpireIn) GetExpiry() int32 {
 // GetExpiryOk returns a tuple with the Expiry field value if set, nil otherwise
 // and a boolean to check if the value has been set.
 // NOTE: If the value is an explicit nil, `nil, true` will be returned
-func (o *ApplicationTokenExpireIn) GetExpiryOk() (*int32, bool) {
+func (o *ApplicationTokenExpireIn) GetExpiryOk() (*int64, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -65,8 +65,8 @@ func (o *ApplicationTokenExpireIn) HasExpiry() bool {
 	return false
 }
 
-// SetExpiry gets a reference to the given NullableInt32 and assigns it to the Expiry field.
-func (o *ApplicationTokenExpireIn) SetExpiry(v int32) {
+// SetExpiry gets a reference to the given NullableInt64 and assigns it to the Expiry field.
+func (o *ApplicationTokenExpireIn) SetExpiry(v int64) {
 	o.Expiry.Set(&v)
 }
 // SetExpiryNil sets the value for Expiry to be an explicit nil
diff --git a/go/internal/openapi/model_attempt_statistics_data.go b/go/internal/openapi/model_attempt_statistics_data.go
index aa9bc9099..51deffc6f 100644
--- a/go/internal/openapi/model_attempt_statistics_data.go
+++ b/go/internal/openapi/model_attempt_statistics_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_attempt_statistics_response.go b/go/internal/openapi/model_attempt_statistics_response.go
index 19b4c1c28..62ee0ef07 100644
--- a/go/internal/openapi/model_attempt_statistics_response.go
+++ b/go/internal/openapi/model_attempt_statistics_response.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_background_task_out.go b/go/internal/openapi/model_background_task_out.go
new file mode 100644
index 000000000..eef7165fc
--- /dev/null
+++ b/go/internal/openapi/model_background_task_out.go
@@ -0,0 +1,195 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// BackgroundTaskOut struct for BackgroundTaskOut
+type BackgroundTaskOut struct {
+	Data map[string]interface{} `json:"data"`
+	Id string `json:"id"`
+	Status BackgroundTaskStatus `json:"status"`
+	Task BackgroundTaskType `json:"task"`
+}
+
+// NewBackgroundTaskOut instantiates a new BackgroundTaskOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewBackgroundTaskOut(data map[string]interface{}, id string, status BackgroundTaskStatus, task BackgroundTaskType) *BackgroundTaskOut {
+	this := BackgroundTaskOut{}
+	this.Data = data
+	this.Id = id
+	this.Status = status
+	this.Task = task
+	return &this
+}
+
+// NewBackgroundTaskOutWithDefaults instantiates a new BackgroundTaskOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewBackgroundTaskOutWithDefaults() *BackgroundTaskOut {
+	this := BackgroundTaskOut{}
+	return &this
+}
+
+// GetData returns the Data field value
+func (o *BackgroundTaskOut) GetData() map[string]interface{} {
+	if o == nil {
+		var ret map[string]interface{}
+		return ret
+	}
+
+	return o.Data
+}
+
+// GetDataOk returns a tuple with the Data field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOut) GetDataOk() (*map[string]interface{}, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Data, true
+}
+
+// SetData sets field value
+func (o *BackgroundTaskOut) SetData(v map[string]interface{}) {
+	o.Data = v
+}
+
+// GetId returns the Id field value
+func (o *BackgroundTaskOut) GetId() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Id
+}
+
+// GetIdOk returns a tuple with the Id field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOut) GetIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Id, true
+}
+
+// SetId sets field value
+func (o *BackgroundTaskOut) SetId(v string) {
+	o.Id = v
+}
+
+// GetStatus returns the Status field value
+func (o *BackgroundTaskOut) GetStatus() BackgroundTaskStatus {
+	if o == nil {
+		var ret BackgroundTaskStatus
+		return ret
+	}
+
+	return o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOut) GetStatusOk() (*BackgroundTaskStatus, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Status, true
+}
+
+// SetStatus sets field value
+func (o *BackgroundTaskOut) SetStatus(v BackgroundTaskStatus) {
+	o.Status = v
+}
+
+// GetTask returns the Task field value
+func (o *BackgroundTaskOut) GetTask() BackgroundTaskType {
+	if o == nil {
+		var ret BackgroundTaskType
+		return ret
+	}
+
+	return o.Task
+}
+
+// GetTaskOk returns a tuple with the Task field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOut) GetTaskOk() (*BackgroundTaskType, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Task, true
+}
+
+// SetTask sets field value
+func (o *BackgroundTaskOut) SetTask(v BackgroundTaskType) {
+	o.Task = v
+}
+
+func (o BackgroundTaskOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["data"] = o.Data
+	}
+	if true {
+		toSerialize["id"] = o.Id
+	}
+	if true {
+		toSerialize["status"] = o.Status
+	}
+	if true {
+		toSerialize["task"] = o.Task
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableBackgroundTaskOut struct {
+	value *BackgroundTaskOut
+	isSet bool
+}
+
+func (v NullableBackgroundTaskOut) Get() *BackgroundTaskOut {
+	return v.value
+}
+
+func (v *NullableBackgroundTaskOut) Set(val *BackgroundTaskOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableBackgroundTaskOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableBackgroundTaskOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableBackgroundTaskOut(val *BackgroundTaskOut) *NullableBackgroundTaskOut {
+	return &NullableBackgroundTaskOut{value: val, isSet: true}
+}
+
+func (v NullableBackgroundTaskOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableBackgroundTaskOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_background_task_out_common.go b/go/internal/openapi/model_background_task_out_common.go
new file mode 100644
index 000000000..c38e97d29
--- /dev/null
+++ b/go/internal/openapi/model_background_task_out_common.go
@@ -0,0 +1,166 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// BackgroundTaskOutCommon struct for BackgroundTaskOutCommon
+type BackgroundTaskOutCommon struct {
+	Id string `json:"id"`
+	Status BackgroundTaskStatus `json:"status"`
+	Task BackgroundTaskType `json:"task"`
+}
+
+// NewBackgroundTaskOutCommon instantiates a new BackgroundTaskOutCommon object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewBackgroundTaskOutCommon(id string, status BackgroundTaskStatus, task BackgroundTaskType) *BackgroundTaskOutCommon {
+	this := BackgroundTaskOutCommon{}
+	this.Id = id
+	this.Status = status
+	this.Task = task
+	return &this
+}
+
+// NewBackgroundTaskOutCommonWithDefaults instantiates a new BackgroundTaskOutCommon object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewBackgroundTaskOutCommonWithDefaults() *BackgroundTaskOutCommon {
+	this := BackgroundTaskOutCommon{}
+	return &this
+}
+
+// GetId returns the Id field value
+func (o *BackgroundTaskOutCommon) GetId() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Id
+}
+
+// GetIdOk returns a tuple with the Id field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOutCommon) GetIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Id, true
+}
+
+// SetId sets field value
+func (o *BackgroundTaskOutCommon) SetId(v string) {
+	o.Id = v
+}
+
+// GetStatus returns the Status field value
+func (o *BackgroundTaskOutCommon) GetStatus() BackgroundTaskStatus {
+	if o == nil {
+		var ret BackgroundTaskStatus
+		return ret
+	}
+
+	return o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOutCommon) GetStatusOk() (*BackgroundTaskStatus, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Status, true
+}
+
+// SetStatus sets field value
+func (o *BackgroundTaskOutCommon) SetStatus(v BackgroundTaskStatus) {
+	o.Status = v
+}
+
+// GetTask returns the Task field value
+func (o *BackgroundTaskOutCommon) GetTask() BackgroundTaskType {
+	if o == nil {
+		var ret BackgroundTaskType
+		return ret
+	}
+
+	return o.Task
+}
+
+// GetTaskOk returns a tuple with the Task field value
+// and a boolean to check if the value has been set.
+func (o *BackgroundTaskOutCommon) GetTaskOk() (*BackgroundTaskType, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Task, true
+}
+
+// SetTask sets field value
+func (o *BackgroundTaskOutCommon) SetTask(v BackgroundTaskType) {
+	o.Task = v
+}
+
+func (o BackgroundTaskOutCommon) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["id"] = o.Id
+	}
+	if true {
+		toSerialize["status"] = o.Status
+	}
+	if true {
+		toSerialize["task"] = o.Task
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableBackgroundTaskOutCommon struct {
+	value *BackgroundTaskOutCommon
+	isSet bool
+}
+
+func (v NullableBackgroundTaskOutCommon) Get() *BackgroundTaskOutCommon {
+	return v.value
+}
+
+func (v *NullableBackgroundTaskOutCommon) Set(val *BackgroundTaskOutCommon) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableBackgroundTaskOutCommon) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableBackgroundTaskOutCommon) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableBackgroundTaskOutCommon(val *BackgroundTaskOutCommon) *NullableBackgroundTaskOutCommon {
+	return &NullableBackgroundTaskOutCommon{value: val, isSet: true}
+}
+
+func (v NullableBackgroundTaskOutCommon) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableBackgroundTaskOutCommon) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_background_task_status.go b/go/internal/openapi/model_background_task_status.go
new file mode 100644
index 000000000..51a719487
--- /dev/null
+++ b/go/internal/openapi/model_background_task_status.go
@@ -0,0 +1,112 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// BackgroundTaskStatus the model 'BackgroundTaskStatus'
+type BackgroundTaskStatus string
+
+// List of BackgroundTaskStatus
+const (
+	BACKGROUNDTASKSTATUS_RUNNING BackgroundTaskStatus = "running"
+	BACKGROUNDTASKSTATUS_FINISHED BackgroundTaskStatus = "finished"
+	BACKGROUNDTASKSTATUS_FAILED BackgroundTaskStatus = "failed"
+)
+
+var allowedBackgroundTaskStatusEnumValues = []BackgroundTaskStatus{
+	"running",
+	"finished",
+	"failed",
+}
+
+func (v *BackgroundTaskStatus) UnmarshalJSON(src []byte) error {
+	var value string
+	err := json.Unmarshal(src, &value)
+	if err != nil {
+		return err
+	}
+	enumTypeValue := BackgroundTaskStatus(value)
+	for _, existing := range allowedBackgroundTaskStatusEnumValues {
+		if existing == enumTypeValue {
+			*v = enumTypeValue
+			return nil
+		}
+	}
+
+	return fmt.Errorf("%+v is not a valid BackgroundTaskStatus", value)
+}
+
+// NewBackgroundTaskStatusFromValue returns a pointer to a valid BackgroundTaskStatus
+// for the value passed as argument, or an error if the value passed is not allowed by the enum
+func NewBackgroundTaskStatusFromValue(v string) (*BackgroundTaskStatus, error) {
+	ev := BackgroundTaskStatus(v)
+	if ev.IsValid() {
+		return &ev, nil
+	} else {
+		return nil, fmt.Errorf("invalid value '%v' for BackgroundTaskStatus: valid values are %v", v, allowedBackgroundTaskStatusEnumValues)
+	}
+}
+
+// IsValid return true if the value is valid for the enum, false otherwise
+func (v BackgroundTaskStatus) IsValid() bool {
+	for _, existing := range allowedBackgroundTaskStatusEnumValues {
+		if existing == v {
+			return true
+		}
+	}
+	return false
+}
+
+// Ptr returns reference to BackgroundTaskStatus value
+func (v BackgroundTaskStatus) Ptr() *BackgroundTaskStatus {
+	return &v
+}
+
+type NullableBackgroundTaskStatus struct {
+	value *BackgroundTaskStatus
+	isSet bool
+}
+
+func (v NullableBackgroundTaskStatus) Get() *BackgroundTaskStatus {
+	return v.value
+}
+
+func (v *NullableBackgroundTaskStatus) Set(val *BackgroundTaskStatus) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableBackgroundTaskStatus) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableBackgroundTaskStatus) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableBackgroundTaskStatus(val *BackgroundTaskStatus) *NullableBackgroundTaskStatus {
+	return &NullableBackgroundTaskStatus{value: val, isSet: true}
+}
+
+func (v NullableBackgroundTaskStatus) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableBackgroundTaskStatus) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
diff --git a/go/internal/openapi/model_background_task_type.go b/go/internal/openapi/model_background_task_type.go
new file mode 100644
index 000000000..a7fba970c
--- /dev/null
+++ b/go/internal/openapi/model_background_task_type.go
@@ -0,0 +1,114 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"fmt"
+)
+
+// BackgroundTaskType the model 'BackgroundTaskType'
+type BackgroundTaskType string
+
+// List of BackgroundTaskType
+const (
+	BACKGROUNDTASKTYPE_ENDPOINT_REPLAY BackgroundTaskType = "endpoint.replay"
+	BACKGROUNDTASKTYPE_ENDPOINT_RECOVER BackgroundTaskType = "endpoint.recover"
+	BACKGROUNDTASKTYPE_APPLICATION_STATS BackgroundTaskType = "application.stats"
+	BACKGROUNDTASKTYPE_MESSAGE_BROADCAST BackgroundTaskType = "message.broadcast"
+)
+
+var allowedBackgroundTaskTypeEnumValues = []BackgroundTaskType{
+	"endpoint.replay",
+	"endpoint.recover",
+	"application.stats",
+	"message.broadcast",
+}
+
+func (v *BackgroundTaskType) UnmarshalJSON(src []byte) error {
+	var value string
+	err := json.Unmarshal(src, &value)
+	if err != nil {
+		return err
+	}
+	enumTypeValue := BackgroundTaskType(value)
+	for _, existing := range allowedBackgroundTaskTypeEnumValues {
+		if existing == enumTypeValue {
+			*v = enumTypeValue
+			return nil
+		}
+	}
+
+	return fmt.Errorf("%+v is not a valid BackgroundTaskType", value)
+}
+
+// NewBackgroundTaskTypeFromValue returns a pointer to a valid BackgroundTaskType
+// for the value passed as argument, or an error if the value passed is not allowed by the enum
+func NewBackgroundTaskTypeFromValue(v string) (*BackgroundTaskType, error) {
+	ev := BackgroundTaskType(v)
+	if ev.IsValid() {
+		return &ev, nil
+	} else {
+		return nil, fmt.Errorf("invalid value '%v' for BackgroundTaskType: valid values are %v", v, allowedBackgroundTaskTypeEnumValues)
+	}
+}
+
+// IsValid return true if the value is valid for the enum, false otherwise
+func (v BackgroundTaskType) IsValid() bool {
+	for _, existing := range allowedBackgroundTaskTypeEnumValues {
+		if existing == v {
+			return true
+		}
+	}
+	return false
+}
+
+// Ptr returns reference to BackgroundTaskType value
+func (v BackgroundTaskType) Ptr() *BackgroundTaskType {
+	return &v
+}
+
+type NullableBackgroundTaskType struct {
+	value *BackgroundTaskType
+	isSet bool
+}
+
+func (v NullableBackgroundTaskType) Get() *BackgroundTaskType {
+	return v.value
+}
+
+func (v *NullableBackgroundTaskType) Set(val *BackgroundTaskType) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableBackgroundTaskType) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableBackgroundTaskType) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableBackgroundTaskType(val *BackgroundTaskType) *NullableBackgroundTaskType {
+	return &NullableBackgroundTaskType{value: val, isSet: true}
+}
+
+func (v NullableBackgroundTaskType) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableBackgroundTaskType) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
diff --git a/go/internal/openapi/model_border_radius_config.go b/go/internal/openapi/model_border_radius_config.go
index ddf78925d..b1f683a3d 100644
--- a/go/internal/openapi/model_border_radius_config.go
+++ b/go/internal/openapi/model_border_radius_config.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_border_radius_enum.go b/go/internal/openapi/model_border_radius_enum.go
index 59f47c7e0..6a6be7fa4 100644
--- a/go/internal/openapi/model_border_radius_enum.go
+++ b/go/internal/openapi/model_border_radius_enum.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -15,7 +15,7 @@ import (
 	"fmt"
 )
 
-// BorderRadiusEnum An enumeration.
+// BorderRadiusEnum the model 'BorderRadiusEnum'
 type BorderRadiusEnum string
 
 // List of BorderRadiusEnum
diff --git a/go/internal/openapi/model_calculate_app_stats_in.go b/go/internal/openapi/model_calculate_app_stats_in.go
new file mode 100644
index 000000000..bb927ca18
--- /dev/null
+++ b/go/internal/openapi/model_calculate_app_stats_in.go
@@ -0,0 +1,175 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+	"time"
+)
+
+// CalculateAppStatsIn struct for CalculateAppStatsIn
+type CalculateAppStatsIn struct {
+	AppIds []string `json:"appIds,omitempty"`
+	Since time.Time `json:"since"`
+	Until time.Time `json:"until"`
+}
+
+// NewCalculateAppStatsIn instantiates a new CalculateAppStatsIn object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewCalculateAppStatsIn(since time.Time, until time.Time) *CalculateAppStatsIn {
+	this := CalculateAppStatsIn{}
+	this.Since = since
+	this.Until = until
+	return &this
+}
+
+// NewCalculateAppStatsInWithDefaults instantiates a new CalculateAppStatsIn object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewCalculateAppStatsInWithDefaults() *CalculateAppStatsIn {
+	this := CalculateAppStatsIn{}
+	return &this
+}
+
+// GetAppIds returns the AppIds field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *CalculateAppStatsIn) GetAppIds() []string {
+	if o == nil  {
+		var ret []string
+		return ret
+	}
+	return o.AppIds
+}
+
+// GetAppIdsOk returns a tuple with the AppIds field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *CalculateAppStatsIn) GetAppIdsOk() (*[]string, bool) {
+	if o == nil || o.AppIds == nil {
+		return nil, false
+	}
+	return &o.AppIds, true
+}
+
+// HasAppIds returns a boolean if a field has been set.
+func (o *CalculateAppStatsIn) HasAppIds() bool {
+	if o != nil && o.AppIds != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetAppIds gets a reference to the given []string and assigns it to the AppIds field.
+func (o *CalculateAppStatsIn) SetAppIds(v []string) {
+	o.AppIds = v
+}
+
+// GetSince returns the Since field value
+func (o *CalculateAppStatsIn) GetSince() time.Time {
+	if o == nil {
+		var ret time.Time
+		return ret
+	}
+
+	return o.Since
+}
+
+// GetSinceOk returns a tuple with the Since field value
+// and a boolean to check if the value has been set.
+func (o *CalculateAppStatsIn) GetSinceOk() (*time.Time, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Since, true
+}
+
+// SetSince sets field value
+func (o *CalculateAppStatsIn) SetSince(v time.Time) {
+	o.Since = v
+}
+
+// GetUntil returns the Until field value
+func (o *CalculateAppStatsIn) GetUntil() time.Time {
+	if o == nil {
+		var ret time.Time
+		return ret
+	}
+
+	return o.Until
+}
+
+// GetUntilOk returns a tuple with the Until field value
+// and a boolean to check if the value has been set.
+func (o *CalculateAppStatsIn) GetUntilOk() (*time.Time, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Until, true
+}
+
+// SetUntil sets field value
+func (o *CalculateAppStatsIn) SetUntil(v time.Time) {
+	o.Until = v
+}
+
+func (o CalculateAppStatsIn) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.AppIds != nil {
+		toSerialize["appIds"] = o.AppIds
+	}
+	if true {
+		toSerialize["since"] = o.Since
+	}
+	if true {
+		toSerialize["until"] = o.Until
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableCalculateAppStatsIn struct {
+	value *CalculateAppStatsIn
+	isSet bool
+}
+
+func (v NullableCalculateAppStatsIn) Get() *CalculateAppStatsIn {
+	return v.value
+}
+
+func (v *NullableCalculateAppStatsIn) Set(val *CalculateAppStatsIn) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableCalculateAppStatsIn) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableCalculateAppStatsIn) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableCalculateAppStatsIn(val *CalculateAppStatsIn) *NullableCalculateAppStatsIn {
+	return &NullableCalculateAppStatsIn{value: val, isSet: true}
+}
+
+func (v NullableCalculateAppStatsIn) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableCalculateAppStatsIn) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_custom_color_palette.go b/go/internal/openapi/model_custom_color_palette.go
index e0c6672d3..b4bb1cd4d 100644
--- a/go/internal/openapi/model_custom_color_palette.go
+++ b/go/internal/openapi/model_custom_color_palette.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_custom_theme_override.go b/go/internal/openapi/model_custom_theme_override.go
index 93e497f41..710b7230f 100644
--- a/go/internal/openapi/model_custom_theme_override.go
+++ b/go/internal/openapi/model_custom_theme_override.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_dashboard_access_out.go b/go/internal/openapi/model_dashboard_access_out.go
index a1fda2fef..0c9bdb2c0 100644
--- a/go/internal/openapi/model_dashboard_access_out.go
+++ b/go/internal/openapi/model_dashboard_access_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_endpoint_created_event.go b/go/internal/openapi/model_endpoint_created_event.go
index 6be9b8921..c1e70c17e 100644
--- a/go/internal/openapi/model_endpoint_created_event.go
+++ b/go/internal/openapi/model_endpoint_created_event.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,18 +17,17 @@ import (
 // EndpointCreatedEvent Sent when an endpoint is created.
 type EndpointCreatedEvent struct {
 	Data EndpointCreatedEventData `json:"data"`
-	Type *string `json:"type,omitempty"`
+	Type string `json:"type"`
 }
 
 // NewEndpointCreatedEvent instantiates a new EndpointCreatedEvent object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointCreatedEvent(data EndpointCreatedEventData) *EndpointCreatedEvent {
+func NewEndpointCreatedEvent(data EndpointCreatedEventData, type_ string) *EndpointCreatedEvent {
 	this := EndpointCreatedEvent{}
 	this.Data = data
-	var type_ string = "endpoint.created"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -38,7 +37,7 @@ func NewEndpointCreatedEvent(data EndpointCreatedEventData) *EndpointCreatedEven
 func NewEndpointCreatedEventWithDefaults() *EndpointCreatedEvent {
 	this := EndpointCreatedEvent{}
 	var type_ string = "endpoint.created"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -66,36 +65,28 @@ func (o *EndpointCreatedEvent) SetData(v EndpointCreatedEventData) {
 	o.Data = v
 }
 
-// GetType returns the Type field value if set, zero value otherwise.
+// GetType returns the Type field value
 func (o *EndpointCreatedEvent) GetType() string {
-	if o == nil || o.Type == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Type
+
+	return o.Type
 }
 
-// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// GetTypeOk returns a tuple with the Type field value
 // and a boolean to check if the value has been set.
 func (o *EndpointCreatedEvent) GetTypeOk() (*string, bool) {
-	if o == nil || o.Type == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Type, true
+	return &o.Type, true
 }
 
-// HasType returns a boolean if a field has been set.
-func (o *EndpointCreatedEvent) HasType() bool {
-	if o != nil && o.Type != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetType gets a reference to the given string and assigns it to the Type field.
+// SetType sets field value
 func (o *EndpointCreatedEvent) SetType(v string) {
-	o.Type = &v
+	o.Type = v
 }
 
 func (o EndpointCreatedEvent) MarshalJSON() ([]byte, error) {
@@ -103,7 +94,7 @@ func (o EndpointCreatedEvent) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["data"] = o.Data
 	}
-	if o.Type != nil {
+	if true {
 		toSerialize["type"] = o.Type
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_endpoint_created_event_data.go b/go/internal/openapi/model_endpoint_created_event_data.go
index 825bdf1a2..52a241e6b 100644
--- a/go/internal/openapi/model_endpoint_created_event_data.go
+++ b/go/internal/openapi/model_endpoint_created_event_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,11 +16,13 @@ import (
 
 // EndpointCreatedEventData struct for EndpointCreatedEventData
 type EndpointCreatedEventData struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
-	// Optional unique identifier for the endpoint
+	// The ep's UID
 	EndpointUid NullableString `json:"endpointUid,omitempty"`
 }
 
diff --git a/go/internal/openapi/model_endpoint_deleted_event.go b/go/internal/openapi/model_endpoint_deleted_event.go
index ec77a0964..6f76141fc 100644
--- a/go/internal/openapi/model_endpoint_deleted_event.go
+++ b/go/internal/openapi/model_endpoint_deleted_event.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,18 +17,17 @@ import (
 // EndpointDeletedEvent Sent when an endpoint is deleted.
 type EndpointDeletedEvent struct {
 	Data EndpointDeletedEventData `json:"data"`
-	Type *string `json:"type,omitempty"`
+	Type string `json:"type"`
 }
 
 // NewEndpointDeletedEvent instantiates a new EndpointDeletedEvent object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointDeletedEvent(data EndpointDeletedEventData) *EndpointDeletedEvent {
+func NewEndpointDeletedEvent(data EndpointDeletedEventData, type_ string) *EndpointDeletedEvent {
 	this := EndpointDeletedEvent{}
 	this.Data = data
-	var type_ string = "endpoint.deleted"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -38,7 +37,7 @@ func NewEndpointDeletedEvent(data EndpointDeletedEventData) *EndpointDeletedEven
 func NewEndpointDeletedEventWithDefaults() *EndpointDeletedEvent {
 	this := EndpointDeletedEvent{}
 	var type_ string = "endpoint.deleted"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -66,36 +65,28 @@ func (o *EndpointDeletedEvent) SetData(v EndpointDeletedEventData) {
 	o.Data = v
 }
 
-// GetType returns the Type field value if set, zero value otherwise.
+// GetType returns the Type field value
 func (o *EndpointDeletedEvent) GetType() string {
-	if o == nil || o.Type == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Type
+
+	return o.Type
 }
 
-// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// GetTypeOk returns a tuple with the Type field value
 // and a boolean to check if the value has been set.
 func (o *EndpointDeletedEvent) GetTypeOk() (*string, bool) {
-	if o == nil || o.Type == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Type, true
+	return &o.Type, true
 }
 
-// HasType returns a boolean if a field has been set.
-func (o *EndpointDeletedEvent) HasType() bool {
-	if o != nil && o.Type != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetType gets a reference to the given string and assigns it to the Type field.
+// SetType sets field value
 func (o *EndpointDeletedEvent) SetType(v string) {
-	o.Type = &v
+	o.Type = v
 }
 
 func (o EndpointDeletedEvent) MarshalJSON() ([]byte, error) {
@@ -103,7 +94,7 @@ func (o EndpointDeletedEvent) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["data"] = o.Data
 	}
-	if o.Type != nil {
+	if true {
 		toSerialize["type"] = o.Type
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_endpoint_deleted_event_data.go b/go/internal/openapi/model_endpoint_deleted_event_data.go
index ec619d025..320967b86 100644
--- a/go/internal/openapi/model_endpoint_deleted_event_data.go
+++ b/go/internal/openapi/model_endpoint_deleted_event_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,11 +16,13 @@ import (
 
 // EndpointDeletedEventData struct for EndpointDeletedEventData
 type EndpointDeletedEventData struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
-	// Optional unique identifier for the endpoint
+	// The ep's UID
 	EndpointUid NullableString `json:"endpointUid,omitempty"`
 }
 
diff --git a/go/internal/openapi/model_endpoint_disabled_event.go b/go/internal/openapi/model_endpoint_disabled_event.go
index e19565a9e..b9f8279bf 100644
--- a/go/internal/openapi/model_endpoint_disabled_event.go
+++ b/go/internal/openapi/model_endpoint_disabled_event.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,18 +17,17 @@ import (
 // EndpointDisabledEvent Sent when an endpoint has been automatically disabled after continuous failures.
 type EndpointDisabledEvent struct {
 	Data EndpointDisabledEventData `json:"data"`
-	Type *string `json:"type,omitempty"`
+	Type string `json:"type"`
 }
 
 // NewEndpointDisabledEvent instantiates a new EndpointDisabledEvent object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointDisabledEvent(data EndpointDisabledEventData) *EndpointDisabledEvent {
+func NewEndpointDisabledEvent(data EndpointDisabledEventData, type_ string) *EndpointDisabledEvent {
 	this := EndpointDisabledEvent{}
 	this.Data = data
-	var type_ string = "endpoint.disabled"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -38,7 +37,7 @@ func NewEndpointDisabledEvent(data EndpointDisabledEventData) *EndpointDisabledE
 func NewEndpointDisabledEventWithDefaults() *EndpointDisabledEvent {
 	this := EndpointDisabledEvent{}
 	var type_ string = "endpoint.disabled"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -66,36 +65,28 @@ func (o *EndpointDisabledEvent) SetData(v EndpointDisabledEventData) {
 	o.Data = v
 }
 
-// GetType returns the Type field value if set, zero value otherwise.
+// GetType returns the Type field value
 func (o *EndpointDisabledEvent) GetType() string {
-	if o == nil || o.Type == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Type
+
+	return o.Type
 }
 
-// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// GetTypeOk returns a tuple with the Type field value
 // and a boolean to check if the value has been set.
 func (o *EndpointDisabledEvent) GetTypeOk() (*string, bool) {
-	if o == nil || o.Type == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Type, true
+	return &o.Type, true
 }
 
-// HasType returns a boolean if a field has been set.
-func (o *EndpointDisabledEvent) HasType() bool {
-	if o != nil && o.Type != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetType gets a reference to the given string and assigns it to the Type field.
+// SetType sets field value
 func (o *EndpointDisabledEvent) SetType(v string) {
-	o.Type = &v
+	o.Type = v
 }
 
 func (o EndpointDisabledEvent) MarshalJSON() ([]byte, error) {
@@ -103,7 +94,7 @@ func (o EndpointDisabledEvent) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["data"] = o.Data
 	}
-	if o.Type != nil {
+	if true {
 		toSerialize["type"] = o.Type
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_endpoint_disabled_event_data.go b/go/internal/openapi/model_endpoint_disabled_event_data.go
index bb0620e72..7dbbfaf0a 100644
--- a/go/internal/openapi/model_endpoint_disabled_event_data.go
+++ b/go/internal/openapi/model_endpoint_disabled_event_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -15,13 +15,15 @@ import (
 	"time"
 )
 
-// EndpointDisabledEventData struct for EndpointDisabledEventData
+// EndpointDisabledEventData Sent when an endpoint has been automatically disabled after continuous failures.
 type EndpointDisabledEventData struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
-	// Optional unique identifier for the endpoint
+	// The ep's UID
 	EndpointUid NullableString `json:"endpointUid,omitempty"`
 	FailSince time.Time `json:"failSince"`
 }
diff --git a/go/internal/openapi/model_endpoint_headers_in.go b/go/internal/openapi/model_endpoint_headers_in.go
index 0571b5dbc..fb0d12911 100644
--- a/go/internal/openapi/model_endpoint_headers_in.go
+++ b/go/internal/openapi/model_endpoint_headers_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_endpoint_headers_out.go b/go/internal/openapi/model_endpoint_headers_out.go
index 3271a8567..aa8a36eeb 100644
--- a/go/internal/openapi/model_endpoint_headers_out.go
+++ b/go/internal/openapi/model_endpoint_headers_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_endpoint_headers_patch_in.go b/go/internal/openapi/model_endpoint_headers_patch_in.go
index 01743ae61..bae6f225e 100644
--- a/go/internal/openapi/model_endpoint_headers_patch_in.go
+++ b/go/internal/openapi/model_endpoint_headers_patch_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_endpoint_in.go b/go/internal/openapi/model_endpoint_in.go
index 9385937f9..03df9688d 100644
--- a/go/internal/openapi/model_endpoint_in.go
+++ b/go/internal/openapi/model_endpoint_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -21,7 +21,7 @@ type EndpointIn struct {
 	Description *string `json:"description,omitempty"`
 	Disabled *bool `json:"disabled,omitempty"`
 	FilterTypes []string `json:"filterTypes,omitempty"`
-	Metadata map[string]string `json:"metadata,omitempty"`
+	Metadata *map[string]string `json:"metadata,omitempty"`
 	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
 	// The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.
 	Secret NullableString `json:"secret,omitempty"`
@@ -188,23 +188,22 @@ func (o *EndpointIn) SetFilterTypes(v []string) {
 	o.FilterTypes = v
 }
 
-// GetMetadata returns the Metadata field value if set, zero value otherwise (both if not set or set to explicit null).
+// GetMetadata returns the Metadata field value if set, zero value otherwise.
 func (o *EndpointIn) GetMetadata() map[string]string {
-	if o == nil  {
+	if o == nil || o.Metadata == nil {
 		var ret map[string]string
 		return ret
 	}
-	return o.Metadata
+	return *o.Metadata
 }
 
 // GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
 // and a boolean to check if the value has been set.
-// NOTE: If the value is an explicit nil, `nil, true` will be returned
 func (o *EndpointIn) GetMetadataOk() (*map[string]string, bool) {
 	if o == nil || o.Metadata == nil {
 		return nil, false
 	}
-	return &o.Metadata, true
+	return o.Metadata, true
 }
 
 // HasMetadata returns a boolean if a field has been set.
@@ -218,7 +217,7 @@ func (o *EndpointIn) HasMetadata() bool {
 
 // SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
 func (o *EndpointIn) SetMetadata(v map[string]string) {
-	o.Metadata = v
+	o.Metadata = &v
 }
 
 // GetRateLimit returns the RateLimit field value if set, zero value otherwise (both if not set or set to explicit null).
diff --git a/go/internal/openapi/model_endpoint_message_out.go b/go/internal/openapi/model_endpoint_message_out.go
index 9b142669f..291a7a745 100644
--- a/go/internal/openapi/model_endpoint_message_out.go
+++ b/go/internal/openapi/model_endpoint_message_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -15,13 +15,15 @@ import (
 	"time"
 )
 
-// EndpointMessageOut struct for EndpointMessageOut
+// EndpointMessageOut A model containing information on a given message plus additional fields on the last attempt for that message.
 type EndpointMessageOut struct {
 	// List of free-form identifiers that endpoints can filter by
 	Channels []string `json:"channels,omitempty"`
 	// Optional unique identifier for the message
 	EventId NullableString `json:"eventId,omitempty"`
+	// The event type's name
 	EventType string `json:"eventType"`
+	// The msg's ID
 	Id string `json:"id"`
 	NextAttempt NullableTime `json:"nextAttempt,omitempty"`
 	Payload map[string]interface{} `json:"payload"`
diff --git a/go/internal/openapi/model_endpoint_out.go b/go/internal/openapi/model_endpoint_out.go
index cec7ded54..a4aa58e4e 100644
--- a/go/internal/openapi/model_endpoint_out.go
+++ b/go/internal/openapi/model_endpoint_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -20,11 +20,13 @@ type EndpointOut struct {
 	// List of message channels this endpoint listens to (omit for all)
 	Channels []string `json:"channels,omitempty"`
 	CreatedAt time.Time `json:"createdAt"`
-	Description *string `json:"description,omitempty"`
+	// An example endpoint name
+	Description string `json:"description"`
 	Disabled *bool `json:"disabled,omitempty"`
 	FilterTypes []string `json:"filterTypes,omitempty"`
+	// The ep's ID
 	Id string `json:"id"`
-	Metadata map[string]string `json:"metadata,omitempty"`
+	Metadata map[string]string `json:"metadata"`
 	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
 	// Optional unique identifier for the endpoint
 	Uid NullableString `json:"uid,omitempty"`
@@ -37,14 +39,14 @@ type EndpointOut struct {
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointOut(createdAt time.Time, id string, updatedAt time.Time, url string, version int32) *EndpointOut {
+func NewEndpointOut(createdAt time.Time, description string, id string, metadata map[string]string, updatedAt time.Time, url string, version int32) *EndpointOut {
 	this := EndpointOut{}
 	this.CreatedAt = createdAt
-	var description string = ""
-	this.Description = &description
+	this.Description = description
 	var disabled bool = false
 	this.Disabled = &disabled
 	this.Id = id
+	this.Metadata = metadata
 	this.UpdatedAt = updatedAt
 	this.Url = url
 	this.Version = version
@@ -56,8 +58,6 @@ func NewEndpointOut(createdAt time.Time, id string, updatedAt time.Time, url str
 // but it doesn't guarantee that properties required by API are set
 func NewEndpointOutWithDefaults() *EndpointOut {
 	this := EndpointOut{}
-	var description string = ""
-	this.Description = &description
 	var disabled bool = false
 	this.Disabled = &disabled
 	return &this
@@ -120,36 +120,28 @@ func (o *EndpointOut) SetCreatedAt(v time.Time) {
 	o.CreatedAt = v
 }
 
-// GetDescription returns the Description field value if set, zero value otherwise.
+// GetDescription returns the Description field value
 func (o *EndpointOut) GetDescription() string {
-	if o == nil || o.Description == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Description
+
+	return o.Description
 }
 
-// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise
+// GetDescriptionOk returns a tuple with the Description field value
 // and a boolean to check if the value has been set.
 func (o *EndpointOut) GetDescriptionOk() (*string, bool) {
-	if o == nil || o.Description == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Description, true
+	return &o.Description, true
 }
 
-// HasDescription returns a boolean if a field has been set.
-func (o *EndpointOut) HasDescription() bool {
-	if o != nil && o.Description != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetDescription gets a reference to the given string and assigns it to the Description field.
+// SetDescription sets field value
 func (o *EndpointOut) SetDescription(v string) {
-	o.Description = &v
+	o.Description = v
 }
 
 // GetDisabled returns the Disabled field value if set, zero value otherwise.
@@ -241,35 +233,26 @@ func (o *EndpointOut) SetId(v string) {
 	o.Id = v
 }
 
-// GetMetadata returns the Metadata field value if set, zero value otherwise (both if not set or set to explicit null).
+// GetMetadata returns the Metadata field value
 func (o *EndpointOut) GetMetadata() map[string]string {
-	if o == nil  {
+	if o == nil {
 		var ret map[string]string
 		return ret
 	}
+
 	return o.Metadata
 }
 
-// GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
+// GetMetadataOk returns a tuple with the Metadata field value
 // and a boolean to check if the value has been set.
-// NOTE: If the value is an explicit nil, `nil, true` will be returned
 func (o *EndpointOut) GetMetadataOk() (*map[string]string, bool) {
-	if o == nil || o.Metadata == nil {
+	if o == nil  {
 		return nil, false
 	}
 	return &o.Metadata, true
 }
 
-// HasMetadata returns a boolean if a field has been set.
-func (o *EndpointOut) HasMetadata() bool {
-	if o != nil && o.Metadata != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
+// SetMetadata sets field value
 func (o *EndpointOut) SetMetadata(v map[string]string) {
 	o.Metadata = v
 }
@@ -438,7 +421,7 @@ func (o EndpointOut) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["createdAt"] = o.CreatedAt
 	}
-	if o.Description != nil {
+	if true {
 		toSerialize["description"] = o.Description
 	}
 	if o.Disabled != nil {
@@ -450,7 +433,7 @@ func (o EndpointOut) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["id"] = o.Id
 	}
-	if o.Metadata != nil {
+	if true {
 		toSerialize["metadata"] = o.Metadata
 	}
 	if o.RateLimit.IsSet() {
diff --git a/go/internal/openapi/model_endpoint_patch.go b/go/internal/openapi/model_endpoint_patch.go
new file mode 100644
index 000000000..c6cf0775e
--- /dev/null
+++ b/go/internal/openapi/model_endpoint_patch.go
@@ -0,0 +1,473 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// EndpointPatch struct for EndpointPatch
+type EndpointPatch struct {
+	Channels []string `json:"channels,omitempty"`
+	Description *string `json:"description,omitempty"`
+	Disabled *bool `json:"disabled,omitempty"`
+	FilterTypes []string `json:"filterTypes,omitempty"`
+	Metadata *map[string]string `json:"metadata,omitempty"`
+	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
+	// The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.
+	Secret NullableString `json:"secret,omitempty"`
+	// The ep's UID
+	Uid NullableString `json:"uid,omitempty"`
+	Url *string `json:"url,omitempty"`
+	Version *int32 `json:"version,omitempty"`
+}
+
+// NewEndpointPatch instantiates a new EndpointPatch object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEndpointPatch() *EndpointPatch {
+	this := EndpointPatch{}
+	return &this
+}
+
+// NewEndpointPatchWithDefaults instantiates a new EndpointPatch object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEndpointPatchWithDefaults() *EndpointPatch {
+	this := EndpointPatch{}
+	return &this
+}
+
+// GetChannels returns the Channels field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EndpointPatch) GetChannels() []string {
+	if o == nil  {
+		var ret []string
+		return ret
+	}
+	return o.Channels
+}
+
+// GetChannelsOk returns a tuple with the Channels field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EndpointPatch) GetChannelsOk() (*[]string, bool) {
+	if o == nil || o.Channels == nil {
+		return nil, false
+	}
+	return &o.Channels, true
+}
+
+// HasChannels returns a boolean if a field has been set.
+func (o *EndpointPatch) HasChannels() bool {
+	if o != nil && o.Channels != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetChannels gets a reference to the given []string and assigns it to the Channels field.
+func (o *EndpointPatch) SetChannels(v []string) {
+	o.Channels = v
+}
+
+// GetDescription returns the Description field value if set, zero value otherwise.
+func (o *EndpointPatch) GetDescription() string {
+	if o == nil || o.Description == nil {
+		var ret string
+		return ret
+	}
+	return *o.Description
+}
+
+// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EndpointPatch) GetDescriptionOk() (*string, bool) {
+	if o == nil || o.Description == nil {
+		return nil, false
+	}
+	return o.Description, true
+}
+
+// HasDescription returns a boolean if a field has been set.
+func (o *EndpointPatch) HasDescription() bool {
+	if o != nil && o.Description != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDescription gets a reference to the given string and assigns it to the Description field.
+func (o *EndpointPatch) SetDescription(v string) {
+	o.Description = &v
+}
+
+// GetDisabled returns the Disabled field value if set, zero value otherwise.
+func (o *EndpointPatch) GetDisabled() bool {
+	if o == nil || o.Disabled == nil {
+		var ret bool
+		return ret
+	}
+	return *o.Disabled
+}
+
+// GetDisabledOk returns a tuple with the Disabled field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EndpointPatch) GetDisabledOk() (*bool, bool) {
+	if o == nil || o.Disabled == nil {
+		return nil, false
+	}
+	return o.Disabled, true
+}
+
+// HasDisabled returns a boolean if a field has been set.
+func (o *EndpointPatch) HasDisabled() bool {
+	if o != nil && o.Disabled != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDisabled gets a reference to the given bool and assigns it to the Disabled field.
+func (o *EndpointPatch) SetDisabled(v bool) {
+	o.Disabled = &v
+}
+
+// GetFilterTypes returns the FilterTypes field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EndpointPatch) GetFilterTypes() []string {
+	if o == nil  {
+		var ret []string
+		return ret
+	}
+	return o.FilterTypes
+}
+
+// GetFilterTypesOk returns a tuple with the FilterTypes field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EndpointPatch) GetFilterTypesOk() (*[]string, bool) {
+	if o == nil || o.FilterTypes == nil {
+		return nil, false
+	}
+	return &o.FilterTypes, true
+}
+
+// HasFilterTypes returns a boolean if a field has been set.
+func (o *EndpointPatch) HasFilterTypes() bool {
+	if o != nil && o.FilterTypes != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetFilterTypes gets a reference to the given []string and assigns it to the FilterTypes field.
+func (o *EndpointPatch) SetFilterTypes(v []string) {
+	o.FilterTypes = v
+}
+
+// GetMetadata returns the Metadata field value if set, zero value otherwise.
+func (o *EndpointPatch) GetMetadata() map[string]string {
+	if o == nil || o.Metadata == nil {
+		var ret map[string]string
+		return ret
+	}
+	return *o.Metadata
+}
+
+// GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EndpointPatch) GetMetadataOk() (*map[string]string, bool) {
+	if o == nil || o.Metadata == nil {
+		return nil, false
+	}
+	return o.Metadata, true
+}
+
+// HasMetadata returns a boolean if a field has been set.
+func (o *EndpointPatch) HasMetadata() bool {
+	if o != nil && o.Metadata != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
+func (o *EndpointPatch) SetMetadata(v map[string]string) {
+	o.Metadata = &v
+}
+
+// GetRateLimit returns the RateLimit field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EndpointPatch) GetRateLimit() int32 {
+	if o == nil || o.RateLimit.Get() == nil {
+		var ret int32
+		return ret
+	}
+	return *o.RateLimit.Get()
+}
+
+// GetRateLimitOk returns a tuple with the RateLimit field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EndpointPatch) GetRateLimitOk() (*int32, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.RateLimit.Get(), o.RateLimit.IsSet()
+}
+
+// HasRateLimit returns a boolean if a field has been set.
+func (o *EndpointPatch) HasRateLimit() bool {
+	if o != nil && o.RateLimit.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetRateLimit gets a reference to the given NullableInt32 and assigns it to the RateLimit field.
+func (o *EndpointPatch) SetRateLimit(v int32) {
+	o.RateLimit.Set(&v)
+}
+// SetRateLimitNil sets the value for RateLimit to be an explicit nil
+func (o *EndpointPatch) SetRateLimitNil() {
+	o.RateLimit.Set(nil)
+}
+
+// UnsetRateLimit ensures that no value is present for RateLimit, not even an explicit nil
+func (o *EndpointPatch) UnsetRateLimit() {
+	o.RateLimit.Unset()
+}
+
+// GetSecret returns the Secret field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EndpointPatch) GetSecret() string {
+	if o == nil || o.Secret.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.Secret.Get()
+}
+
+// GetSecretOk returns a tuple with the Secret field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EndpointPatch) GetSecretOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.Secret.Get(), o.Secret.IsSet()
+}
+
+// HasSecret returns a boolean if a field has been set.
+func (o *EndpointPatch) HasSecret() bool {
+	if o != nil && o.Secret.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetSecret gets a reference to the given NullableString and assigns it to the Secret field.
+func (o *EndpointPatch) SetSecret(v string) {
+	o.Secret.Set(&v)
+}
+// SetSecretNil sets the value for Secret to be an explicit nil
+func (o *EndpointPatch) SetSecretNil() {
+	o.Secret.Set(nil)
+}
+
+// UnsetSecret ensures that no value is present for Secret, not even an explicit nil
+func (o *EndpointPatch) UnsetSecret() {
+	o.Secret.Unset()
+}
+
+// GetUid returns the Uid field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EndpointPatch) GetUid() string {
+	if o == nil || o.Uid.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.Uid.Get()
+}
+
+// GetUidOk returns a tuple with the Uid field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EndpointPatch) GetUidOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.Uid.Get(), o.Uid.IsSet()
+}
+
+// HasUid returns a boolean if a field has been set.
+func (o *EndpointPatch) HasUid() bool {
+	if o != nil && o.Uid.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetUid gets a reference to the given NullableString and assigns it to the Uid field.
+func (o *EndpointPatch) SetUid(v string) {
+	o.Uid.Set(&v)
+}
+// SetUidNil sets the value for Uid to be an explicit nil
+func (o *EndpointPatch) SetUidNil() {
+	o.Uid.Set(nil)
+}
+
+// UnsetUid ensures that no value is present for Uid, not even an explicit nil
+func (o *EndpointPatch) UnsetUid() {
+	o.Uid.Unset()
+}
+
+// GetUrl returns the Url field value if set, zero value otherwise.
+func (o *EndpointPatch) GetUrl() string {
+	if o == nil || o.Url == nil {
+		var ret string
+		return ret
+	}
+	return *o.Url
+}
+
+// GetUrlOk returns a tuple with the Url field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EndpointPatch) GetUrlOk() (*string, bool) {
+	if o == nil || o.Url == nil {
+		return nil, false
+	}
+	return o.Url, true
+}
+
+// HasUrl returns a boolean if a field has been set.
+func (o *EndpointPatch) HasUrl() bool {
+	if o != nil && o.Url != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetUrl gets a reference to the given string and assigns it to the Url field.
+func (o *EndpointPatch) SetUrl(v string) {
+	o.Url = &v
+}
+
+// GetVersion returns the Version field value if set, zero value otherwise.
+func (o *EndpointPatch) GetVersion() int32 {
+	if o == nil || o.Version == nil {
+		var ret int32
+		return ret
+	}
+	return *o.Version
+}
+
+// GetVersionOk returns a tuple with the Version field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EndpointPatch) GetVersionOk() (*int32, bool) {
+	if o == nil || o.Version == nil {
+		return nil, false
+	}
+	return o.Version, true
+}
+
+// HasVersion returns a boolean if a field has been set.
+func (o *EndpointPatch) HasVersion() bool {
+	if o != nil && o.Version != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetVersion gets a reference to the given int32 and assigns it to the Version field.
+func (o *EndpointPatch) SetVersion(v int32) {
+	o.Version = &v
+}
+
+func (o EndpointPatch) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Channels != nil {
+		toSerialize["channels"] = o.Channels
+	}
+	if o.Description != nil {
+		toSerialize["description"] = o.Description
+	}
+	if o.Disabled != nil {
+		toSerialize["disabled"] = o.Disabled
+	}
+	if o.FilterTypes != nil {
+		toSerialize["filterTypes"] = o.FilterTypes
+	}
+	if o.Metadata != nil {
+		toSerialize["metadata"] = o.Metadata
+	}
+	if o.RateLimit.IsSet() {
+		toSerialize["rateLimit"] = o.RateLimit.Get()
+	}
+	if o.Secret.IsSet() {
+		toSerialize["secret"] = o.Secret.Get()
+	}
+	if o.Uid.IsSet() {
+		toSerialize["uid"] = o.Uid.Get()
+	}
+	if o.Url != nil {
+		toSerialize["url"] = o.Url
+	}
+	if o.Version != nil {
+		toSerialize["version"] = o.Version
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableEndpointPatch struct {
+	value *EndpointPatch
+	isSet bool
+}
+
+func (v NullableEndpointPatch) Get() *EndpointPatch {
+	return v.value
+}
+
+func (v *NullableEndpointPatch) Set(val *EndpointPatch) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEndpointPatch) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEndpointPatch) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEndpointPatch(val *EndpointPatch) *NullableEndpointPatch {
+	return &NullableEndpointPatch{value: val, isSet: true}
+}
+
+func (v NullableEndpointPatch) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEndpointPatch) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_endpoint_secret_out.go b/go/internal/openapi/model_endpoint_secret_out.go
index 968d1a7b9..2e52dd9b0 100644
--- a/go/internal/openapi/model_endpoint_secret_out.go
+++ b/go/internal/openapi/model_endpoint_secret_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_endpoint_secret_rotate_in.go b/go/internal/openapi/model_endpoint_secret_rotate_in.go
index dc0becfa6..7b1591974 100644
--- a/go/internal/openapi/model_endpoint_secret_rotate_in.go
+++ b/go/internal/openapi/model_endpoint_secret_rotate_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -26,6 +26,8 @@ type EndpointSecretRotateIn struct {
 // will change when the set of required properties is changed
 func NewEndpointSecretRotateIn() *EndpointSecretRotateIn {
 	this := EndpointSecretRotateIn{}
+	var key string = "null"
+	this.Key = *NewNullableString(&key)
 	return &this
 }
 
@@ -34,6 +36,8 @@ func NewEndpointSecretRotateIn() *EndpointSecretRotateIn {
 // but it doesn't guarantee that properties required by API are set
 func NewEndpointSecretRotateInWithDefaults() *EndpointSecretRotateIn {
 	this := EndpointSecretRotateIn{}
+	var key string = "null"
+	this.Key = *NewNullableString(&key)
 	return &this
 }
 
diff --git a/go/internal/openapi/model_endpoint_stats.go b/go/internal/openapi/model_endpoint_stats.go
index ba3b0feb4..466ea5f11 100644
--- a/go/internal/openapi/model_endpoint_stats.go
+++ b/go/internal/openapi/model_endpoint_stats.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,17 +16,17 @@ import (
 
 // EndpointStats struct for EndpointStats
 type EndpointStats struct {
-	Fail int32 `json:"fail"`
-	Pending int32 `json:"pending"`
-	Sending int32 `json:"sending"`
-	Success int32 `json:"success"`
+	Fail int64 `json:"fail"`
+	Pending int64 `json:"pending"`
+	Sending int64 `json:"sending"`
+	Success int64 `json:"success"`
 }
 
 // NewEndpointStats instantiates a new EndpointStats object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointStats(fail int32, pending int32, sending int32, success int32) *EndpointStats {
+func NewEndpointStats(fail int64, pending int64, sending int64, success int64) *EndpointStats {
 	this := EndpointStats{}
 	this.Fail = fail
 	this.Pending = pending
@@ -44,9 +44,9 @@ func NewEndpointStatsWithDefaults() *EndpointStats {
 }
 
 // GetFail returns the Fail field value
-func (o *EndpointStats) GetFail() int32 {
+func (o *EndpointStats) GetFail() int64 {
 	if o == nil {
-		var ret int32
+		var ret int64
 		return ret
 	}
 
@@ -55,7 +55,7 @@ func (o *EndpointStats) GetFail() int32 {
 
 // GetFailOk returns a tuple with the Fail field value
 // and a boolean to check if the value has been set.
-func (o *EndpointStats) GetFailOk() (*int32, bool) {
+func (o *EndpointStats) GetFailOk() (*int64, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -63,14 +63,14 @@ func (o *EndpointStats) GetFailOk() (*int32, bool) {
 }
 
 // SetFail sets field value
-func (o *EndpointStats) SetFail(v int32) {
+func (o *EndpointStats) SetFail(v int64) {
 	o.Fail = v
 }
 
 // GetPending returns the Pending field value
-func (o *EndpointStats) GetPending() int32 {
+func (o *EndpointStats) GetPending() int64 {
 	if o == nil {
-		var ret int32
+		var ret int64
 		return ret
 	}
 
@@ -79,7 +79,7 @@ func (o *EndpointStats) GetPending() int32 {
 
 // GetPendingOk returns a tuple with the Pending field value
 // and a boolean to check if the value has been set.
-func (o *EndpointStats) GetPendingOk() (*int32, bool) {
+func (o *EndpointStats) GetPendingOk() (*int64, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -87,14 +87,14 @@ func (o *EndpointStats) GetPendingOk() (*int32, bool) {
 }
 
 // SetPending sets field value
-func (o *EndpointStats) SetPending(v int32) {
+func (o *EndpointStats) SetPending(v int64) {
 	o.Pending = v
 }
 
 // GetSending returns the Sending field value
-func (o *EndpointStats) GetSending() int32 {
+func (o *EndpointStats) GetSending() int64 {
 	if o == nil {
-		var ret int32
+		var ret int64
 		return ret
 	}
 
@@ -103,7 +103,7 @@ func (o *EndpointStats) GetSending() int32 {
 
 // GetSendingOk returns a tuple with the Sending field value
 // and a boolean to check if the value has been set.
-func (o *EndpointStats) GetSendingOk() (*int32, bool) {
+func (o *EndpointStats) GetSendingOk() (*int64, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -111,14 +111,14 @@ func (o *EndpointStats) GetSendingOk() (*int32, bool) {
 }
 
 // SetSending sets field value
-func (o *EndpointStats) SetSending(v int32) {
+func (o *EndpointStats) SetSending(v int64) {
 	o.Sending = v
 }
 
 // GetSuccess returns the Success field value
-func (o *EndpointStats) GetSuccess() int32 {
+func (o *EndpointStats) GetSuccess() int64 {
 	if o == nil {
-		var ret int32
+		var ret int64
 		return ret
 	}
 
@@ -127,7 +127,7 @@ func (o *EndpointStats) GetSuccess() int32 {
 
 // GetSuccessOk returns a tuple with the Success field value
 // and a boolean to check if the value has been set.
-func (o *EndpointStats) GetSuccessOk() (*int32, bool) {
+func (o *EndpointStats) GetSuccessOk() (*int64, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -135,7 +135,7 @@ func (o *EndpointStats) GetSuccessOk() (*int32, bool) {
 }
 
 // SetSuccess sets field value
-func (o *EndpointStats) SetSuccess(v int32) {
+func (o *EndpointStats) SetSuccess(v int64) {
 	o.Success = v
 }
 
diff --git a/go/internal/openapi/model_endpoint_transformation_in.go b/go/internal/openapi/model_endpoint_transformation_in.go
index 0df5900e1..8621d711a 100644
--- a/go/internal/openapi/model_endpoint_transformation_in.go
+++ b/go/internal/openapi/model_endpoint_transformation_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -26,8 +26,6 @@ type EndpointTransformationIn struct {
 // will change when the set of required properties is changed
 func NewEndpointTransformationIn() *EndpointTransformationIn {
 	this := EndpointTransformationIn{}
-	var enabled bool = false
-	this.Enabled = &enabled
 	return &this
 }
 
@@ -36,8 +34,6 @@ func NewEndpointTransformationIn() *EndpointTransformationIn {
 // but it doesn't guarantee that properties required by API are set
 func NewEndpointTransformationInWithDefaults() *EndpointTransformationIn {
 	this := EndpointTransformationIn{}
-	var enabled bool = false
-	this.Enabled = &enabled
 	return &this
 }
 
diff --git a/go/internal/openapi/model_endpoint_transformation_out.go b/go/internal/openapi/model_endpoint_transformation_out.go
index 58b4243dc..d5cc44830 100644
--- a/go/internal/openapi/model_endpoint_transformation_out.go
+++ b/go/internal/openapi/model_endpoint_transformation_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_endpoint_transformation_simulate_in.go b/go/internal/openapi/model_endpoint_transformation_simulate_in.go
index 01c292529..c89b57385 100644
--- a/go/internal/openapi/model_endpoint_transformation_simulate_in.go
+++ b/go/internal/openapi/model_endpoint_transformation_simulate_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -18,6 +18,7 @@ import (
 type EndpointTransformationSimulateIn struct {
 	Channels []string `json:"channels,omitempty"`
 	Code string `json:"code"`
+	// The event type's name
 	EventType string `json:"eventType"`
 	Payload map[string]interface{} `json:"payload"`
 }
diff --git a/go/internal/openapi/model_endpoint_transformation_simulate_out.go b/go/internal/openapi/model_endpoint_transformation_simulate_out.go
index ee347a4f0..6143605d7 100644
--- a/go/internal/openapi/model_endpoint_transformation_simulate_out.go
+++ b/go/internal/openapi/model_endpoint_transformation_simulate_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,7 +17,7 @@ import (
 // EndpointTransformationSimulateOut struct for EndpointTransformationSimulateOut
 type EndpointTransformationSimulateOut struct {
 	Method *TransformationHttpMethod `json:"method,omitempty"`
-	Payload map[string]interface{} `json:"payload"`
+	Payload string `json:"payload"`
 	Url string `json:"url"`
 }
 
@@ -25,7 +25,7 @@ type EndpointTransformationSimulateOut struct {
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointTransformationSimulateOut(payload map[string]interface{}, url string) *EndpointTransformationSimulateOut {
+func NewEndpointTransformationSimulateOut(payload string, url string) *EndpointTransformationSimulateOut {
 	this := EndpointTransformationSimulateOut{}
 	this.Payload = payload
 	this.Url = url
@@ -73,9 +73,9 @@ func (o *EndpointTransformationSimulateOut) SetMethod(v TransformationHttpMethod
 }
 
 // GetPayload returns the Payload field value
-func (o *EndpointTransformationSimulateOut) GetPayload() map[string]interface{} {
+func (o *EndpointTransformationSimulateOut) GetPayload() string {
 	if o == nil {
-		var ret map[string]interface{}
+		var ret string
 		return ret
 	}
 
@@ -84,7 +84,7 @@ func (o *EndpointTransformationSimulateOut) GetPayload() map[string]interface{}
 
 // GetPayloadOk returns a tuple with the Payload field value
 // and a boolean to check if the value has been set.
-func (o *EndpointTransformationSimulateOut) GetPayloadOk() (*map[string]interface{}, bool) {
+func (o *EndpointTransformationSimulateOut) GetPayloadOk() (*string, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -92,7 +92,7 @@ func (o *EndpointTransformationSimulateOut) GetPayloadOk() (*map[string]interfac
 }
 
 // SetPayload sets field value
-func (o *EndpointTransformationSimulateOut) SetPayload(v map[string]interface{}) {
+func (o *EndpointTransformationSimulateOut) SetPayload(v string) {
 	o.Payload = v
 }
 
diff --git a/go/internal/openapi/model_endpoint_update.go b/go/internal/openapi/model_endpoint_update.go
index 2e6da6418..c0c561d29 100644
--- a/go/internal/openapi/model_endpoint_update.go
+++ b/go/internal/openapi/model_endpoint_update.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -21,7 +21,7 @@ type EndpointUpdate struct {
 	Description *string `json:"description,omitempty"`
 	Disabled *bool `json:"disabled,omitempty"`
 	FilterTypes []string `json:"filterTypes,omitempty"`
-	Metadata map[string]string `json:"metadata,omitempty"`
+	Metadata *map[string]string `json:"metadata,omitempty"`
 	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
 	// Optional unique identifier for the endpoint
 	Uid NullableString `json:"uid,omitempty"`
@@ -186,23 +186,22 @@ func (o *EndpointUpdate) SetFilterTypes(v []string) {
 	o.FilterTypes = v
 }
 
-// GetMetadata returns the Metadata field value if set, zero value otherwise (both if not set or set to explicit null).
+// GetMetadata returns the Metadata field value if set, zero value otherwise.
 func (o *EndpointUpdate) GetMetadata() map[string]string {
-	if o == nil  {
+	if o == nil || o.Metadata == nil {
 		var ret map[string]string
 		return ret
 	}
-	return o.Metadata
+	return *o.Metadata
 }
 
 // GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
 // and a boolean to check if the value has been set.
-// NOTE: If the value is an explicit nil, `nil, true` will be returned
 func (o *EndpointUpdate) GetMetadataOk() (*map[string]string, bool) {
 	if o == nil || o.Metadata == nil {
 		return nil, false
 	}
-	return &o.Metadata, true
+	return o.Metadata, true
 }
 
 // HasMetadata returns a boolean if a field has been set.
@@ -216,7 +215,7 @@ func (o *EndpointUpdate) HasMetadata() bool {
 
 // SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
 func (o *EndpointUpdate) SetMetadata(v map[string]string) {
-	o.Metadata = v
+	o.Metadata = &v
 }
 
 // GetRateLimit returns the RateLimit field value if set, zero value otherwise (both if not set or set to explicit null).
diff --git a/go/internal/openapi/model_endpoint_updated_event.go b/go/internal/openapi/model_endpoint_updated_event.go
index 6776a8c35..f89dbb0fb 100644
--- a/go/internal/openapi/model_endpoint_updated_event.go
+++ b/go/internal/openapi/model_endpoint_updated_event.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,18 +17,17 @@ import (
 // EndpointUpdatedEvent Sent when an endpoint is updated.
 type EndpointUpdatedEvent struct {
 	Data EndpointUpdatedEventData `json:"data"`
-	Type *string `json:"type,omitempty"`
+	Type string `json:"type"`
 }
 
 // NewEndpointUpdatedEvent instantiates a new EndpointUpdatedEvent object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEndpointUpdatedEvent(data EndpointUpdatedEventData) *EndpointUpdatedEvent {
+func NewEndpointUpdatedEvent(data EndpointUpdatedEventData, type_ string) *EndpointUpdatedEvent {
 	this := EndpointUpdatedEvent{}
 	this.Data = data
-	var type_ string = "endpoint.updated"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -38,7 +37,7 @@ func NewEndpointUpdatedEvent(data EndpointUpdatedEventData) *EndpointUpdatedEven
 func NewEndpointUpdatedEventWithDefaults() *EndpointUpdatedEvent {
 	this := EndpointUpdatedEvent{}
 	var type_ string = "endpoint.updated"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -66,36 +65,28 @@ func (o *EndpointUpdatedEvent) SetData(v EndpointUpdatedEventData) {
 	o.Data = v
 }
 
-// GetType returns the Type field value if set, zero value otherwise.
+// GetType returns the Type field value
 func (o *EndpointUpdatedEvent) GetType() string {
-	if o == nil || o.Type == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Type
+
+	return o.Type
 }
 
-// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// GetTypeOk returns a tuple with the Type field value
 // and a boolean to check if the value has been set.
 func (o *EndpointUpdatedEvent) GetTypeOk() (*string, bool) {
-	if o == nil || o.Type == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Type, true
+	return &o.Type, true
 }
 
-// HasType returns a boolean if a field has been set.
-func (o *EndpointUpdatedEvent) HasType() bool {
-	if o != nil && o.Type != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetType gets a reference to the given string and assigns it to the Type field.
+// SetType sets field value
 func (o *EndpointUpdatedEvent) SetType(v string) {
-	o.Type = &v
+	o.Type = v
 }
 
 func (o EndpointUpdatedEvent) MarshalJSON() ([]byte, error) {
@@ -103,7 +94,7 @@ func (o EndpointUpdatedEvent) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["data"] = o.Data
 	}
-	if o.Type != nil {
+	if true {
 		toSerialize["type"] = o.Type
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_endpoint_updated_event_data.go b/go/internal/openapi/model_endpoint_updated_event_data.go
index b5a20e5f6..7d7107352 100644
--- a/go/internal/openapi/model_endpoint_updated_event_data.go
+++ b/go/internal/openapi/model_endpoint_updated_event_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,11 +16,13 @@ import (
 
 // EndpointUpdatedEventData struct for EndpointUpdatedEventData
 type EndpointUpdatedEventData struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
-	// Optional unique identifier for the endpoint
+	// The ep's UID
 	EndpointUid NullableString `json:"endpointUid,omitempty"`
 }
 
diff --git a/go/internal/openapi/model_environment_in.go b/go/internal/openapi/model_environment_in.go
index f7ba9ac63..092bb73a3 100644
--- a/go/internal/openapi/model_environment_in.go
+++ b/go/internal/openapi/model_environment_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_environment_out.go b/go/internal/openapi/model_environment_out.go
index 875622e42..8eb3abd2f 100644
--- a/go/internal/openapi/model_environment_out.go
+++ b/go/internal/openapi/model_environment_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_environment_settings_out.go b/go/internal/openapi/model_environment_settings_out.go
index 45d3cd9f1..aebdfc1f0 100644
--- a/go/internal/openapi/model_environment_settings_out.go
+++ b/go/internal/openapi/model_environment_settings_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_event_example_in.go b/go/internal/openapi/model_event_example_in.go
index 7cfed2ef1..3e880497d 100644
--- a/go/internal/openapi/model_event_example_in.go
+++ b/go/internal/openapi/model_event_example_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,6 +16,7 @@ import (
 
 // EventExampleIn struct for EventExampleIn
 type EventExampleIn struct {
+	// The event type's name
 	EventType string `json:"eventType"`
 }
 
diff --git a/go/internal/openapi/model_event_type_example_out.go b/go/internal/openapi/model_event_type_example_out.go
index 8463ffecd..aeb16b4d5 100644
--- a/go/internal/openapi/model_event_type_example_out.go
+++ b/go/internal/openapi/model_event_type_example_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,14 +16,14 @@ import (
 
 // EventTypeExampleOut struct for EventTypeExampleOut
 type EventTypeExampleOut struct {
-	Example map[string]interface{} `json:"example"`
+	Example map[string]map[string]interface{} `json:"example"`
 }
 
 // NewEventTypeExampleOut instantiates a new EventTypeExampleOut object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewEventTypeExampleOut(example map[string]interface{}) *EventTypeExampleOut {
+func NewEventTypeExampleOut(example map[string]map[string]interface{}) *EventTypeExampleOut {
 	this := EventTypeExampleOut{}
 	this.Example = example
 	return &this
@@ -38,9 +38,9 @@ func NewEventTypeExampleOutWithDefaults() *EventTypeExampleOut {
 }
 
 // GetExample returns the Example field value
-func (o *EventTypeExampleOut) GetExample() map[string]interface{} {
+func (o *EventTypeExampleOut) GetExample() map[string]map[string]interface{} {
 	if o == nil {
-		var ret map[string]interface{}
+		var ret map[string]map[string]interface{}
 		return ret
 	}
 
@@ -49,7 +49,7 @@ func (o *EventTypeExampleOut) GetExample() map[string]interface{} {
 
 // GetExampleOk returns a tuple with the Example field value
 // and a boolean to check if the value has been set.
-func (o *EventTypeExampleOut) GetExampleOk() (*map[string]interface{}, bool) {
+func (o *EventTypeExampleOut) GetExampleOk() (*map[string]map[string]interface{}, bool) {
 	if o == nil  {
 		return nil, false
 	}
@@ -57,7 +57,7 @@ func (o *EventTypeExampleOut) GetExampleOk() (*map[string]interface{}, bool) {
 }
 
 // SetExample sets field value
-func (o *EventTypeExampleOut) SetExample(v map[string]interface{}) {
+func (o *EventTypeExampleOut) SetExample(v map[string]map[string]interface{}) {
 	o.Example = v
 }
 
diff --git a/go/internal/openapi/model_event_type_in.go b/go/internal/openapi/model_event_type_in.go
index 7f5cae8d4..0258905b8 100644
--- a/go/internal/openapi/model_event_type_in.go
+++ b/go/internal/openapi/model_event_type_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -19,6 +19,7 @@ type EventTypeIn struct {
 	Archived *bool `json:"archived,omitempty"`
 	Description string `json:"description"`
 	FeatureFlag NullableString `json:"featureFlag,omitempty"`
+	// The event type's name
 	Name string `json:"name"`
 	// The schema for the event type for a specific version as a JSON schema.
 	Schemas map[string]map[string]interface{} `json:"schemas,omitempty"`
diff --git a/go/internal/openapi/model_event_type_out.go b/go/internal/openapi/model_event_type_out.go
index cef809f18..173d7ac55 100644
--- a/go/internal/openapi/model_event_type_out.go
+++ b/go/internal/openapi/model_event_type_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -21,6 +21,7 @@ type EventTypeOut struct {
 	CreatedAt time.Time `json:"createdAt"`
 	Description string `json:"description"`
 	FeatureFlag NullableString `json:"featureFlag,omitempty"`
+	// The event type's name
 	Name string `json:"name"`
 	// The schema for the event type for a specific version as a JSON schema.
 	Schemas map[string]map[string]interface{} `json:"schemas,omitempty"`
diff --git a/go/internal/openapi/model_event_type_patch.go b/go/internal/openapi/model_event_type_patch.go
new file mode 100644
index 000000000..a9be189ce
--- /dev/null
+++ b/go/internal/openapi/model_event_type_patch.go
@@ -0,0 +1,234 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// EventTypePatch struct for EventTypePatch
+type EventTypePatch struct {
+	Archived *bool `json:"archived,omitempty"`
+	Description *string `json:"description,omitempty"`
+	FeatureFlag NullableString `json:"featureFlag,omitempty"`
+	Schemas map[string]map[string]interface{} `json:"schemas,omitempty"`
+}
+
+// NewEventTypePatch instantiates a new EventTypePatch object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewEventTypePatch() *EventTypePatch {
+	this := EventTypePatch{}
+	return &this
+}
+
+// NewEventTypePatchWithDefaults instantiates a new EventTypePatch object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewEventTypePatchWithDefaults() *EventTypePatch {
+	this := EventTypePatch{}
+	return &this
+}
+
+// GetArchived returns the Archived field value if set, zero value otherwise.
+func (o *EventTypePatch) GetArchived() bool {
+	if o == nil || o.Archived == nil {
+		var ret bool
+		return ret
+	}
+	return *o.Archived
+}
+
+// GetArchivedOk returns a tuple with the Archived field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EventTypePatch) GetArchivedOk() (*bool, bool) {
+	if o == nil || o.Archived == nil {
+		return nil, false
+	}
+	return o.Archived, true
+}
+
+// HasArchived returns a boolean if a field has been set.
+func (o *EventTypePatch) HasArchived() bool {
+	if o != nil && o.Archived != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetArchived gets a reference to the given bool and assigns it to the Archived field.
+func (o *EventTypePatch) SetArchived(v bool) {
+	o.Archived = &v
+}
+
+// GetDescription returns the Description field value if set, zero value otherwise.
+func (o *EventTypePatch) GetDescription() string {
+	if o == nil || o.Description == nil {
+		var ret string
+		return ret
+	}
+	return *o.Description
+}
+
+// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *EventTypePatch) GetDescriptionOk() (*string, bool) {
+	if o == nil || o.Description == nil {
+		return nil, false
+	}
+	return o.Description, true
+}
+
+// HasDescription returns a boolean if a field has been set.
+func (o *EventTypePatch) HasDescription() bool {
+	if o != nil && o.Description != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetDescription gets a reference to the given string and assigns it to the Description field.
+func (o *EventTypePatch) SetDescription(v string) {
+	o.Description = &v
+}
+
+// GetFeatureFlag returns the FeatureFlag field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EventTypePatch) GetFeatureFlag() string {
+	if o == nil || o.FeatureFlag.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.FeatureFlag.Get()
+}
+
+// GetFeatureFlagOk returns a tuple with the FeatureFlag field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EventTypePatch) GetFeatureFlagOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.FeatureFlag.Get(), o.FeatureFlag.IsSet()
+}
+
+// HasFeatureFlag returns a boolean if a field has been set.
+func (o *EventTypePatch) HasFeatureFlag() bool {
+	if o != nil && o.FeatureFlag.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetFeatureFlag gets a reference to the given NullableString and assigns it to the FeatureFlag field.
+func (o *EventTypePatch) SetFeatureFlag(v string) {
+	o.FeatureFlag.Set(&v)
+}
+// SetFeatureFlagNil sets the value for FeatureFlag to be an explicit nil
+func (o *EventTypePatch) SetFeatureFlagNil() {
+	o.FeatureFlag.Set(nil)
+}
+
+// UnsetFeatureFlag ensures that no value is present for FeatureFlag, not even an explicit nil
+func (o *EventTypePatch) UnsetFeatureFlag() {
+	o.FeatureFlag.Unset()
+}
+
+// GetSchemas returns the Schemas field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *EventTypePatch) GetSchemas() map[string]map[string]interface{} {
+	if o == nil  {
+		var ret map[string]map[string]interface{}
+		return ret
+	}
+	return o.Schemas
+}
+
+// GetSchemasOk returns a tuple with the Schemas field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *EventTypePatch) GetSchemasOk() (*map[string]map[string]interface{}, bool) {
+	if o == nil || o.Schemas == nil {
+		return nil, false
+	}
+	return &o.Schemas, true
+}
+
+// HasSchemas returns a boolean if a field has been set.
+func (o *EventTypePatch) HasSchemas() bool {
+	if o != nil && o.Schemas != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetSchemas gets a reference to the given map[string]map[string]interface{} and assigns it to the Schemas field.
+func (o *EventTypePatch) SetSchemas(v map[string]map[string]interface{}) {
+	o.Schemas = v
+}
+
+func (o EventTypePatch) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Archived != nil {
+		toSerialize["archived"] = o.Archived
+	}
+	if o.Description != nil {
+		toSerialize["description"] = o.Description
+	}
+	if o.FeatureFlag.IsSet() {
+		toSerialize["featureFlag"] = o.FeatureFlag.Get()
+	}
+	if o.Schemas != nil {
+		toSerialize["schemas"] = o.Schemas
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableEventTypePatch struct {
+	value *EventTypePatch
+	isSet bool
+}
+
+func (v NullableEventTypePatch) Get() *EventTypePatch {
+	return v.value
+}
+
+func (v *NullableEventTypePatch) Set(val *EventTypePatch) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableEventTypePatch) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableEventTypePatch) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableEventTypePatch(val *EventTypePatch) *NullableEventTypePatch {
+	return &NullableEventTypePatch{value: val, isSet: true}
+}
+
+func (v NullableEventTypePatch) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableEventTypePatch) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_event_type_schema_in.go b/go/internal/openapi/model_event_type_schema_in.go
index 99280b108..5a0e7b93a 100644
--- a/go/internal/openapi/model_event_type_schema_in.go
+++ b/go/internal/openapi/model_event_type_schema_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,7 +16,6 @@ import (
 
 // EventTypeSchemaIn struct for EventTypeSchemaIn
 type EventTypeSchemaIn struct {
-	// The schema for an event type
 	Schema map[string]interface{} `json:"schema"`
 }
 
diff --git a/go/internal/openapi/model_event_type_update.go b/go/internal/openapi/model_event_type_update.go
index 30bb129f1..f1dabc687 100644
--- a/go/internal/openapi/model_event_type_update.go
+++ b/go/internal/openapi/model_event_type_update.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_font_size_config.go b/go/internal/openapi/model_font_size_config.go
index 493f13217..f9ed5d846 100644
--- a/go/internal/openapi/model_font_size_config.go
+++ b/go/internal/openapi/model_font_size_config.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_http_error_out.go b/go/internal/openapi/model_http_error_out.go
index d442ed0ab..d605c92a1 100644
--- a/go/internal/openapi/model_http_error_out.go
+++ b/go/internal/openapi/model_http_error_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_http_validation_error.go b/go/internal/openapi/model_http_validation_error.go
index a9b87bad1..b916ee959 100644
--- a/go/internal/openapi/model_http_validation_error.go
+++ b/go/internal/openapi/model_http_validation_error.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,15 +16,16 @@ import (
 
 // HTTPValidationError struct for HTTPValidationError
 type HTTPValidationError struct {
-	Detail *[]ValidationError `json:"detail,omitempty"`
+	Detail []ValidationError `json:"detail"`
 }
 
 // NewHTTPValidationError instantiates a new HTTPValidationError object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewHTTPValidationError() *HTTPValidationError {
+func NewHTTPValidationError(detail []ValidationError) *HTTPValidationError {
 	this := HTTPValidationError{}
+	this.Detail = detail
 	return &this
 }
 
@@ -36,41 +37,33 @@ func NewHTTPValidationErrorWithDefaults() *HTTPValidationError {
 	return &this
 }
 
-// GetDetail returns the Detail field value if set, zero value otherwise.
+// GetDetail returns the Detail field value
 func (o *HTTPValidationError) GetDetail() []ValidationError {
-	if o == nil || o.Detail == nil {
+	if o == nil {
 		var ret []ValidationError
 		return ret
 	}
-	return *o.Detail
+
+	return o.Detail
 }
 
-// GetDetailOk returns a tuple with the Detail field value if set, nil otherwise
+// GetDetailOk returns a tuple with the Detail field value
 // and a boolean to check if the value has been set.
 func (o *HTTPValidationError) GetDetailOk() (*[]ValidationError, bool) {
-	if o == nil || o.Detail == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Detail, true
-}
-
-// HasDetail returns a boolean if a field has been set.
-func (o *HTTPValidationError) HasDetail() bool {
-	if o != nil && o.Detail != nil {
-		return true
-	}
-
-	return false
+	return &o.Detail, true
 }
 
-// SetDetail gets a reference to the given []ValidationError and assigns it to the Detail field.
+// SetDetail sets field value
 func (o *HTTPValidationError) SetDetail(v []ValidationError) {
-	o.Detail = &v
+	o.Detail = v
 }
 
 func (o HTTPValidationError) MarshalJSON() ([]byte, error) {
 	toSerialize := map[string]interface{}{}
-	if o.Detail != nil {
+	if true {
 		toSerialize["detail"] = o.Detail
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_integration_in.go b/go/internal/openapi/model_integration_in.go
index 4cb7229df..dbcd37ae2 100644
--- a/go/internal/openapi/model_integration_in.go
+++ b/go/internal/openapi/model_integration_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_integration_key_out.go b/go/internal/openapi/model_integration_key_out.go
index 6ac3371d2..9abe26ebe 100644
--- a/go/internal/openapi/model_integration_key_out.go
+++ b/go/internal/openapi/model_integration_key_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_integration_out.go b/go/internal/openapi/model_integration_out.go
index 1af75ce82..0471fdf29 100644
--- a/go/internal/openapi/model_integration_out.go
+++ b/go/internal/openapi/model_integration_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -18,6 +18,7 @@ import (
 // IntegrationOut struct for IntegrationOut
 type IntegrationOut struct {
 	CreatedAt time.Time `json:"createdAt"`
+	// The integ's ID
 	Id string `json:"id"`
 	Name string `json:"name"`
 	UpdatedAt time.Time `json:"updatedAt"`
diff --git a/go/internal/openapi/model_integration_update.go b/go/internal/openapi/model_integration_update.go
index 0ab3ab92a..63548b07d 100644
--- a/go/internal/openapi/model_integration_update.go
+++ b/go/internal/openapi/model_integration_update.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_application_out_.go b/go/internal/openapi/model_list_response_application_out_.go
index 1ec8e8d08..5ef20fc81 100644
--- a/go/internal/openapi/model_list_response_application_out_.go
+++ b/go/internal/openapi/model_list_response_application_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_application_stats_.go b/go/internal/openapi/model_list_response_application_stats_.go
index b9b92e39c..0ed8f3821 100644
--- a/go/internal/openapi/model_list_response_application_stats_.go
+++ b/go/internal/openapi/model_list_response_application_stats_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -19,6 +19,7 @@ type ListResponseApplicationStats struct {
 	Data []ApplicationStats `json:"data"`
 	Done bool `json:"done"`
 	Iterator NullableString `json:"iterator,omitempty"`
+	PrevIterator NullableString `json:"prevIterator,omitempty"`
 }
 
 // NewListResponseApplicationStats instantiates a new ListResponseApplicationStats object
@@ -130,6 +131,48 @@ func (o *ListResponseApplicationStats) UnsetIterator() {
 	o.Iterator.Unset()
 }
 
+// GetPrevIterator returns the PrevIterator field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ListResponseApplicationStats) GetPrevIterator() string {
+	if o == nil || o.PrevIterator.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.PrevIterator.Get()
+}
+
+// GetPrevIteratorOk returns a tuple with the PrevIterator field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ListResponseApplicationStats) GetPrevIteratorOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.PrevIterator.Get(), o.PrevIterator.IsSet()
+}
+
+// HasPrevIterator returns a boolean if a field has been set.
+func (o *ListResponseApplicationStats) HasPrevIterator() bool {
+	if o != nil && o.PrevIterator.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetPrevIterator gets a reference to the given NullableString and assigns it to the PrevIterator field.
+func (o *ListResponseApplicationStats) SetPrevIterator(v string) {
+	o.PrevIterator.Set(&v)
+}
+// SetPrevIteratorNil sets the value for PrevIterator to be an explicit nil
+func (o *ListResponseApplicationStats) SetPrevIteratorNil() {
+	o.PrevIterator.Set(nil)
+}
+
+// UnsetPrevIterator ensures that no value is present for PrevIterator, not even an explicit nil
+func (o *ListResponseApplicationStats) UnsetPrevIterator() {
+	o.PrevIterator.Unset()
+}
+
 func (o ListResponseApplicationStats) MarshalJSON() ([]byte, error) {
 	toSerialize := map[string]interface{}{}
 	if true {
@@ -141,6 +184,9 @@ func (o ListResponseApplicationStats) MarshalJSON() ([]byte, error) {
 	if o.Iterator.IsSet() {
 		toSerialize["iterator"] = o.Iterator.Get()
 	}
+	if o.PrevIterator.IsSet() {
+		toSerialize["prevIterator"] = o.PrevIterator.Get()
+	}
 	return json.Marshal(toSerialize)
 }
 
diff --git a/go/internal/openapi/model_list_response_background_task_out_.go b/go/internal/openapi/model_list_response_background_task_out_.go
new file mode 100644
index 000000000..d9de48693
--- /dev/null
+++ b/go/internal/openapi/model_list_response_background_task_out_.go
@@ -0,0 +1,229 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// ListResponseBackgroundTaskOut struct for ListResponseBackgroundTaskOut
+type ListResponseBackgroundTaskOut struct {
+	Data []BackgroundTaskOut `json:"data"`
+	Done bool `json:"done"`
+	Iterator NullableString `json:"iterator,omitempty"`
+	PrevIterator NullableString `json:"prevIterator,omitempty"`
+}
+
+// NewListResponseBackgroundTaskOut instantiates a new ListResponseBackgroundTaskOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewListResponseBackgroundTaskOut(data []BackgroundTaskOut, done bool) *ListResponseBackgroundTaskOut {
+	this := ListResponseBackgroundTaskOut{}
+	this.Data = data
+	this.Done = done
+	return &this
+}
+
+// NewListResponseBackgroundTaskOutWithDefaults instantiates a new ListResponseBackgroundTaskOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewListResponseBackgroundTaskOutWithDefaults() *ListResponseBackgroundTaskOut {
+	this := ListResponseBackgroundTaskOut{}
+	return &this
+}
+
+// GetData returns the Data field value
+func (o *ListResponseBackgroundTaskOut) GetData() []BackgroundTaskOut {
+	if o == nil {
+		var ret []BackgroundTaskOut
+		return ret
+	}
+
+	return o.Data
+}
+
+// GetDataOk returns a tuple with the Data field value
+// and a boolean to check if the value has been set.
+func (o *ListResponseBackgroundTaskOut) GetDataOk() (*[]BackgroundTaskOut, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Data, true
+}
+
+// SetData sets field value
+func (o *ListResponseBackgroundTaskOut) SetData(v []BackgroundTaskOut) {
+	o.Data = v
+}
+
+// GetDone returns the Done field value
+func (o *ListResponseBackgroundTaskOut) GetDone() bool {
+	if o == nil {
+		var ret bool
+		return ret
+	}
+
+	return o.Done
+}
+
+// GetDoneOk returns a tuple with the Done field value
+// and a boolean to check if the value has been set.
+func (o *ListResponseBackgroundTaskOut) GetDoneOk() (*bool, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Done, true
+}
+
+// SetDone sets field value
+func (o *ListResponseBackgroundTaskOut) SetDone(v bool) {
+	o.Done = v
+}
+
+// GetIterator returns the Iterator field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ListResponseBackgroundTaskOut) GetIterator() string {
+	if o == nil || o.Iterator.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.Iterator.Get()
+}
+
+// GetIteratorOk returns a tuple with the Iterator field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ListResponseBackgroundTaskOut) GetIteratorOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.Iterator.Get(), o.Iterator.IsSet()
+}
+
+// HasIterator returns a boolean if a field has been set.
+func (o *ListResponseBackgroundTaskOut) HasIterator() bool {
+	if o != nil && o.Iterator.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetIterator gets a reference to the given NullableString and assigns it to the Iterator field.
+func (o *ListResponseBackgroundTaskOut) SetIterator(v string) {
+	o.Iterator.Set(&v)
+}
+// SetIteratorNil sets the value for Iterator to be an explicit nil
+func (o *ListResponseBackgroundTaskOut) SetIteratorNil() {
+	o.Iterator.Set(nil)
+}
+
+// UnsetIterator ensures that no value is present for Iterator, not even an explicit nil
+func (o *ListResponseBackgroundTaskOut) UnsetIterator() {
+	o.Iterator.Unset()
+}
+
+// GetPrevIterator returns the PrevIterator field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ListResponseBackgroundTaskOut) GetPrevIterator() string {
+	if o == nil || o.PrevIterator.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.PrevIterator.Get()
+}
+
+// GetPrevIteratorOk returns a tuple with the PrevIterator field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ListResponseBackgroundTaskOut) GetPrevIteratorOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.PrevIterator.Get(), o.PrevIterator.IsSet()
+}
+
+// HasPrevIterator returns a boolean if a field has been set.
+func (o *ListResponseBackgroundTaskOut) HasPrevIterator() bool {
+	if o != nil && o.PrevIterator.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetPrevIterator gets a reference to the given NullableString and assigns it to the PrevIterator field.
+func (o *ListResponseBackgroundTaskOut) SetPrevIterator(v string) {
+	o.PrevIterator.Set(&v)
+}
+// SetPrevIteratorNil sets the value for PrevIterator to be an explicit nil
+func (o *ListResponseBackgroundTaskOut) SetPrevIteratorNil() {
+	o.PrevIterator.Set(nil)
+}
+
+// UnsetPrevIterator ensures that no value is present for PrevIterator, not even an explicit nil
+func (o *ListResponseBackgroundTaskOut) UnsetPrevIterator() {
+	o.PrevIterator.Unset()
+}
+
+func (o ListResponseBackgroundTaskOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["data"] = o.Data
+	}
+	if true {
+		toSerialize["done"] = o.Done
+	}
+	if o.Iterator.IsSet() {
+		toSerialize["iterator"] = o.Iterator.Get()
+	}
+	if o.PrevIterator.IsSet() {
+		toSerialize["prevIterator"] = o.PrevIterator.Get()
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableListResponseBackgroundTaskOut struct {
+	value *ListResponseBackgroundTaskOut
+	isSet bool
+}
+
+func (v NullableListResponseBackgroundTaskOut) Get() *ListResponseBackgroundTaskOut {
+	return v.value
+}
+
+func (v *NullableListResponseBackgroundTaskOut) Set(val *ListResponseBackgroundTaskOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableListResponseBackgroundTaskOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableListResponseBackgroundTaskOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableListResponseBackgroundTaskOut(val *ListResponseBackgroundTaskOut) *NullableListResponseBackgroundTaskOut {
+	return &NullableListResponseBackgroundTaskOut{value: val, isSet: true}
+}
+
+func (v NullableListResponseBackgroundTaskOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableListResponseBackgroundTaskOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_list_response_endpoint_message_out_.go b/go/internal/openapi/model_list_response_endpoint_message_out_.go
index 7b0e87658..4a78bf474 100644
--- a/go/internal/openapi/model_list_response_endpoint_message_out_.go
+++ b/go/internal/openapi/model_list_response_endpoint_message_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_endpoint_out_.go b/go/internal/openapi/model_list_response_endpoint_out_.go
index fd7eaafbc..e210a8218 100644
--- a/go/internal/openapi/model_list_response_endpoint_out_.go
+++ b/go/internal/openapi/model_list_response_endpoint_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_event_type_out_.go b/go/internal/openapi/model_list_response_event_type_out_.go
index 0e1eec62b..e665660ff 100644
--- a/go/internal/openapi/model_list_response_event_type_out_.go
+++ b/go/internal/openapi/model_list_response_event_type_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_integration_out_.go b/go/internal/openapi/model_list_response_integration_out_.go
index 73eafa73a..c555dd803 100644
--- a/go/internal/openapi/model_list_response_integration_out_.go
+++ b/go/internal/openapi/model_list_response_integration_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -19,6 +19,7 @@ type ListResponseIntegrationOut struct {
 	Data []IntegrationOut `json:"data"`
 	Done bool `json:"done"`
 	Iterator NullableString `json:"iterator,omitempty"`
+	PrevIterator NullableString `json:"prevIterator,omitempty"`
 }
 
 // NewListResponseIntegrationOut instantiates a new ListResponseIntegrationOut object
@@ -130,6 +131,48 @@ func (o *ListResponseIntegrationOut) UnsetIterator() {
 	o.Iterator.Unset()
 }
 
+// GetPrevIterator returns the PrevIterator field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ListResponseIntegrationOut) GetPrevIterator() string {
+	if o == nil || o.PrevIterator.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.PrevIterator.Get()
+}
+
+// GetPrevIteratorOk returns a tuple with the PrevIterator field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ListResponseIntegrationOut) GetPrevIteratorOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.PrevIterator.Get(), o.PrevIterator.IsSet()
+}
+
+// HasPrevIterator returns a boolean if a field has been set.
+func (o *ListResponseIntegrationOut) HasPrevIterator() bool {
+	if o != nil && o.PrevIterator.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetPrevIterator gets a reference to the given NullableString and assigns it to the PrevIterator field.
+func (o *ListResponseIntegrationOut) SetPrevIterator(v string) {
+	o.PrevIterator.Set(&v)
+}
+// SetPrevIteratorNil sets the value for PrevIterator to be an explicit nil
+func (o *ListResponseIntegrationOut) SetPrevIteratorNil() {
+	o.PrevIterator.Set(nil)
+}
+
+// UnsetPrevIterator ensures that no value is present for PrevIterator, not even an explicit nil
+func (o *ListResponseIntegrationOut) UnsetPrevIterator() {
+	o.PrevIterator.Unset()
+}
+
 func (o ListResponseIntegrationOut) MarshalJSON() ([]byte, error) {
 	toSerialize := map[string]interface{}{}
 	if true {
@@ -141,6 +184,9 @@ func (o ListResponseIntegrationOut) MarshalJSON() ([]byte, error) {
 	if o.Iterator.IsSet() {
 		toSerialize["iterator"] = o.Iterator.Get()
 	}
+	if o.PrevIterator.IsSet() {
+		toSerialize["prevIterator"] = o.PrevIterator.Get()
+	}
 	return json.Marshal(toSerialize)
 }
 
diff --git a/go/internal/openapi/model_list_response_message_attempt_endpoint_out_.go b/go/internal/openapi/model_list_response_message_attempt_endpoint_out_.go
index 13330681c..28b93d844 100644
--- a/go/internal/openapi/model_list_response_message_attempt_endpoint_out_.go
+++ b/go/internal/openapi/model_list_response_message_attempt_endpoint_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_message_attempt_out_.go b/go/internal/openapi/model_list_response_message_attempt_out_.go
index 4f70cf49c..4917d3192 100644
--- a/go/internal/openapi/model_list_response_message_attempt_out_.go
+++ b/go/internal/openapi/model_list_response_message_attempt_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_list_response_message_endpoint_out_.go b/go/internal/openapi/model_list_response_message_endpoint_out_.go
index 939cd9556..d0fd9bac7 100644
--- a/go/internal/openapi/model_list_response_message_endpoint_out_.go
+++ b/go/internal/openapi/model_list_response_message_endpoint_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -19,6 +19,7 @@ type ListResponseMessageEndpointOut struct {
 	Data []MessageEndpointOut `json:"data"`
 	Done bool `json:"done"`
 	Iterator NullableString `json:"iterator,omitempty"`
+	PrevIterator NullableString `json:"prevIterator,omitempty"`
 }
 
 // NewListResponseMessageEndpointOut instantiates a new ListResponseMessageEndpointOut object
@@ -130,6 +131,48 @@ func (o *ListResponseMessageEndpointOut) UnsetIterator() {
 	o.Iterator.Unset()
 }
 
+// GetPrevIterator returns the PrevIterator field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *ListResponseMessageEndpointOut) GetPrevIterator() string {
+	if o == nil || o.PrevIterator.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.PrevIterator.Get()
+}
+
+// GetPrevIteratorOk returns a tuple with the PrevIterator field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *ListResponseMessageEndpointOut) GetPrevIteratorOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.PrevIterator.Get(), o.PrevIterator.IsSet()
+}
+
+// HasPrevIterator returns a boolean if a field has been set.
+func (o *ListResponseMessageEndpointOut) HasPrevIterator() bool {
+	if o != nil && o.PrevIterator.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetPrevIterator gets a reference to the given NullableString and assigns it to the PrevIterator field.
+func (o *ListResponseMessageEndpointOut) SetPrevIterator(v string) {
+	o.PrevIterator.Set(&v)
+}
+// SetPrevIteratorNil sets the value for PrevIterator to be an explicit nil
+func (o *ListResponseMessageEndpointOut) SetPrevIteratorNil() {
+	o.PrevIterator.Set(nil)
+}
+
+// UnsetPrevIterator ensures that no value is present for PrevIterator, not even an explicit nil
+func (o *ListResponseMessageEndpointOut) UnsetPrevIterator() {
+	o.PrevIterator.Unset()
+}
+
 func (o ListResponseMessageEndpointOut) MarshalJSON() ([]byte, error) {
 	toSerialize := map[string]interface{}{}
 	if true {
@@ -141,6 +184,9 @@ func (o ListResponseMessageEndpointOut) MarshalJSON() ([]byte, error) {
 	if o.Iterator.IsSet() {
 		toSerialize["iterator"] = o.Iterator.Get()
 	}
+	if o.PrevIterator.IsSet() {
+		toSerialize["prevIterator"] = o.PrevIterator.Get()
+	}
 	return json.Marshal(toSerialize)
 }
 
diff --git a/go/internal/openapi/model_list_response_message_out_.go b/go/internal/openapi/model_list_response_message_out_.go
index ccf9a03dc..36fa73e35 100644
--- a/go/internal/openapi/model_list_response_message_out_.go
+++ b/go/internal/openapi/model_list_response_message_out_.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_message_attempt_endpoint_out.go b/go/internal/openapi/model_message_attempt_endpoint_out.go
index e3e7dcbf3..190b4a198 100644
--- a/go/internal/openapi/model_message_attempt_endpoint_out.go
+++ b/go/internal/openapi/model_message_attempt_endpoint_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,8 +17,11 @@ import (
 
 // MessageAttemptEndpointOut struct for MessageAttemptEndpointOut
 type MessageAttemptEndpointOut struct {
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
+	// The attempt's ID
 	Id string `json:"id"`
+	// The msg's ID
 	MsgId string `json:"msgId"`
 	Response string `json:"response"`
 	ResponseStatusCode int32 `json:"responseStatusCode"`
diff --git a/go/internal/openapi/model_message_attempt_exhausted_event.go b/go/internal/openapi/model_message_attempt_exhausted_event.go
index 8aec023cc..3534cc133 100644
--- a/go/internal/openapi/model_message_attempt_exhausted_event.go
+++ b/go/internal/openapi/model_message_attempt_exhausted_event.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,18 +17,17 @@ import (
 // MessageAttemptExhaustedEvent Sent when a message delivery has failed (all of the retry attempts have been exhausted).
 type MessageAttemptExhaustedEvent struct {
 	Data MessageAttemptExhaustedEventData `json:"data"`
-	Type *string `json:"type,omitempty"`
+	Type string `json:"type"`
 }
 
 // NewMessageAttemptExhaustedEvent instantiates a new MessageAttemptExhaustedEvent object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewMessageAttemptExhaustedEvent(data MessageAttemptExhaustedEventData) *MessageAttemptExhaustedEvent {
+func NewMessageAttemptExhaustedEvent(data MessageAttemptExhaustedEventData, type_ string) *MessageAttemptExhaustedEvent {
 	this := MessageAttemptExhaustedEvent{}
 	this.Data = data
-	var type_ string = "message.attempt.exhausted"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -38,7 +37,7 @@ func NewMessageAttemptExhaustedEvent(data MessageAttemptExhaustedEventData) *Mes
 func NewMessageAttemptExhaustedEventWithDefaults() *MessageAttemptExhaustedEvent {
 	this := MessageAttemptExhaustedEvent{}
 	var type_ string = "message.attempt.exhausted"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -66,36 +65,28 @@ func (o *MessageAttemptExhaustedEvent) SetData(v MessageAttemptExhaustedEventDat
 	o.Data = v
 }
 
-// GetType returns the Type field value if set, zero value otherwise.
+// GetType returns the Type field value
 func (o *MessageAttemptExhaustedEvent) GetType() string {
-	if o == nil || o.Type == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Type
+
+	return o.Type
 }
 
-// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// GetTypeOk returns a tuple with the Type field value
 // and a boolean to check if the value has been set.
 func (o *MessageAttemptExhaustedEvent) GetTypeOk() (*string, bool) {
-	if o == nil || o.Type == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Type, true
+	return &o.Type, true
 }
 
-// HasType returns a boolean if a field has been set.
-func (o *MessageAttemptExhaustedEvent) HasType() bool {
-	if o != nil && o.Type != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetType gets a reference to the given string and assigns it to the Type field.
+// SetType sets field value
 func (o *MessageAttemptExhaustedEvent) SetType(v string) {
-	o.Type = &v
+	o.Type = v
 }
 
 func (o MessageAttemptExhaustedEvent) MarshalJSON() ([]byte, error) {
@@ -103,7 +94,7 @@ func (o MessageAttemptExhaustedEvent) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["data"] = o.Data
 	}
-	if o.Type != nil {
+	if true {
 		toSerialize["type"] = o.Type
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_message_attempt_exhausted_event_data.go b/go/internal/openapi/model_message_attempt_exhausted_event_data.go
index 07a773145..981efd62a 100644
--- a/go/internal/openapi/model_message_attempt_exhausted_event_data.go
+++ b/go/internal/openapi/model_message_attempt_exhausted_event_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -14,15 +14,18 @@ import (
 	"encoding/json"
 )
 
-// MessageAttemptExhaustedEventData struct for MessageAttemptExhaustedEventData
+// MessageAttemptExhaustedEventData Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a \"message.attempt.exhausted\" type or after it's failed four times as a \"message.attempt.failing\" event.
 type MessageAttemptExhaustedEventData struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
 	LastAttempt MessageAttemptFailedData `json:"lastAttempt"`
-	// Optional unique identifier for the message
+	// The msg's UID
 	MsgEventId NullableString `json:"msgEventId,omitempty"`
+	// The msg's ID
 	MsgId string `json:"msgId"`
 }
 
diff --git a/go/internal/openapi/model_message_attempt_failed_data.go b/go/internal/openapi/model_message_attempt_failed_data.go
index d7f177223..34c6311c0 100644
--- a/go/internal/openapi/model_message_attempt_failed_data.go
+++ b/go/internal/openapi/model_message_attempt_failed_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,6 +17,7 @@ import (
 
 // MessageAttemptFailedData struct for MessageAttemptFailedData
 type MessageAttemptFailedData struct {
+	// The attempt's ID
 	Id string `json:"id"`
 	ResponseStatusCode int32 `json:"responseStatusCode"`
 	Timestamp time.Time `json:"timestamp"`
diff --git a/go/internal/openapi/model_message_attempt_failing_event.go b/go/internal/openapi/model_message_attempt_failing_event.go
index 9c2351b98..01c722282 100644
--- a/go/internal/openapi/model_message_attempt_failing_event.go
+++ b/go/internal/openapi/model_message_attempt_failing_event.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,18 +17,17 @@ import (
 // MessageAttemptFailingEvent Sent after a message has been failing for a few times. It's sent on the fourth failure. It complements `message.attempt.exhausted` which is sent after the last failure.
 type MessageAttemptFailingEvent struct {
 	Data MessageAttemptFailingEventData `json:"data"`
-	Type *string `json:"type,omitempty"`
+	Type string `json:"type"`
 }
 
 // NewMessageAttemptFailingEvent instantiates a new MessageAttemptFailingEvent object
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewMessageAttemptFailingEvent(data MessageAttemptFailingEventData) *MessageAttemptFailingEvent {
+func NewMessageAttemptFailingEvent(data MessageAttemptFailingEventData, type_ string) *MessageAttemptFailingEvent {
 	this := MessageAttemptFailingEvent{}
 	this.Data = data
-	var type_ string = "message.attempt.failing"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -38,7 +37,7 @@ func NewMessageAttemptFailingEvent(data MessageAttemptFailingEventData) *Message
 func NewMessageAttemptFailingEventWithDefaults() *MessageAttemptFailingEvent {
 	this := MessageAttemptFailingEvent{}
 	var type_ string = "message.attempt.failing"
-	this.Type = &type_
+	this.Type = type_
 	return &this
 }
 
@@ -66,36 +65,28 @@ func (o *MessageAttemptFailingEvent) SetData(v MessageAttemptFailingEventData) {
 	o.Data = v
 }
 
-// GetType returns the Type field value if set, zero value otherwise.
+// GetType returns the Type field value
 func (o *MessageAttemptFailingEvent) GetType() string {
-	if o == nil || o.Type == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Type
+
+	return o.Type
 }
 
-// GetTypeOk returns a tuple with the Type field value if set, nil otherwise
+// GetTypeOk returns a tuple with the Type field value
 // and a boolean to check if the value has been set.
 func (o *MessageAttemptFailingEvent) GetTypeOk() (*string, bool) {
-	if o == nil || o.Type == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Type, true
+	return &o.Type, true
 }
 
-// HasType returns a boolean if a field has been set.
-func (o *MessageAttemptFailingEvent) HasType() bool {
-	if o != nil && o.Type != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetType gets a reference to the given string and assigns it to the Type field.
+// SetType sets field value
 func (o *MessageAttemptFailingEvent) SetType(v string) {
-	o.Type = &v
+	o.Type = v
 }
 
 func (o MessageAttemptFailingEvent) MarshalJSON() ([]byte, error) {
@@ -103,7 +94,7 @@ func (o MessageAttemptFailingEvent) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["data"] = o.Data
 	}
-	if o.Type != nil {
+	if true {
 		toSerialize["type"] = o.Type
 	}
 	return json.Marshal(toSerialize)
diff --git a/go/internal/openapi/model_message_attempt_failing_event_data.go b/go/internal/openapi/model_message_attempt_failing_event_data.go
index e39f78125..1003e5fa7 100644
--- a/go/internal/openapi/model_message_attempt_failing_event_data.go
+++ b/go/internal/openapi/model_message_attempt_failing_event_data.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -14,15 +14,18 @@ import (
 	"encoding/json"
 )
 
-// MessageAttemptFailingEventData struct for MessageAttemptFailingEventData
+// MessageAttemptFailingEventData Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a \"message.attempt.exhausted\" type or after it's failed four times as a \"message.attempt.failing\" event.
 type MessageAttemptFailingEventData struct {
+	// The app's ID
 	AppId string `json:"appId"`
-	// Optional unique identifier for the application
+	// The app's UID
 	AppUid NullableString `json:"appUid,omitempty"`
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
 	LastAttempt MessageAttemptFailedData `json:"lastAttempt"`
-	// Optional unique identifier for the message
+	// The msg's UID
 	MsgEventId NullableString `json:"msgEventId,omitempty"`
+	// The msg's ID
 	MsgId string `json:"msgId"`
 }
 
diff --git a/go/internal/openapi/model_message_attempt_headers_out.go b/go/internal/openapi/model_message_attempt_headers_out.go
index 396a9023b..4bd91e012 100644
--- a/go/internal/openapi/model_message_attempt_headers_out.go
+++ b/go/internal/openapi/model_message_attempt_headers_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -16,6 +16,7 @@ import (
 
 // MessageAttemptHeadersOut struct for MessageAttemptHeadersOut
 type MessageAttemptHeadersOut struct {
+	Sensitive []string `json:"sensitive"`
 	SentHeaders map[string]string `json:"sentHeaders"`
 }
 
@@ -23,8 +24,9 @@ type MessageAttemptHeadersOut struct {
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewMessageAttemptHeadersOut(sentHeaders map[string]string) *MessageAttemptHeadersOut {
+func NewMessageAttemptHeadersOut(sensitive []string, sentHeaders map[string]string) *MessageAttemptHeadersOut {
 	this := MessageAttemptHeadersOut{}
+	this.Sensitive = sensitive
 	this.SentHeaders = sentHeaders
 	return &this
 }
@@ -37,6 +39,30 @@ func NewMessageAttemptHeadersOutWithDefaults() *MessageAttemptHeadersOut {
 	return &this
 }
 
+// GetSensitive returns the Sensitive field value
+func (o *MessageAttemptHeadersOut) GetSensitive() []string {
+	if o == nil {
+		var ret []string
+		return ret
+	}
+
+	return o.Sensitive
+}
+
+// GetSensitiveOk returns a tuple with the Sensitive field value
+// and a boolean to check if the value has been set.
+func (o *MessageAttemptHeadersOut) GetSensitiveOk() (*[]string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Sensitive, true
+}
+
+// SetSensitive sets field value
+func (o *MessageAttemptHeadersOut) SetSensitive(v []string) {
+	o.Sensitive = v
+}
+
 // GetSentHeaders returns the SentHeaders field value
 func (o *MessageAttemptHeadersOut) GetSentHeaders() map[string]string {
 	if o == nil {
@@ -63,6 +89,9 @@ func (o *MessageAttemptHeadersOut) SetSentHeaders(v map[string]string) {
 
 func (o MessageAttemptHeadersOut) MarshalJSON() ([]byte, error) {
 	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["sensitive"] = o.Sensitive
+	}
 	if true {
 		toSerialize["sentHeaders"] = o.SentHeaders
 	}
diff --git a/go/internal/openapi/model_message_attempt_out.go b/go/internal/openapi/model_message_attempt_out.go
index dce69fb22..0d592eaba 100644
--- a/go/internal/openapi/model_message_attempt_out.go
+++ b/go/internal/openapi/model_message_attempt_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -17,8 +17,11 @@ import (
 
 // MessageAttemptOut struct for MessageAttemptOut
 type MessageAttemptOut struct {
+	// The ep's ID
 	EndpointId string `json:"endpointId"`
+	// The attempt's ID
 	Id string `json:"id"`
+	// The msg's ID
 	MsgId string `json:"msgId"`
 	Response string `json:"response"`
 	ResponseStatusCode int32 `json:"responseStatusCode"`
diff --git a/go/internal/openapi/model_message_attempt_trigger_type.go b/go/internal/openapi/model_message_attempt_trigger_type.go
index 1ba65976a..e9ff7b685 100644
--- a/go/internal/openapi/model_message_attempt_trigger_type.go
+++ b/go/internal/openapi/model_message_attempt_trigger_type.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_message_broadcast_in.go b/go/internal/openapi/model_message_broadcast_in.go
new file mode 100644
index 000000000..ef26895fc
--- /dev/null
+++ b/go/internal/openapi/model_message_broadcast_in.go
@@ -0,0 +1,263 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// MessageBroadcastIn struct for MessageBroadcastIn
+type MessageBroadcastIn struct {
+	// List of free-form identifiers that endpoints can filter by
+	Channels []string `json:"channels,omitempty"`
+	// Optional unique identifier for the message
+	EventId NullableString `json:"eventId,omitempty"`
+	// The event type's name
+	EventType string `json:"eventType"`
+	Payload map[string]interface{} `json:"payload"`
+	PayloadRetentionPeriod *int64 `json:"payloadRetentionPeriod,omitempty"`
+}
+
+// NewMessageBroadcastIn instantiates a new MessageBroadcastIn object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewMessageBroadcastIn(eventType string, payload map[string]interface{}) *MessageBroadcastIn {
+	this := MessageBroadcastIn{}
+	this.EventType = eventType
+	this.Payload = payload
+	var payloadRetentionPeriod int64 = 90
+	this.PayloadRetentionPeriod = &payloadRetentionPeriod
+	return &this
+}
+
+// NewMessageBroadcastInWithDefaults instantiates a new MessageBroadcastIn object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewMessageBroadcastInWithDefaults() *MessageBroadcastIn {
+	this := MessageBroadcastIn{}
+	var payloadRetentionPeriod int64 = 90
+	this.PayloadRetentionPeriod = &payloadRetentionPeriod
+	return &this
+}
+
+// GetChannels returns the Channels field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *MessageBroadcastIn) GetChannels() []string {
+	if o == nil  {
+		var ret []string
+		return ret
+	}
+	return o.Channels
+}
+
+// GetChannelsOk returns a tuple with the Channels field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *MessageBroadcastIn) GetChannelsOk() (*[]string, bool) {
+	if o == nil || o.Channels == nil {
+		return nil, false
+	}
+	return &o.Channels, true
+}
+
+// HasChannels returns a boolean if a field has been set.
+func (o *MessageBroadcastIn) HasChannels() bool {
+	if o != nil && o.Channels != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetChannels gets a reference to the given []string and assigns it to the Channels field.
+func (o *MessageBroadcastIn) SetChannels(v []string) {
+	o.Channels = v
+}
+
+// GetEventId returns the EventId field value if set, zero value otherwise (both if not set or set to explicit null).
+func (o *MessageBroadcastIn) GetEventId() string {
+	if o == nil || o.EventId.Get() == nil {
+		var ret string
+		return ret
+	}
+	return *o.EventId.Get()
+}
+
+// GetEventIdOk returns a tuple with the EventId field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+// NOTE: If the value is an explicit nil, `nil, true` will be returned
+func (o *MessageBroadcastIn) GetEventIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return o.EventId.Get(), o.EventId.IsSet()
+}
+
+// HasEventId returns a boolean if a field has been set.
+func (o *MessageBroadcastIn) HasEventId() bool {
+	if o != nil && o.EventId.IsSet() {
+		return true
+	}
+
+	return false
+}
+
+// SetEventId gets a reference to the given NullableString and assigns it to the EventId field.
+func (o *MessageBroadcastIn) SetEventId(v string) {
+	o.EventId.Set(&v)
+}
+// SetEventIdNil sets the value for EventId to be an explicit nil
+func (o *MessageBroadcastIn) SetEventIdNil() {
+	o.EventId.Set(nil)
+}
+
+// UnsetEventId ensures that no value is present for EventId, not even an explicit nil
+func (o *MessageBroadcastIn) UnsetEventId() {
+	o.EventId.Unset()
+}
+
+// GetEventType returns the EventType field value
+func (o *MessageBroadcastIn) GetEventType() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.EventType
+}
+
+// GetEventTypeOk returns a tuple with the EventType field value
+// and a boolean to check if the value has been set.
+func (o *MessageBroadcastIn) GetEventTypeOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.EventType, true
+}
+
+// SetEventType sets field value
+func (o *MessageBroadcastIn) SetEventType(v string) {
+	o.EventType = v
+}
+
+// GetPayload returns the Payload field value
+func (o *MessageBroadcastIn) GetPayload() map[string]interface{} {
+	if o == nil {
+		var ret map[string]interface{}
+		return ret
+	}
+
+	return o.Payload
+}
+
+// GetPayloadOk returns a tuple with the Payload field value
+// and a boolean to check if the value has been set.
+func (o *MessageBroadcastIn) GetPayloadOk() (*map[string]interface{}, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Payload, true
+}
+
+// SetPayload sets field value
+func (o *MessageBroadcastIn) SetPayload(v map[string]interface{}) {
+	o.Payload = v
+}
+
+// GetPayloadRetentionPeriod returns the PayloadRetentionPeriod field value if set, zero value otherwise.
+func (o *MessageBroadcastIn) GetPayloadRetentionPeriod() int64 {
+	if o == nil || o.PayloadRetentionPeriod == nil {
+		var ret int64
+		return ret
+	}
+	return *o.PayloadRetentionPeriod
+}
+
+// GetPayloadRetentionPeriodOk returns a tuple with the PayloadRetentionPeriod field value if set, nil otherwise
+// and a boolean to check if the value has been set.
+func (o *MessageBroadcastIn) GetPayloadRetentionPeriodOk() (*int64, bool) {
+	if o == nil || o.PayloadRetentionPeriod == nil {
+		return nil, false
+	}
+	return o.PayloadRetentionPeriod, true
+}
+
+// HasPayloadRetentionPeriod returns a boolean if a field has been set.
+func (o *MessageBroadcastIn) HasPayloadRetentionPeriod() bool {
+	if o != nil && o.PayloadRetentionPeriod != nil {
+		return true
+	}
+
+	return false
+}
+
+// SetPayloadRetentionPeriod gets a reference to the given int64 and assigns it to the PayloadRetentionPeriod field.
+func (o *MessageBroadcastIn) SetPayloadRetentionPeriod(v int64) {
+	o.PayloadRetentionPeriod = &v
+}
+
+func (o MessageBroadcastIn) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if o.Channels != nil {
+		toSerialize["channels"] = o.Channels
+	}
+	if o.EventId.IsSet() {
+		toSerialize["eventId"] = o.EventId.Get()
+	}
+	if true {
+		toSerialize["eventType"] = o.EventType
+	}
+	if true {
+		toSerialize["payload"] = o.Payload
+	}
+	if o.PayloadRetentionPeriod != nil {
+		toSerialize["payloadRetentionPeriod"] = o.PayloadRetentionPeriod
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableMessageBroadcastIn struct {
+	value *MessageBroadcastIn
+	isSet bool
+}
+
+func (v NullableMessageBroadcastIn) Get() *MessageBroadcastIn {
+	return v.value
+}
+
+func (v *NullableMessageBroadcastIn) Set(val *MessageBroadcastIn) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableMessageBroadcastIn) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableMessageBroadcastIn) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableMessageBroadcastIn(val *MessageBroadcastIn) *NullableMessageBroadcastIn {
+	return &NullableMessageBroadcastIn{value: val, isSet: true}
+}
+
+func (v NullableMessageBroadcastIn) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableMessageBroadcastIn) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_message_broadcast_out.go b/go/internal/openapi/model_message_broadcast_out.go
new file mode 100644
index 000000000..bc0687aff
--- /dev/null
+++ b/go/internal/openapi/model_message_broadcast_out.go
@@ -0,0 +1,166 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// MessageBroadcastOut struct for MessageBroadcastOut
+type MessageBroadcastOut struct {
+	Id string `json:"id"`
+	Status BackgroundTaskStatus `json:"status"`
+	Task BackgroundTaskType `json:"task"`
+}
+
+// NewMessageBroadcastOut instantiates a new MessageBroadcastOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewMessageBroadcastOut(id string, status BackgroundTaskStatus, task BackgroundTaskType) *MessageBroadcastOut {
+	this := MessageBroadcastOut{}
+	this.Id = id
+	this.Status = status
+	this.Task = task
+	return &this
+}
+
+// NewMessageBroadcastOutWithDefaults instantiates a new MessageBroadcastOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewMessageBroadcastOutWithDefaults() *MessageBroadcastOut {
+	this := MessageBroadcastOut{}
+	return &this
+}
+
+// GetId returns the Id field value
+func (o *MessageBroadcastOut) GetId() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Id
+}
+
+// GetIdOk returns a tuple with the Id field value
+// and a boolean to check if the value has been set.
+func (o *MessageBroadcastOut) GetIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Id, true
+}
+
+// SetId sets field value
+func (o *MessageBroadcastOut) SetId(v string) {
+	o.Id = v
+}
+
+// GetStatus returns the Status field value
+func (o *MessageBroadcastOut) GetStatus() BackgroundTaskStatus {
+	if o == nil {
+		var ret BackgroundTaskStatus
+		return ret
+	}
+
+	return o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value
+// and a boolean to check if the value has been set.
+func (o *MessageBroadcastOut) GetStatusOk() (*BackgroundTaskStatus, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Status, true
+}
+
+// SetStatus sets field value
+func (o *MessageBroadcastOut) SetStatus(v BackgroundTaskStatus) {
+	o.Status = v
+}
+
+// GetTask returns the Task field value
+func (o *MessageBroadcastOut) GetTask() BackgroundTaskType {
+	if o == nil {
+		var ret BackgroundTaskType
+		return ret
+	}
+
+	return o.Task
+}
+
+// GetTaskOk returns a tuple with the Task field value
+// and a boolean to check if the value has been set.
+func (o *MessageBroadcastOut) GetTaskOk() (*BackgroundTaskType, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Task, true
+}
+
+// SetTask sets field value
+func (o *MessageBroadcastOut) SetTask(v BackgroundTaskType) {
+	o.Task = v
+}
+
+func (o MessageBroadcastOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["id"] = o.Id
+	}
+	if true {
+		toSerialize["status"] = o.Status
+	}
+	if true {
+		toSerialize["task"] = o.Task
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableMessageBroadcastOut struct {
+	value *MessageBroadcastOut
+	isSet bool
+}
+
+func (v NullableMessageBroadcastOut) Get() *MessageBroadcastOut {
+	return v.value
+}
+
+func (v *NullableMessageBroadcastOut) Set(val *MessageBroadcastOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableMessageBroadcastOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableMessageBroadcastOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableMessageBroadcastOut(val *MessageBroadcastOut) *NullableMessageBroadcastOut {
+	return &NullableMessageBroadcastOut{value: val, isSet: true}
+}
+
+func (v NullableMessageBroadcastOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableMessageBroadcastOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_message_endpoint_out.go b/go/internal/openapi/model_message_endpoint_out.go
index 8337999ce..429ea770b 100644
--- a/go/internal/openapi/model_message_endpoint_out.go
+++ b/go/internal/openapi/model_message_endpoint_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -20,16 +20,18 @@ type MessageEndpointOut struct {
 	// List of message channels this endpoint listens to (omit for all)
 	Channels []string `json:"channels,omitempty"`
 	CreatedAt time.Time `json:"createdAt"`
-	Description *string `json:"description,omitempty"`
+	// An example endpoint name
+	Description string `json:"description"`
 	Disabled *bool `json:"disabled,omitempty"`
 	FilterTypes []string `json:"filterTypes,omitempty"`
+	// The ep's ID
 	Id string `json:"id"`
-	Metadata map[string]string `json:"metadata,omitempty"`
 	NextAttempt NullableTime `json:"nextAttempt,omitempty"`
 	RateLimit NullableInt32 `json:"rateLimit,omitempty"`
 	Status MessageStatus `json:"status"`
 	// Optional unique identifier for the endpoint
 	Uid NullableString `json:"uid,omitempty"`
+	UpdatedAt time.Time `json:"updatedAt"`
 	Url string `json:"url"`
 	Version int32 `json:"version"`
 }
@@ -38,15 +40,15 @@ type MessageEndpointOut struct {
 // This constructor will assign default values to properties that have it defined,
 // and makes sure properties required by API are set, but the set of arguments
 // will change when the set of required properties is changed
-func NewMessageEndpointOut(createdAt time.Time, id string, status MessageStatus, url string, version int32) *MessageEndpointOut {
+func NewMessageEndpointOut(createdAt time.Time, description string, id string, status MessageStatus, updatedAt time.Time, url string, version int32) *MessageEndpointOut {
 	this := MessageEndpointOut{}
 	this.CreatedAt = createdAt
-	var description string = ""
-	this.Description = &description
+	this.Description = description
 	var disabled bool = false
 	this.Disabled = &disabled
 	this.Id = id
 	this.Status = status
+	this.UpdatedAt = updatedAt
 	this.Url = url
 	this.Version = version
 	return &this
@@ -57,8 +59,6 @@ func NewMessageEndpointOut(createdAt time.Time, id string, status MessageStatus,
 // but it doesn't guarantee that properties required by API are set
 func NewMessageEndpointOutWithDefaults() *MessageEndpointOut {
 	this := MessageEndpointOut{}
-	var description string = ""
-	this.Description = &description
 	var disabled bool = false
 	this.Disabled = &disabled
 	return &this
@@ -121,36 +121,28 @@ func (o *MessageEndpointOut) SetCreatedAt(v time.Time) {
 	o.CreatedAt = v
 }
 
-// GetDescription returns the Description field value if set, zero value otherwise.
+// GetDescription returns the Description field value
 func (o *MessageEndpointOut) GetDescription() string {
-	if o == nil || o.Description == nil {
+	if o == nil {
 		var ret string
 		return ret
 	}
-	return *o.Description
+
+	return o.Description
 }
 
-// GetDescriptionOk returns a tuple with the Description field value if set, nil otherwise
+// GetDescriptionOk returns a tuple with the Description field value
 // and a boolean to check if the value has been set.
 func (o *MessageEndpointOut) GetDescriptionOk() (*string, bool) {
-	if o == nil || o.Description == nil {
+	if o == nil  {
 		return nil, false
 	}
-	return o.Description, true
-}
-
-// HasDescription returns a boolean if a field has been set.
-func (o *MessageEndpointOut) HasDescription() bool {
-	if o != nil && o.Description != nil {
-		return true
-	}
-
-	return false
+	return &o.Description, true
 }
 
-// SetDescription gets a reference to the given string and assigns it to the Description field.
+// SetDescription sets field value
 func (o *MessageEndpointOut) SetDescription(v string) {
-	o.Description = &v
+	o.Description = v
 }
 
 // GetDisabled returns the Disabled field value if set, zero value otherwise.
@@ -242,39 +234,6 @@ func (o *MessageEndpointOut) SetId(v string) {
 	o.Id = v
 }
 
-// GetMetadata returns the Metadata field value if set, zero value otherwise (both if not set or set to explicit null).
-func (o *MessageEndpointOut) GetMetadata() map[string]string {
-	if o == nil  {
-		var ret map[string]string
-		return ret
-	}
-	return o.Metadata
-}
-
-// GetMetadataOk returns a tuple with the Metadata field value if set, nil otherwise
-// and a boolean to check if the value has been set.
-// NOTE: If the value is an explicit nil, `nil, true` will be returned
-func (o *MessageEndpointOut) GetMetadataOk() (*map[string]string, bool) {
-	if o == nil || o.Metadata == nil {
-		return nil, false
-	}
-	return &o.Metadata, true
-}
-
-// HasMetadata returns a boolean if a field has been set.
-func (o *MessageEndpointOut) HasMetadata() bool {
-	if o != nil && o.Metadata != nil {
-		return true
-	}
-
-	return false
-}
-
-// SetMetadata gets a reference to the given map[string]string and assigns it to the Metadata field.
-func (o *MessageEndpointOut) SetMetadata(v map[string]string) {
-	o.Metadata = v
-}
-
 // GetNextAttempt returns the NextAttempt field value if set, zero value otherwise (both if not set or set to explicit null).
 func (o *MessageEndpointOut) GetNextAttempt() time.Time {
 	if o == nil || o.NextAttempt.Get() == nil {
@@ -425,6 +384,30 @@ func (o *MessageEndpointOut) UnsetUid() {
 	o.Uid.Unset()
 }
 
+// GetUpdatedAt returns the UpdatedAt field value
+func (o *MessageEndpointOut) GetUpdatedAt() time.Time {
+	if o == nil {
+		var ret time.Time
+		return ret
+	}
+
+	return o.UpdatedAt
+}
+
+// GetUpdatedAtOk returns a tuple with the UpdatedAt field value
+// and a boolean to check if the value has been set.
+func (o *MessageEndpointOut) GetUpdatedAtOk() (*time.Time, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.UpdatedAt, true
+}
+
+// SetUpdatedAt sets field value
+func (o *MessageEndpointOut) SetUpdatedAt(v time.Time) {
+	o.UpdatedAt = v
+}
+
 // GetUrl returns the Url field value
 func (o *MessageEndpointOut) GetUrl() string {
 	if o == nil {
@@ -481,7 +464,7 @@ func (o MessageEndpointOut) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["createdAt"] = o.CreatedAt
 	}
-	if o.Description != nil {
+	if true {
 		toSerialize["description"] = o.Description
 	}
 	if o.Disabled != nil {
@@ -493,9 +476,6 @@ func (o MessageEndpointOut) MarshalJSON() ([]byte, error) {
 	if true {
 		toSerialize["id"] = o.Id
 	}
-	if o.Metadata != nil {
-		toSerialize["metadata"] = o.Metadata
-	}
 	if o.NextAttempt.IsSet() {
 		toSerialize["nextAttempt"] = o.NextAttempt.Get()
 	}
@@ -508,6 +488,9 @@ func (o MessageEndpointOut) MarshalJSON() ([]byte, error) {
 	if o.Uid.IsSet() {
 		toSerialize["uid"] = o.Uid.Get()
 	}
+	if true {
+		toSerialize["updatedAt"] = o.UpdatedAt
+	}
 	if true {
 		toSerialize["url"] = o.Url
 	}
diff --git a/go/internal/openapi/model_message_in.go b/go/internal/openapi/model_message_in.go
index 5106fd93c..fb086a2aa 100644
--- a/go/internal/openapi/model_message_in.go
+++ b/go/internal/openapi/model_message_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -21,10 +21,10 @@ type MessageIn struct {
 	Channels []string `json:"channels,omitempty"`
 	// Optional unique identifier for the message
 	EventId NullableString `json:"eventId,omitempty"`
+	// The event type's name
 	EventType string `json:"eventType"`
 	Payload map[string]interface{} `json:"payload"`
-	// The retention period for the payload (in days).
-	PayloadRetentionPeriod *int32 `json:"payloadRetentionPeriod,omitempty"`
+	PayloadRetentionPeriod *int64 `json:"payloadRetentionPeriod,omitempty"`
 }
 
 // NewMessageIn instantiates a new MessageIn object
@@ -35,7 +35,7 @@ func NewMessageIn(eventType string, payload map[string]interface{}) *MessageIn {
 	this := MessageIn{}
 	this.EventType = eventType
 	this.Payload = payload
-	var payloadRetentionPeriod int32 = 90
+	var payloadRetentionPeriod int64 = 90
 	this.PayloadRetentionPeriod = &payloadRetentionPeriod
 	return &this
 }
@@ -45,7 +45,7 @@ func NewMessageIn(eventType string, payload map[string]interface{}) *MessageIn {
 // but it doesn't guarantee that properties required by API are set
 func NewMessageInWithDefaults() *MessageIn {
 	this := MessageIn{}
-	var payloadRetentionPeriod int32 = 90
+	var payloadRetentionPeriod int64 = 90
 	this.PayloadRetentionPeriod = &payloadRetentionPeriod
 	return &this
 }
@@ -206,9 +206,9 @@ func (o *MessageIn) SetPayload(v map[string]interface{}) {
 }
 
 // GetPayloadRetentionPeriod returns the PayloadRetentionPeriod field value if set, zero value otherwise.
-func (o *MessageIn) GetPayloadRetentionPeriod() int32 {
+func (o *MessageIn) GetPayloadRetentionPeriod() int64 {
 	if o == nil || o.PayloadRetentionPeriod == nil {
-		var ret int32
+		var ret int64
 		return ret
 	}
 	return *o.PayloadRetentionPeriod
@@ -216,7 +216,7 @@ func (o *MessageIn) GetPayloadRetentionPeriod() int32 {
 
 // GetPayloadRetentionPeriodOk returns a tuple with the PayloadRetentionPeriod field value if set, nil otherwise
 // and a boolean to check if the value has been set.
-func (o *MessageIn) GetPayloadRetentionPeriodOk() (*int32, bool) {
+func (o *MessageIn) GetPayloadRetentionPeriodOk() (*int64, bool) {
 	if o == nil || o.PayloadRetentionPeriod == nil {
 		return nil, false
 	}
@@ -232,8 +232,8 @@ func (o *MessageIn) HasPayloadRetentionPeriod() bool {
 	return false
 }
 
-// SetPayloadRetentionPeriod gets a reference to the given int32 and assigns it to the PayloadRetentionPeriod field.
-func (o *MessageIn) SetPayloadRetentionPeriod(v int32) {
+// SetPayloadRetentionPeriod gets a reference to the given int64 and assigns it to the PayloadRetentionPeriod field.
+func (o *MessageIn) SetPayloadRetentionPeriod(v int64) {
 	o.PayloadRetentionPeriod = &v
 }
 
diff --git a/go/internal/openapi/model_message_out.go b/go/internal/openapi/model_message_out.go
index 7e4753387..df3ef90b6 100644
--- a/go/internal/openapi/model_message_out.go
+++ b/go/internal/openapi/model_message_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -21,7 +21,9 @@ type MessageOut struct {
 	Channels []string `json:"channels,omitempty"`
 	// Optional unique identifier for the message
 	EventId NullableString `json:"eventId,omitempty"`
+	// The event type's name
 	EventType string `json:"eventType"`
+	// The msg's ID
 	Id string `json:"id"`
 	Payload map[string]interface{} `json:"payload"`
 	Timestamp time.Time `json:"timestamp"`
diff --git a/go/internal/openapi/model_message_status.go b/go/internal/openapi/model_message_status.go
index 00213bbac..8ef03a9b2 100644
--- a/go/internal/openapi/model_message_status.go
+++ b/go/internal/openapi/model_message_status.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_one_time_token_in.go b/go/internal/openapi/model_one_time_token_in.go
new file mode 100644
index 000000000..8ac28897b
--- /dev/null
+++ b/go/internal/openapi/model_one_time_token_in.go
@@ -0,0 +1,108 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// OneTimeTokenIn struct for OneTimeTokenIn
+type OneTimeTokenIn struct {
+	OneTimeToken string `json:"oneTimeToken"`
+}
+
+// NewOneTimeTokenIn instantiates a new OneTimeTokenIn object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewOneTimeTokenIn(oneTimeToken string) *OneTimeTokenIn {
+	this := OneTimeTokenIn{}
+	this.OneTimeToken = oneTimeToken
+	return &this
+}
+
+// NewOneTimeTokenInWithDefaults instantiates a new OneTimeTokenIn object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewOneTimeTokenInWithDefaults() *OneTimeTokenIn {
+	this := OneTimeTokenIn{}
+	return &this
+}
+
+// GetOneTimeToken returns the OneTimeToken field value
+func (o *OneTimeTokenIn) GetOneTimeToken() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.OneTimeToken
+}
+
+// GetOneTimeTokenOk returns a tuple with the OneTimeToken field value
+// and a boolean to check if the value has been set.
+func (o *OneTimeTokenIn) GetOneTimeTokenOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.OneTimeToken, true
+}
+
+// SetOneTimeToken sets field value
+func (o *OneTimeTokenIn) SetOneTimeToken(v string) {
+	o.OneTimeToken = v
+}
+
+func (o OneTimeTokenIn) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["oneTimeToken"] = o.OneTimeToken
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableOneTimeTokenIn struct {
+	value *OneTimeTokenIn
+	isSet bool
+}
+
+func (v NullableOneTimeTokenIn) Get() *OneTimeTokenIn {
+	return v.value
+}
+
+func (v *NullableOneTimeTokenIn) Set(val *OneTimeTokenIn) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableOneTimeTokenIn) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableOneTimeTokenIn) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableOneTimeTokenIn(val *OneTimeTokenIn) *NullableOneTimeTokenIn {
+	return &NullableOneTimeTokenIn{value: val, isSet: true}
+}
+
+func (v NullableOneTimeTokenIn) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableOneTimeTokenIn) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_one_time_token_out.go b/go/internal/openapi/model_one_time_token_out.go
new file mode 100644
index 000000000..f1ab2016d
--- /dev/null
+++ b/go/internal/openapi/model_one_time_token_out.go
@@ -0,0 +1,108 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// OneTimeTokenOut struct for OneTimeTokenOut
+type OneTimeTokenOut struct {
+	Token string `json:"token"`
+}
+
+// NewOneTimeTokenOut instantiates a new OneTimeTokenOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewOneTimeTokenOut(token string) *OneTimeTokenOut {
+	this := OneTimeTokenOut{}
+	this.Token = token
+	return &this
+}
+
+// NewOneTimeTokenOutWithDefaults instantiates a new OneTimeTokenOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewOneTimeTokenOutWithDefaults() *OneTimeTokenOut {
+	this := OneTimeTokenOut{}
+	return &this
+}
+
+// GetToken returns the Token field value
+func (o *OneTimeTokenOut) GetToken() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Token
+}
+
+// GetTokenOk returns a tuple with the Token field value
+// and a boolean to check if the value has been set.
+func (o *OneTimeTokenOut) GetTokenOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Token, true
+}
+
+// SetToken sets field value
+func (o *OneTimeTokenOut) SetToken(v string) {
+	o.Token = v
+}
+
+func (o OneTimeTokenOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["token"] = o.Token
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableOneTimeTokenOut struct {
+	value *OneTimeTokenOut
+	isSet bool
+}
+
+func (v NullableOneTimeTokenOut) Get() *OneTimeTokenOut {
+	return v.value
+}
+
+func (v *NullableOneTimeTokenOut) Set(val *OneTimeTokenOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableOneTimeTokenOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableOneTimeTokenOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableOneTimeTokenOut(val *OneTimeTokenOut) *NullableOneTimeTokenOut {
+	return &NullableOneTimeTokenOut{value: val, isSet: true}
+}
+
+func (v NullableOneTimeTokenOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableOneTimeTokenOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_ordering.go b/go/internal/openapi/model_ordering.go
index 5cd1cbe0d..691972606 100644
--- a/go/internal/openapi/model_ordering.go
+++ b/go/internal/openapi/model_ordering.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_recover_in.go b/go/internal/openapi/model_recover_in.go
index 762adea27..70c470c9e 100644
--- a/go/internal/openapi/model_recover_in.go
+++ b/go/internal/openapi/model_recover_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_recover_out.go b/go/internal/openapi/model_recover_out.go
new file mode 100644
index 000000000..1a49b0c08
--- /dev/null
+++ b/go/internal/openapi/model_recover_out.go
@@ -0,0 +1,166 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// RecoverOut struct for RecoverOut
+type RecoverOut struct {
+	Id string `json:"id"`
+	Status BackgroundTaskStatus `json:"status"`
+	Task BackgroundTaskType `json:"task"`
+}
+
+// NewRecoverOut instantiates a new RecoverOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewRecoverOut(id string, status BackgroundTaskStatus, task BackgroundTaskType) *RecoverOut {
+	this := RecoverOut{}
+	this.Id = id
+	this.Status = status
+	this.Task = task
+	return &this
+}
+
+// NewRecoverOutWithDefaults instantiates a new RecoverOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewRecoverOutWithDefaults() *RecoverOut {
+	this := RecoverOut{}
+	return &this
+}
+
+// GetId returns the Id field value
+func (o *RecoverOut) GetId() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Id
+}
+
+// GetIdOk returns a tuple with the Id field value
+// and a boolean to check if the value has been set.
+func (o *RecoverOut) GetIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Id, true
+}
+
+// SetId sets field value
+func (o *RecoverOut) SetId(v string) {
+	o.Id = v
+}
+
+// GetStatus returns the Status field value
+func (o *RecoverOut) GetStatus() BackgroundTaskStatus {
+	if o == nil {
+		var ret BackgroundTaskStatus
+		return ret
+	}
+
+	return o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value
+// and a boolean to check if the value has been set.
+func (o *RecoverOut) GetStatusOk() (*BackgroundTaskStatus, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Status, true
+}
+
+// SetStatus sets field value
+func (o *RecoverOut) SetStatus(v BackgroundTaskStatus) {
+	o.Status = v
+}
+
+// GetTask returns the Task field value
+func (o *RecoverOut) GetTask() BackgroundTaskType {
+	if o == nil {
+		var ret BackgroundTaskType
+		return ret
+	}
+
+	return o.Task
+}
+
+// GetTaskOk returns a tuple with the Task field value
+// and a boolean to check if the value has been set.
+func (o *RecoverOut) GetTaskOk() (*BackgroundTaskType, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Task, true
+}
+
+// SetTask sets field value
+func (o *RecoverOut) SetTask(v BackgroundTaskType) {
+	o.Task = v
+}
+
+func (o RecoverOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["id"] = o.Id
+	}
+	if true {
+		toSerialize["status"] = o.Status
+	}
+	if true {
+		toSerialize["task"] = o.Task
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableRecoverOut struct {
+	value *RecoverOut
+	isSet bool
+}
+
+func (v NullableRecoverOut) Get() *RecoverOut {
+	return v.value
+}
+
+func (v *NullableRecoverOut) Set(val *RecoverOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableRecoverOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableRecoverOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableRecoverOut(val *RecoverOut) *NullableRecoverOut {
+	return &NullableRecoverOut{value: val, isSet: true}
+}
+
+func (v NullableRecoverOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableRecoverOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_replay_in.go b/go/internal/openapi/model_replay_in.go
index ef9be9b1b..78c08ce15 100644
--- a/go/internal/openapi/model_replay_in.go
+++ b/go/internal/openapi/model_replay_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_replay_out.go b/go/internal/openapi/model_replay_out.go
new file mode 100644
index 000000000..59dc1bb8a
--- /dev/null
+++ b/go/internal/openapi/model_replay_out.go
@@ -0,0 +1,166 @@
+/*
+ * Svix API
+ *
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * API version: 1.4.1
+ */
+
+// Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
+
+package openapi
+
+import (
+	"encoding/json"
+)
+
+// ReplayOut struct for ReplayOut
+type ReplayOut struct {
+	Id string `json:"id"`
+	Status BackgroundTaskStatus `json:"status"`
+	Task BackgroundTaskType `json:"task"`
+}
+
+// NewReplayOut instantiates a new ReplayOut object
+// This constructor will assign default values to properties that have it defined,
+// and makes sure properties required by API are set, but the set of arguments
+// will change when the set of required properties is changed
+func NewReplayOut(id string, status BackgroundTaskStatus, task BackgroundTaskType) *ReplayOut {
+	this := ReplayOut{}
+	this.Id = id
+	this.Status = status
+	this.Task = task
+	return &this
+}
+
+// NewReplayOutWithDefaults instantiates a new ReplayOut object
+// This constructor will only assign default values to properties that have it defined,
+// but it doesn't guarantee that properties required by API are set
+func NewReplayOutWithDefaults() *ReplayOut {
+	this := ReplayOut{}
+	return &this
+}
+
+// GetId returns the Id field value
+func (o *ReplayOut) GetId() string {
+	if o == nil {
+		var ret string
+		return ret
+	}
+
+	return o.Id
+}
+
+// GetIdOk returns a tuple with the Id field value
+// and a boolean to check if the value has been set.
+func (o *ReplayOut) GetIdOk() (*string, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Id, true
+}
+
+// SetId sets field value
+func (o *ReplayOut) SetId(v string) {
+	o.Id = v
+}
+
+// GetStatus returns the Status field value
+func (o *ReplayOut) GetStatus() BackgroundTaskStatus {
+	if o == nil {
+		var ret BackgroundTaskStatus
+		return ret
+	}
+
+	return o.Status
+}
+
+// GetStatusOk returns a tuple with the Status field value
+// and a boolean to check if the value has been set.
+func (o *ReplayOut) GetStatusOk() (*BackgroundTaskStatus, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Status, true
+}
+
+// SetStatus sets field value
+func (o *ReplayOut) SetStatus(v BackgroundTaskStatus) {
+	o.Status = v
+}
+
+// GetTask returns the Task field value
+func (o *ReplayOut) GetTask() BackgroundTaskType {
+	if o == nil {
+		var ret BackgroundTaskType
+		return ret
+	}
+
+	return o.Task
+}
+
+// GetTaskOk returns a tuple with the Task field value
+// and a boolean to check if the value has been set.
+func (o *ReplayOut) GetTaskOk() (*BackgroundTaskType, bool) {
+	if o == nil  {
+		return nil, false
+	}
+	return &o.Task, true
+}
+
+// SetTask sets field value
+func (o *ReplayOut) SetTask(v BackgroundTaskType) {
+	o.Task = v
+}
+
+func (o ReplayOut) MarshalJSON() ([]byte, error) {
+	toSerialize := map[string]interface{}{}
+	if true {
+		toSerialize["id"] = o.Id
+	}
+	if true {
+		toSerialize["status"] = o.Status
+	}
+	if true {
+		toSerialize["task"] = o.Task
+	}
+	return json.Marshal(toSerialize)
+}
+
+type NullableReplayOut struct {
+	value *ReplayOut
+	isSet bool
+}
+
+func (v NullableReplayOut) Get() *ReplayOut {
+	return v.value
+}
+
+func (v *NullableReplayOut) Set(val *ReplayOut) {
+	v.value = val
+	v.isSet = true
+}
+
+func (v NullableReplayOut) IsSet() bool {
+	return v.isSet
+}
+
+func (v *NullableReplayOut) Unset() {
+	v.value = nil
+	v.isSet = false
+}
+
+func NewNullableReplayOut(val *ReplayOut) *NullableReplayOut {
+	return &NullableReplayOut{value: val, isSet: true}
+}
+
+func (v NullableReplayOut) MarshalJSON() ([]byte, error) {
+	return json.Marshal(v.value)
+}
+
+func (v *NullableReplayOut) UnmarshalJSON(src []byte) error {
+	v.isSet = true
+	return json.Unmarshal(src, &v.value)
+}
+
+
diff --git a/go/internal/openapi/model_settings_in.go b/go/internal/openapi/model_settings_in.go
index 1091f098f..df4966979 100644
--- a/go/internal/openapi/model_settings_in.go
+++ b/go/internal/openapi/model_settings_in.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_settings_out.go b/go/internal/openapi/model_settings_out.go
index f32b6d90e..371660b34 100644
--- a/go/internal/openapi/model_settings_out.go
+++ b/go/internal/openapi/model_settings_out.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_statistics_period.go b/go/internal/openapi/model_statistics_period.go
index 83b8edfd3..4435e634d 100644
--- a/go/internal/openapi/model_statistics_period.go
+++ b/go/internal/openapi/model_statistics_period.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_status_code_class.go b/go/internal/openapi/model_status_code_class.go
index 835bf878b..47f17e41b 100644
--- a/go/internal/openapi/model_status_code_class.go
+++ b/go/internal/openapi/model_status_code_class.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/model_transformation_http_method.go b/go/internal/openapi/model_transformation_http_method.go
index 225e39f5b..e96782e27 100644
--- a/go/internal/openapi/model_transformation_http_method.go
+++ b/go/internal/openapi/model_transformation_http_method.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -15,18 +15,18 @@ import (
 	"fmt"
 )
 
-// TransformationHttpMethod An enumeration.
+// TransformationHttpMethod the model 'TransformationHttpMethod'
 type TransformationHttpMethod string
 
 // List of TransformationHttpMethod
 const (
-	TRANSFORMATIONHTTPMETHOD_PUT TransformationHttpMethod = "PUT"
 	TRANSFORMATIONHTTPMETHOD_POST TransformationHttpMethod = "POST"
+	TRANSFORMATIONHTTPMETHOD_PUT TransformationHttpMethod = "PUT"
 )
 
 var allowedTransformationHttpMethodEnumValues = []TransformationHttpMethod{
-	"PUT",
 	"POST",
+	"PUT",
 }
 
 func (v *TransformationHttpMethod) UnmarshalJSON(src []byte) error {
diff --git a/go/internal/openapi/model_validation_error.go b/go/internal/openapi/model_validation_error.go
index f26be7a0b..9f70d041c 100644
--- a/go/internal/openapi/model_validation_error.go
+++ b/go/internal/openapi/model_validation_error.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
@@ -14,10 +14,13 @@ import (
 	"encoding/json"
 )
 
-// ValidationError struct for ValidationError
+// ValidationError Validation errors have their own schema to provide context for invalid requests eg. mismatched types and out of bounds values. There may be any number of these per 422 UNPROCESSABLE ENTITY error.
 type ValidationError struct {
+	// The location as a [`Vec`] of [`String`]s -- often in the form `[\"body\", \"field_name\"]`, `[\"query\", \"field_name\"]`, etc. They may, however, be arbitarily deep.
 	Loc []string `json:"loc"`
+	// The message accompanying the validation error item.
 	Msg string `json:"msg"`
+	// The type of error, often \"type_error\" or \"value_error\", but sometimes with more context like as \"value_error.number.not_ge\"
 	Type string `json:"type"`
 }
 
diff --git a/go/internal/openapi/response.go b/go/internal/openapi/response.go
index 8a1137e31..f05cf28d4 100644
--- a/go/internal/openapi/response.go
+++ b/go/internal/openapi/response.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/openapi/utils.go b/go/internal/openapi/utils.go
index 93e23fd55..6b9e8e5a4 100644
--- a/go/internal/openapi/utils.go
+++ b/go/internal/openapi/utils.go
@@ -1,9 +1,9 @@
 /*
  * Svix API
  *
- * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
  *
- * API version: 1.4
+ * API version: 1.4.1
  */
 
 // Code generated by OpenAPI Generator (https://openapi-generator.tech); DO NOT EDIT.
diff --git a/go/internal/version/version.go b/go/internal/version/version.go
index 06f1ddf5b..38ea1d690 100644
--- a/go/internal/version/version.go
+++ b/go/internal/version/version.go
@@ -1,3 +1,3 @@
 package version
 
-const Version = "0.81.0"
+const Version = "1.4.12"
diff --git a/go/message.go b/go/message.go
index d41807ffc..bdb8ecdfd 100644
--- a/go/message.go
+++ b/go/message.go
@@ -27,7 +27,7 @@ type MessageListOptions struct {
 }
 
 func (m *Message) List(ctx context.Context, appId string, options *MessageListOptions) (*ListResponseMessageOut, error) {
-	req := m.api.MessageApi.ListMessagesApiV1AppAppIdMsgGet(ctx, appId)
+	req := m.api.MessageApi.V1MessageList(ctx, appId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -61,7 +61,7 @@ func (m *Message) Create(ctx context.Context, appId string, messageIn *MessageIn
 }
 
 func (m *Message) CreateWithOptions(ctx context.Context, appId string, messageIn *MessageIn, options *PostOptions) (*MessageOut, error) {
-	req := m.api.MessageApi.CreateMessageApiV1AppAppIdMsgPost(ctx, appId)
+	req := m.api.MessageApi.V1MessageCreate(ctx, appId)
 	req = req.MessageIn(openapi.MessageIn(*messageIn))
 	if options != nil {
 		if options.IdempotencyKey != nil {
@@ -77,7 +77,7 @@ func (m *Message) CreateWithOptions(ctx context.Context, appId string, messageIn
 }
 
 func (m *Message) Get(ctx context.Context, appId string, msgId string) (*MessageOut, error) {
-	req := m.api.MessageApi.GetMessageApiV1AppAppIdMsgMsgIdGet(ctx, msgId, appId)
+	req := m.api.MessageApi.V1MessageGet(ctx, appId, msgId)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -87,7 +87,7 @@ func (m *Message) Get(ctx context.Context, appId string, msgId string) (*Message
 }
 
 func (m *Message) ExpungeContent(ctx context.Context, appId string, msgId string) error {
-	req := m.api.MessageApi.ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete(ctx, msgId, appId)
+	req := m.api.MessageApi.V1MessageExpungeContent(ctx, appId, msgId)
 	res, err := req.Execute()
 	return wrapError(err, res)
 }
diff --git a/go/messageattempt.go b/go/messageattempt.go
index 750b9a1ec..71bfa4d72 100644
--- a/go/messageattempt.go
+++ b/go/messageattempt.go
@@ -18,8 +18,11 @@ type (
 	ListResponseMessageAttemptOut         openapi.ListResponseMessageAttemptOut
 	MessageAttemptOut                     openapi.MessageAttemptOut
 	ListResponseEndpointMessageOut        openapi.ListResponseEndpointMessageOut
+	EndpointMessageOut                    openapi.EndpointMessageOut
 	ListResponseMessageEndpointOut        openapi.ListResponseMessageEndpointOut
+	MessageEndpointOut                    openapi.MessageEndpointOut
 	ListResponseMessageAttemptEndpointOut openapi.ListResponseMessageAttemptEndpointOut
+	MessageAttemptEndpointOut             openapi.MessageAttemptEndpointOut
 )
 
 type MessageAttemptListOptions struct {
@@ -31,6 +34,8 @@ type MessageAttemptListOptions struct {
 	After           *time.Time
 	StatusCodeClass *StatusCodeClass
 	Channel         *string
+	EndpointId      *string
+	WithContent     *bool
 }
 
 // Deprecated: use `ListByMsg` or `ListByEndpoint` instead
@@ -39,7 +44,7 @@ func (m *MessageAttempt) List(ctx context.Context, appId string, msgId string, o
 }
 
 func (m *MessageAttempt) ListByMsg(ctx context.Context, appId string, msgId string, options *MessageAttemptListOptions) (*ListResponseMessageAttemptOut, error) {
-	req := m.api.MessageAttemptApi.ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet(ctx, appId, msgId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptListByMsg(ctx, appId, msgId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -65,6 +70,9 @@ func (m *MessageAttempt) ListByMsg(ctx context.Context, appId string, msgId stri
 		if options.Channel != nil {
 			req = req.Channel(*options.Channel)
 		}
+		if options.EndpointId != nil {
+			req = req.EndpointId(*options.EndpointId)
+		}
 	}
 	out, res, err := req.Execute()
 	if err != nil {
@@ -75,7 +83,7 @@ func (m *MessageAttempt) ListByMsg(ctx context.Context, appId string, msgId stri
 }
 
 func (m *MessageAttempt) ListByEndpoint(ctx context.Context, appId string, endpointId string, options *MessageAttemptListOptions) (*ListResponseMessageAttemptOut, error) {
-	req := m.api.MessageAttemptApi.ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet(ctx, appId, endpointId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptListByEndpoint(ctx, appId, endpointId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -111,7 +119,7 @@ func (m *MessageAttempt) ListByEndpoint(ctx context.Context, appId string, endpo
 }
 
 func (m *MessageAttempt) Get(ctx context.Context, appId string, msgId string, attemptID string) (*MessageAttemptOut, error) {
-	req := m.api.MessageAttemptApi.GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet(ctx, attemptID, msgId, appId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptGet(ctx, appId, msgId, attemptID)
 	out, res, err := req.Execute()
 	if err != nil {
 		return nil, wrapError(err, res)
@@ -125,7 +133,7 @@ func (m *MessageAttempt) Resend(ctx context.Context, appId string, msgId string,
 }
 
 func (m *MessageAttempt) ResendWithOptions(ctx context.Context, appId string, msgId string, endpointId string, options *PostOptions) error {
-	req := m.api.MessageAttemptApi.ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost(ctx, endpointId, msgId, appId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptResend(ctx, appId, msgId, endpointId)
 	if options != nil {
 		if options.IdempotencyKey != nil {
 			req = req.IdempotencyKey(*options.IdempotencyKey)
@@ -136,7 +144,7 @@ func (m *MessageAttempt) ResendWithOptions(ctx context.Context, appId string, ms
 }
 
 func (m *MessageAttempt) ListAttemptedMessages(ctx context.Context, appId string, endpointId string, options *MessageAttemptListOptions) (*ListResponseEndpointMessageOut, error) {
-	req := m.api.MessageAttemptApi.ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet(ctx, endpointId, appId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptListAttemptedMessages(ctx, appId, endpointId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -156,6 +164,9 @@ func (m *MessageAttempt) ListAttemptedMessages(ctx context.Context, appId string
 		if options.Channel != nil {
 			req = req.Channel(*options.Channel)
 		}
+		if options.WithContent != nil {
+			req = req.WithContent(*options.WithContent)
+		}
 	}
 	out, res, err := req.Execute()
 	if err != nil {
@@ -166,7 +177,7 @@ func (m *MessageAttempt) ListAttemptedMessages(ctx context.Context, appId string
 }
 
 func (m *MessageAttempt) ListAttemptedDestinations(ctx context.Context, appId string, msgId string, options *MessageAttemptListOptions) (*ListResponseMessageEndpointOut, error) {
-	req := m.api.MessageAttemptApi.ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet(ctx, msgId, appId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptListAttemptedDestinations(ctx, appId, msgId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -184,7 +195,7 @@ func (m *MessageAttempt) ListAttemptedDestinations(ctx context.Context, appId st
 }
 
 func (m *MessageAttempt) ListAttemptsForEndpoint(ctx context.Context, appId string, msgId string, endpointId string, options *MessageAttemptListOptions) (*ListResponseMessageAttemptEndpointOut, error) {
-	req := m.api.MessageAttemptApi.ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet(ctx, msgId, appId, endpointId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptListByEndpointDeprecated(ctx, appId, msgId, endpointId)
 	if options != nil {
 		if options.Iterator != nil {
 			req = req.Iterator(*options.Iterator)
@@ -217,7 +228,7 @@ func (m *MessageAttempt) ListAttemptsForEndpoint(ctx context.Context, appId stri
 }
 
 func (m *MessageAttempt) ExpungeContent(ctx context.Context, appId string, msgId string, attemptId string) error {
-	req := m.api.MessageAttemptApi.ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete(ctx, attemptId, msgId, appId)
+	req := m.api.MessageAttemptApi.V1MessageAttemptExpungeContent(ctx, appId, msgId, attemptId)
 	res, err := req.Execute()
 	return wrapError(err, res)
 }
diff --git a/java/README.md b/java/README.md
index 007c64aa7..da274faf1 100644
--- a/java/README.md
+++ b/java/README.md
@@ -51,7 +51,7 @@ Add this dependency to your project's POM:
 <dependency>
   <groupId>com.svix</groupId>
   <artifactId>svix</artifactId>
-  <version>0.81.0</version>
+  <version>1.4.12</version>
   <scope>compile</scope>
 </dependency>
 ```
@@ -61,7 +61,7 @@ Add this dependency to your project's POM:
 Add this dependency to your project's build file:
 
 ```groovy
-implementation "com.svix:svix:0.81.0"
+implementation "com.svix:svix:1.4.12"
 ```
 
 # Development
diff --git a/java/gradle.properties b/java/gradle.properties
index 63cf72285..ce41d1b64 100644
--- a/java/gradle.properties
+++ b/java/gradle.properties
@@ -1,5 +1,5 @@
 GROUP=com.svix
-VERSION_NAME=0.81.0
+VERSION_NAME=1.4.12
 
 POM_URL=https://github.com/svix/svix-webhooks
 POM_SCM_URL=git@github.com:svix/svix-webhooks.git
diff --git a/java/lib/generated/openapi/.openapi-generator-ignore b/java/lib/generated/openapi/.openapi-generator-ignore
new file mode 100644
index 000000000..352c7e23e
--- /dev/null
+++ b/java/lib/generated/openapi/.openapi-generator-ignore
@@ -0,0 +1,25 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
+
+/src/main/java/com/svix/internal/JSON.java
diff --git a/java/lib/generated/openapi/src/main/java/com/svix/internal/JSON.java b/java/lib/generated/openapi/src/main/java/com/svix/internal/JSON.java
new file mode 100644
index 000000000..b44c65107
--- /dev/null
+++ b/java/lib/generated/openapi/src/main/java/com/svix/internal/JSON.java
@@ -0,0 +1,406 @@
+/*
+ * Svix API
+ * Welcome to the Svix API documentation!  Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)  # Introduction  This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).  ## Main concepts  In Svix you have four important entities you will be interacting with:  - `messages`: these are the webhooks being sent. They can have contents and a few other properties. - `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform. - `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type). - `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.   ## Authentication  Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.  <SecurityDefinitions />   ## Code samples  The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).   ## Idempotency  Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.  To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.  Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.  Please note that idempotency is only supported for `POST` requests.   ## Cross-Origin Resource Sharing  This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site. 
+ *
+ * The version of the OpenAPI document: 1.4
+ * 
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ *
+ * @generated
+ */
+
+
+package com.svix.internal;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonParseException;
+import com.google.gson.TypeAdapter;
+import com.google.gson.internal.bind.util.ISO8601Utils;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonWriter;
+import com.google.gson.JsonElement;
+import io.gsonfire.GsonFireBuilder;
+import io.gsonfire.TypeSelector;
+import org.threeten.bp.LocalDate;
+import org.threeten.bp.OffsetDateTime;
+import org.threeten.bp.format.DateTimeFormatter;
+
+import com.svix.models.*;
+import okio.ByteString;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.lang.reflect.Type;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.ParsePosition;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+import java.util.HashMap;
+
+public class JSON {
+    private Gson gson;
+    private boolean isLenientOnJson = false;
+    private DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
+    private SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
+    private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter();
+    private LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
+    private ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter();
+
+    @SuppressWarnings("unchecked")
+    public static GsonBuilder createGson() {
+        GsonFireBuilder fireBuilder = new GsonFireBuilder()
+        ;
+        GsonBuilder builder = fireBuilder.createGsonBuilder();
+        return builder;
+    }
+
+    private static String getDiscriminatorValue(JsonElement readElement, String discriminatorField) {
+        JsonElement element = readElement.getAsJsonObject().get(discriminatorField);
+        if (null == element) {
+            throw new IllegalArgumentException("missing discriminator field: <" + discriminatorField + ">");
+        }
+        return element.getAsString();
+    }
+
+    /**
+     * Returns the Java class that implements the OpenAPI schema for the specified discriminator value.
+     *
+     * @param classByDiscriminatorValue The map of discriminator values to Java classes.
+     * @param discriminatorValue The value of the OpenAPI discriminator in the input data.
+     * @return The Java class that implements the OpenAPI schema
+     */
+    private static Class getClassByDiscriminator(Map classByDiscriminatorValue, String discriminatorValue) {
+        Class clazz = (Class) classByDiscriminatorValue.get(discriminatorValue);
+        if (null == clazz) {
+            throw new IllegalArgumentException("cannot determine model class of name: <" + discriminatorValue + ">");
+        }
+        return clazz;
+    }
+
+    public JSON() {
+        gson = createGson()
+            .registerTypeAdapter(Date.class, dateTypeAdapter)
+            .registerTypeAdapter(java.sql.Date.class, sqlDateTypeAdapter)
+            .registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter)
+            .registerTypeAdapter(LocalDate.class, localDateTypeAdapter)
+            .registerTypeAdapter(byte[].class, byteArrayAdapter)
+            .serializeNulls()
+            .create();
+    }
+
+    /**
+     * Get Gson.
+     *
+     * @return Gson
+     */
+    public Gson getGson() {
+        return gson;
+    }
+
+    /**
+     * Set Gson.
+     *
+     * @param gson Gson
+     * @return JSON
+     */
+    public JSON setGson(Gson gson) {
+        this.gson = gson;
+        return this;
+    }
+
+    public JSON setLenientOnJson(boolean lenientOnJson) {
+        isLenientOnJson = lenientOnJson;
+        return this;
+    }
+
+    /**
+     * Serialize the given Java object into JSON string.
+     *
+     * @param obj Object
+     * @return String representation of the JSON
+     */
+    public String serialize(Object obj) {
+        return gson.toJson(obj);
+    }
+
+    /**
+     * Deserialize the given JSON string to Java object.
+     *
+     * @param <T>        Type
+     * @param body       The JSON string
+     * @param returnType The type to deserialize into
+     * @return The deserialized Java object
+     */
+    @SuppressWarnings("unchecked")
+    public <T> T deserialize(String body, Type returnType) {
+        try {
+            if (isLenientOnJson) {
+                JsonReader jsonReader = new JsonReader(new StringReader(body));
+                // see https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonReader.html#setLenient(boolean)
+                jsonReader.setLenient(true);
+                return gson.fromJson(jsonReader, returnType);
+            } else {
+                return gson.fromJson(body, returnType);
+            }
+        } catch (JsonParseException e) {
+            // Fallback processing when failed to parse JSON form response body:
+            // return the response body string directly for the String return type;
+            if (returnType.equals(String.class)) {
+                return (T) body;
+            } else {
+                throw (e);
+            }
+        }
+    }
+
+    /**
+     * Gson TypeAdapter for Byte Array type
+     */
+    public class ByteArrayAdapter extends TypeAdapter<byte[]> {
+
+        @Override
+        public void write(JsonWriter out, byte[] value) throws IOException {
+            if (value == null) {
+                out.nullValue();
+            } else {
+                out.value(ByteString.of(value).base64());
+            }
+        }
+
+        @Override
+        public byte[] read(JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    String bytesAsBase64 = in.nextString();
+                    ByteString byteString = ByteString.decodeBase64(bytesAsBase64);
+                    return byteString.toByteArray();
+            }
+        }
+    }
+
+    /**
+     * Gson TypeAdapter for JSR310 OffsetDateTime type
+     */
+    public static class OffsetDateTimeTypeAdapter extends TypeAdapter<OffsetDateTime> {
+
+        private DateTimeFormatter formatter;
+
+        public OffsetDateTimeTypeAdapter() {
+            this(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
+        }
+
+        public OffsetDateTimeTypeAdapter(DateTimeFormatter formatter) {
+            this.formatter = formatter;
+        }
+
+        public void setFormat(DateTimeFormatter dateFormat) {
+            this.formatter = dateFormat;
+        }
+
+        @Override
+        public void write(JsonWriter out, OffsetDateTime date) throws IOException {
+            if (date == null) {
+                out.nullValue();
+            } else {
+                out.value(formatter.format(date));
+            }
+        }
+
+        @Override
+        public OffsetDateTime read(JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    String date = in.nextString();
+                    if (date.endsWith("+0000")) {
+                        date = date.substring(0, date.length()-5) + "Z";
+                    }
+                    return OffsetDateTime.parse(date, formatter);
+            }
+        }
+    }
+
+    /**
+     * Gson TypeAdapter for JSR310 LocalDate type
+     */
+    public class LocalDateTypeAdapter extends TypeAdapter<LocalDate> {
+
+        private DateTimeFormatter formatter;
+
+        public LocalDateTypeAdapter() {
+            this(DateTimeFormatter.ISO_LOCAL_DATE);
+        }
+
+        public LocalDateTypeAdapter(DateTimeFormatter formatter) {
+            this.formatter = formatter;
+        }
+
+        public void setFormat(DateTimeFormatter dateFormat) {
+            this.formatter = dateFormat;
+        }
+
+        @Override
+        public void write(JsonWriter out, LocalDate date) throws IOException {
+            if (date == null) {
+                out.nullValue();
+            } else {
+                out.value(formatter.format(date));
+            }
+        }
+
+        @Override
+        public LocalDate read(JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    String date = in.nextString();
+                    return LocalDate.parse(date, formatter);
+            }
+        }
+    }
+
+    public JSON setOffsetDateTimeFormat(DateTimeFormatter dateFormat) {
+        offsetDateTimeTypeAdapter.setFormat(dateFormat);
+        return this;
+    }
+
+    public JSON setLocalDateFormat(DateTimeFormatter dateFormat) {
+        localDateTypeAdapter.setFormat(dateFormat);
+        return this;
+    }
+
+    /**
+     * Gson TypeAdapter for java.sql.Date type
+     * If the dateFormat is null, a simple "yyyy-MM-dd" format will be used
+     * (more efficient than SimpleDateFormat).
+     */
+    public static class SqlDateTypeAdapter extends TypeAdapter<java.sql.Date> {
+
+        private DateFormat dateFormat;
+
+        public SqlDateTypeAdapter() {}
+
+        public SqlDateTypeAdapter(DateFormat dateFormat) {
+            this.dateFormat = dateFormat;
+        }
+
+        public void setFormat(DateFormat dateFormat) {
+            this.dateFormat = dateFormat;
+        }
+
+        @Override
+        public void write(JsonWriter out, java.sql.Date date) throws IOException {
+            if (date == null) {
+                out.nullValue();
+            } else {
+                String value;
+                if (dateFormat != null) {
+                    value = dateFormat.format(date);
+                } else {
+                    value = date.toString();
+                }
+                out.value(value);
+            }
+        }
+
+        @Override
+        public java.sql.Date read(JsonReader in) throws IOException {
+            switch (in.peek()) {
+                case NULL:
+                    in.nextNull();
+                    return null;
+                default:
+                    String date = in.nextString();
+                    try {
+                        if (dateFormat != null) {
+                            return new java.sql.Date(dateFormat.parse(date).getTime());
+                        }
+                        return new java.sql.Date(ISO8601Utils.parse(date, new ParsePosition(0)).getTime());
+                    } catch (ParseException e) {
+                        throw new JsonParseException(e);
+                    }
+            }
+        }
+    }
+
+    /**
+     * Gson TypeAdapter for java.util.Date type
+     * If the dateFormat is null, ISO8601Utils will be used.
+     */
+    public static class DateTypeAdapter extends TypeAdapter<Date> {
+
+        private DateFormat dateFormat;
+
+        public DateTypeAdapter() {}
+
+        public DateTypeAdapter(DateFormat dateFormat) {
+            this.dateFormat = dateFormat;
+        }
+
+        public void setFormat(DateFormat dateFormat) {
+            this.dateFormat = dateFormat;
+        }
+
+        @Override
+        public void write(JsonWriter out, Date date) throws IOException {
+            if (date == null) {
+                out.nullValue();
+            } else {
+                String value;
+                if (dateFormat != null) {
+                    value = dateFormat.format(date);
+                } else {
+                    value = ISO8601Utils.format(date, true);
+                }
+                out.value(value);
+            }
+        }
+
+        @Override
+        public Date read(JsonReader in) throws IOException {
+            try {
+                switch (in.peek()) {
+                    case NULL:
+                        in.nextNull();
+                        return null;
+                    default:
+                        String date = in.nextString();
+                        try {
+                            if (dateFormat != null) {
+                                return dateFormat.parse(date);
+                            }
+                            return ISO8601Utils.parse(date, new ParsePosition(0));
+                        } catch (ParseException e) {
+                            throw new JsonParseException(e);
+                        }
+                }
+            } catch (IllegalArgumentException e) {
+                throw new JsonParseException(e);
+            }
+        }
+    }
+
+    public JSON setDateFormat(DateFormat dateFormat) {
+        dateTypeAdapter.setFormat(dateFormat);
+        return this;
+    }
+
+    public JSON setSqlDateFormat(DateFormat dateFormat) {
+        sqlDateTypeAdapter.setFormat(dateFormat);
+        return this;
+    }
+
+}
diff --git a/java/lib/src/main/java/com/svix/Application.java b/java/lib/src/main/java/com/svix/Application.java
index 806a19562..13d67bbc1 100644
--- a/java/lib/src/main/java/com/svix/Application.java
+++ b/java/lib/src/main/java/com/svix/Application.java
@@ -15,7 +15,7 @@ public final class Application {
 
 	public ListResponseApplicationOut list(final ApplicationListOptions options) throws ApiException {
 		try {
-			return api.listApplicationsApiV1AppGet(options.getIterator(), options.getLimit(), options.getOrder(), null);
+			return api.v1ApplicationList(options.getLimit(), options.getIterator(), options.getOrder());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -27,7 +27,7 @@ public ApplicationOut create(final ApplicationIn applicationIn) throws ApiExcept
 
 	public ApplicationOut create(final ApplicationIn applicationIn, final PostOptions options) throws ApiException {
 		try {
-			return api.createApplicationApiV1AppPost(applicationIn, null, options.getIdempotencyKey());
+			return api.v1ApplicationCreate(applicationIn, null, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -39,7 +39,7 @@ public ApplicationOut getOrCreate(final ApplicationIn applicationIn) throws ApiE
 
 	public ApplicationOut getOrCreate(final ApplicationIn applicationIn, final PostOptions options) throws ApiException {
 		try {
-			return api.createApplicationApiV1AppPost(applicationIn, true, options.getIdempotencyKey());
+			return api.v1ApplicationCreate(applicationIn, true, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -47,7 +47,7 @@ public ApplicationOut getOrCreate(final ApplicationIn applicationIn, final PostO
 
 	public ApplicationOut get(final String appId) throws ApiException {
 		try {
-			return api.getApplicationApiV1AppAppIdGet(appId, null);
+			return api.v1ApplicationGet(appId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -55,7 +55,7 @@ public ApplicationOut get(final String appId) throws ApiException {
 
 	public ApplicationOut update(final String appId, final ApplicationIn applicationIn) throws ApiException {
 		try {
-			return api.updateApplicationApiV1AppAppIdPut(appId, applicationIn, null);
+			return api.v1ApplicationUpdate(appId, applicationIn);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -63,7 +63,7 @@ public ApplicationOut update(final String appId, final ApplicationIn application
 
 	public void delete(final String appId) throws ApiException {
 		try {
-			api.deleteApplicationApiV1AppAppIdDelete(appId, null);
+			api.v1ApplicationDelete(appId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
diff --git a/java/lib/src/main/java/com/svix/Authentication.java b/java/lib/src/main/java/com/svix/Authentication.java
index 7413e9e2e..d9b17b065 100644
--- a/java/lib/src/main/java/com/svix/Authentication.java
+++ b/java/lib/src/main/java/com/svix/Authentication.java
@@ -19,7 +19,7 @@ public AppPortalAccessOut appPortalAccess(final String appId, final AppPortalAcc
 
 	public AppPortalAccessOut appPortalAccess(final String appId, final AppPortalAccessIn appPortalAccessIn, final PostOptions options) throws ApiException {
 		try {
-			return api.getAppPortalAccessApiV1AuthAppPortalAccessAppIdPost(appId, appPortalAccessIn, options.getIdempotencyKey());
+			return api.v1AuthenticationAppPortalAccess(appId, appPortalAccessIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -31,7 +31,7 @@ public DashboardAccessOut dashboardAccess(final String appId) throws ApiExceptio
 
 	public DashboardAccessOut dashboardAccess(final String appId, final PostOptions options) throws ApiException {
 		try {
-			return api.getDashboardAccessApiV1AuthDashboardAccessAppIdPost(appId, options.getIdempotencyKey());
+			return api.v1AuthenticationDashboardAccess(appId, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -43,7 +43,7 @@ public void logout() throws ApiException {
 
 	public void logout(final PostOptions options) throws ApiException {
 		try {
-			api.logoutApiV1AuthLogoutPost(options.getIdempotencyKey());
+			api.v1AuthenticationLogout(options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
diff --git a/java/lib/src/main/java/com/svix/BackgroundTask.java b/java/lib/src/main/java/com/svix/BackgroundTask.java
new file mode 100644
index 000000000..e2cef152a
--- /dev/null
+++ b/java/lib/src/main/java/com/svix/BackgroundTask.java
@@ -0,0 +1,32 @@
+package com.svix;
+
+import com.svix.exceptions.ApiException;
+import com.svix.internal.api.BackgroundTasksApi;
+import com.svix.models.BackgroundTaskOut;
+import com.svix.models.ListResponseBackgroundTaskOut;
+
+public final class BackgroundTask {
+    private final BackgroundTasksApi api;
+
+    BackgroundTask() {
+        api = new BackgroundTasksApi();
+    }
+
+    public ListResponseBackgroundTaskOut list(final BackgroundTaskListOptions options) throws ApiException {
+        try {
+            return api.listBackgroundTasks(options.getStatus(), options.getTask(), options.getLimit(),
+                    options.getIterator(),
+                    options.getOrder());
+        } catch (com.svix.internal.ApiException e) {
+            throw Utils.wrapInternalApiException(e);
+        }
+    }
+
+    public BackgroundTaskOut get(final String taskId) throws ApiException {
+        try {
+            return api.getBackgroundTask(taskId);
+        } catch (com.svix.internal.ApiException e) {
+            throw Utils.wrapInternalApiException(e);
+        }
+    }
+}
diff --git a/java/lib/src/main/java/com/svix/BackgroundTaskListOptions.java b/java/lib/src/main/java/com/svix/BackgroundTaskListOptions.java
new file mode 100644
index 000000000..46d7d9c1b
--- /dev/null
+++ b/java/lib/src/main/java/com/svix/BackgroundTaskListOptions.java
@@ -0,0 +1,35 @@
+package com.svix;
+
+import com.svix.models.BackgroundTaskStatus;
+import com.svix.models.BackgroundTaskType;
+import com.svix.models.Ordering;
+
+public class BackgroundTaskListOptions extends ListOptions {
+    private BackgroundTaskStatus status;
+    private BackgroundTaskType task;
+    private Ordering order;
+
+    public void setOrder(final Ordering order) {
+        this.order = order;
+    }
+
+    public Ordering getOrder() {
+        return this.order;
+    }
+
+    public void setStatus(final BackgroundTaskStatus status) {
+        this.status = status;
+    }
+
+    public BackgroundTaskStatus getStatus() {
+        return this.status;
+    }
+
+    public void setTask(final BackgroundTaskType task) {
+        this.task = task;
+    }
+
+    public BackgroundTaskType getTask() {
+        return this.task;
+    }
+}
diff --git a/java/lib/src/main/java/com/svix/Endpoint.java b/java/lib/src/main/java/com/svix/Endpoint.java
index 08671eb25..07060216d 100644
--- a/java/lib/src/main/java/com/svix/Endpoint.java
+++ b/java/lib/src/main/java/com/svix/Endpoint.java
@@ -12,7 +12,9 @@
 import com.svix.models.EndpointSecretRotateIn;
 import com.svix.models.EndpointTransformationIn;
 import com.svix.models.EndpointTransformationOut;
+import com.svix.models.EventExampleIn;
 import com.svix.models.ListResponseEndpointOut;
+import com.svix.models.MessageOut;
 import com.svix.models.RecoverIn;
 import com.svix.models.ReplayIn;
 import com.svix.models.EndpointStats;
@@ -26,7 +28,7 @@ public Endpoint() {
 
 	public ListResponseEndpointOut list(final String appId, final EndpointListOptions options) throws ApiException {
 		try {
-			return api.listEndpointsApiV1AppAppIdEndpointGet(appId, options.getIterator(), options.getLimit(), options.getOrder(), null);
+			return api.v1EndpointList(appId, options.getLimit(), options.getIterator(), options.getOrder());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -36,9 +38,10 @@ public EndpointOut create(final String appId, final EndpointIn endpointIn) throw
 		return this.create(appId, endpointIn, new PostOptions());
 	}
 
-	public EndpointOut create(final String appId, final EndpointIn endpointIn, final PostOptions options) throws ApiException {
+	public EndpointOut create(final String appId, final EndpointIn endpointIn, final PostOptions options)
+			throws ApiException {
 		try {
-			return api.createEndpointApiV1AppAppIdEndpointPost(appId, endpointIn, options.getIdempotencyKey());
+			return api.v1EndpointCreate(appId, endpointIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -46,15 +49,16 @@ public EndpointOut create(final String appId, final EndpointIn endpointIn, final
 
 	public EndpointOut get(final String appId, final String endpointId) throws ApiException {
 		try {
-			return api.getEndpointApiV1AppAppIdEndpointEndpointIdGet(endpointId, appId, null);
+			return api.v1EndpointGet(appId, endpointId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public EndpointOut update(final String appId, final String endpointId, final EndpointUpdate endpointUpdate) throws ApiException {
+	public EndpointOut update(final String appId, final String endpointId, final EndpointUpdate endpointUpdate)
+			throws ApiException {
 		try {
-			return api.updateEndpointApiV1AppAppIdEndpointEndpointIdPut(endpointId, appId, endpointUpdate, null);
+			return api.v1EndpointUpdate(appId, endpointId, endpointUpdate);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -62,7 +66,7 @@ public EndpointOut update(final String appId, final String endpointId, final End
 
 	public void delete(final String appId, final String endpointId) throws ApiException {
 		try {
-			api.deleteEndpointApiV1AppAppIdEndpointEndpointIdDelete(endpointId, appId, null);
+			api.v1EndpointDelete(appId, endpointId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -70,19 +74,21 @@ public void delete(final String appId, final String endpointId) throws ApiExcept
 
 	public EndpointSecretOut getSecret(final String appId, final String endpointId) throws ApiException {
 		try {
-			return api.getEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet(endpointId, appId, null);
+			return api.v1EndpointGetSecret(appId, endpointId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public void rotateSecret(final String appId, final String endpointId, final EndpointSecretRotateIn endpointSecretRotateIn) throws ApiException {
+	public void rotateSecret(final String appId, final String endpointId,
+			final EndpointSecretRotateIn endpointSecretRotateIn) throws ApiException {
 		this.rotateSecret(appId, endpointId, endpointSecretRotateIn, new PostOptions());
 	}
 
-	public void rotateSecret(final String appId, final String endpointId, final EndpointSecretRotateIn endpointSecretRotateIn, final PostOptions options) throws ApiException {
+	public void rotateSecret(final String appId, final String endpointId,
+			final EndpointSecretRotateIn endpointSecretRotateIn, final PostOptions options) throws ApiException {
 		try {
-			api.rotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost(endpointId, appId, endpointSecretRotateIn, options.getIdempotencyKey());
+			api.v1EndpointRotateSecret(appId, endpointId, endpointSecretRotateIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -92,9 +98,10 @@ public void recover(final String appId, final String endpointId, final RecoverIn
 		this.recover(appId, endpointId, recoverIn, new PostOptions());
 	}
 
-	public void recover(final String appId, final String endpointId, final RecoverIn recoverIn, final PostOptions options) throws ApiException {
+	public void recover(final String appId, final String endpointId, final RecoverIn recoverIn,
+			final PostOptions options) throws ApiException {
 		try {
-			api.recoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost(appId, endpointId, recoverIn, options.getIdempotencyKey());
+			api.v1EndpointRecover(appId, endpointId, recoverIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -102,59 +109,84 @@ public void recover(final String appId, final String endpointId, final RecoverIn
 
 	public EndpointHeadersOut getHeaders(final String appId, final String endpointId) throws ApiException {
 		try {
-			return api.getEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet(endpointId, appId, null);
+			return api.v1EndpointGetHeaders(appId, endpointId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public void updateHeaders(final String appId, final String endpointId, final EndpointHeadersIn endpointHeadersIn) throws ApiException {
+	public void updateHeaders(final String appId, final String endpointId, final EndpointHeadersIn endpointHeadersIn)
+			throws ApiException {
 		try {
-			api.updateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut(appId, endpointId, endpointHeadersIn, null);
+			api.v1EndpointUpdateHeaders(appId, endpointId, endpointHeadersIn);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public void patchHeaders(final String appId, final String endpointId, final EndpointHeadersPatchIn endpointHeadersIn) throws ApiException {
+	public void patchHeaders(final String appId, final String endpointId,
+			final EndpointHeadersPatchIn endpointHeadersIn) throws ApiException {
 		try {
-			api.patchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch(appId, endpointId, endpointHeadersIn, null);
+			api.v1EndpointPatchHeaders(appId, endpointId, endpointHeadersIn);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
 	public EndpointStats getStats(final String appId, final String endpointId) throws ApiException {
+		return getStats(appId, endpointId, new EndpointStatsOptions());
+	}
+
+	public EndpointStats getStats(final String appId, final String endpointId, final EndpointStatsOptions options)
+			throws ApiException {
 		try {
-			return api.getEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet(endpointId, appId, null);
+			return api.v1EndpointGetStats(appId, endpointId, options.getSince(), options.getUntil());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public void replayMissing(final String appId, final String endpointId, final ReplayIn replayIn) throws ApiException {
+	public void replayMissing(final String appId, final String endpointId, final ReplayIn replayIn)
+			throws ApiException {
 		this.replayMissing(appId, endpointId, replayIn, new PostOptions());
 	}
 
-	public void replayMissing(final String appId, final String endpointId, final ReplayIn replayIn, final PostOptions options) throws ApiException {
+	public void replayMissing(final String appId, final String endpointId, final ReplayIn replayIn,
+			final PostOptions options) throws ApiException {
+		try {
+			api.v1EndpointReplay(appId, endpointId, replayIn, options.getIdempotencyKey());
+		} catch (com.svix.internal.ApiException e) {
+			throw Utils.wrapInternalApiException(e);
+		}
+	}
+
+	public EndpointTransformationOut transformationGet(final String appId, final String endpointId)
+			throws ApiException {
 		try {
-			api.replayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostWithHttpInfo(appId, endpointId, replayIn, options.getIdempotencyKey());
+			return api.v1EndpointTransformationGet(appId, endpointId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public EndpointTransformationOut transformationGet(final String appId, final String endpointId) throws ApiException {
+	public void transformationPartialUpdate(final String appId, final String endpointId,
+			final EndpointTransformationIn transformationIn) throws ApiException {
 		try {
-			return api.getEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet(endpointId, appId, null);
+			api.v1EndpointTransformationPartialUpdate(appId, endpointId, transformationIn);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
 	}
 
-	public void transformationPartialUpdate(final String appId, final String endpointId, final EndpointTransformationIn transformationIn) throws ApiException {
+	public MessageOut sendExample(final String appId, final String endpointId, final EventExampleIn eventExampleIn)
+			throws ApiException {
+		return this.sendExample(appId, endpointId, eventExampleIn, new PostOptions());
+	}
+
+	public MessageOut sendExample(final String appId, final String endpointId, final EventExampleIn eventExampleIn,
+			final PostOptions options) throws ApiException {
 		try {
-			api.setEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch(appId, endpointId, transformationIn, null);
+			return api.v1EndpointSendExample(appId, endpointId, eventExampleIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
diff --git a/java/lib/src/main/java/com/svix/EndpointStatsOptions.java b/java/lib/src/main/java/com/svix/EndpointStatsOptions.java
new file mode 100644
index 000000000..f76f34941
--- /dev/null
+++ b/java/lib/src/main/java/com/svix/EndpointStatsOptions.java
@@ -0,0 +1,24 @@
+package com.svix;
+
+import org.threeten.bp.OffsetDateTime;
+
+public class EndpointStatsOptions {
+    private OffsetDateTime since;
+    private OffsetDateTime until;
+
+    public void setSince(final OffsetDateTime since) {
+        this.since = since;
+    }
+
+    public OffsetDateTime getSince() {
+        return since;
+    }
+
+    public void setUntil(final OffsetDateTime until) {
+        this.until = until;
+    }
+
+    public OffsetDateTime getUntil() {
+        return until;
+    }
+}
diff --git a/java/lib/src/main/java/com/svix/EventType.java b/java/lib/src/main/java/com/svix/EventType.java
index b02a118b8..8ef77c8cd 100644
--- a/java/lib/src/main/java/com/svix/EventType.java
+++ b/java/lib/src/main/java/com/svix/EventType.java
@@ -16,7 +16,7 @@ public EventType() {
 
 	public ListResponseEventTypeOut list(final EventTypeListOptions options) throws ApiException {
 		try {
-			return api.listEventTypesApiV1EventTypeGet(options.getIterator(), options.getLimit(), options.getWithContent(), options.getIncludeArchived(), null);
+			return api.v1EventTypeList(options.getLimit(), options.getIterator(), null, options.getIncludeArchived(), options.getWithContent());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -28,7 +28,7 @@ public EventTypeOut create(final EventTypeIn eventTypeIn) throws ApiException {
 
 	public EventTypeOut create(final EventTypeIn eventTypeIn, final PostOptions options) throws ApiException {
 		try {
-			return api.createEventTypeApiV1EventTypePost(eventTypeIn, options.getIdempotencyKey());
+			return api.v1EventTypeCreate(eventTypeIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -36,7 +36,7 @@ public EventTypeOut create(final EventTypeIn eventTypeIn, final PostOptions opti
 
 	public EventTypeOut get(final String eventTypeName) throws ApiException {
 		try {
-			return api.getEventTypeApiV1EventTypeEventTypeNameGet(eventTypeName, null);
+			return api.v1EventTypeGet(eventTypeName);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -44,7 +44,7 @@ public EventTypeOut get(final String eventTypeName) throws ApiException {
 
 	public EventTypeOut update(final String eventTypeName, final EventTypeUpdate eventTypeUpdate) throws ApiException {
 		try {
-			return api.updateEventTypeApiV1EventTypeEventTypeNamePut(eventTypeName, eventTypeUpdate, null);
+			return api.v1EventTypeUpdate(eventTypeName, eventTypeUpdate);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -52,7 +52,7 @@ public EventTypeOut update(final String eventTypeName, final EventTypeUpdate eve
 
 	public void delete(final String eventTypeName) throws ApiException {
 		try {
-			api.deleteEventTypeApiV1EventTypeEventTypeNameDelete(eventTypeName, null, null);
+			api.v1EventTypeDelete(eventTypeName, null);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
diff --git a/java/lib/src/main/java/com/svix/Integration.java b/java/lib/src/main/java/com/svix/Integration.java
index ab806aebd..4101ec7ca 100644
--- a/java/lib/src/main/java/com/svix/Integration.java
+++ b/java/lib/src/main/java/com/svix/Integration.java
@@ -17,7 +17,7 @@ public Integration() {
 
 	public ListResponseIntegrationOut list(final String appId, final IntegrationListOptions options) throws ApiException {
 		try {
-			return api.listIntegrationsApiV1AppAppIdIntegrationGet(appId, options.getIterator(), options.getLimit(), null);
+			return api.v1IntegrationList(appId, options.getLimit(), options.getIterator());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -29,7 +29,7 @@ public IntegrationOut create(final String appId, final IntegrationIn integration
 
 	public IntegrationOut create(final String appId, final IntegrationIn integrationIn, final PostOptions options) throws ApiException {
 		try {
-			return api.createIntegrationApiV1AppAppIdIntegrationPost(appId, integrationIn, options.getIdempotencyKey());
+			return api.v1IntegrationCreate(appId, integrationIn, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -37,7 +37,7 @@ public IntegrationOut create(final String appId, final IntegrationIn integration
 
 	public IntegrationOut get(final String appId, final String integId) throws ApiException {
 		try {
-			return api.getIntegrationApiV1AppAppIdIntegrationIntegIdGet(integId, appId, null);
+			return api.v1IntegrationGet(appId, integId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -45,7 +45,7 @@ public IntegrationOut get(final String appId, final String integId) throws ApiEx
 
 	public IntegrationOut update(final String appId, final String integId, final IntegrationUpdate integUpdate) throws ApiException {
 		try {
-			return api.updateIntegrationApiV1AppAppIdIntegrationIntegIdPut(integId, appId, integUpdate, null);
+			return api.v1IntegrationUpdate(appId, integId, integUpdate);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -53,7 +53,7 @@ public IntegrationOut update(final String appId, final String integId, final Int
 
 	public void delete(final String appId, final String integId) throws ApiException {
 		try {
-			api.deleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete(integId, appId, null);
+			api.v1IntegrationDelete(appId, integId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -61,7 +61,7 @@ public void delete(final String appId, final String integId) throws ApiException
 
 	public IntegrationKeyOut getKey(final String appId, final String integId) throws ApiException {
 		try {
-			return api.getIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet(integId, appId, null);
+			return api.v1IntegrationGetKey(appId, integId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -73,7 +73,7 @@ public IntegrationKeyOut rotateKey(final String appId, final String integId) thr
 
 	public IntegrationKeyOut rotateKey(final String appId, final String integId, final PostOptions options) throws ApiException {
 		try {
-			return api.rotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost(integId, appId, options.getIdempotencyKey());
+			return api.v1IntegrationRotateKey(appId, integId, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
diff --git a/java/lib/src/main/java/com/svix/Message.java b/java/lib/src/main/java/com/svix/Message.java
index 133a5c054..6e8642dba 100644
--- a/java/lib/src/main/java/com/svix/Message.java
+++ b/java/lib/src/main/java/com/svix/Message.java
@@ -1,5 +1,7 @@
 package com.svix;
 
+import java.util.HashSet;
+
 import com.svix.exceptions.ApiException;
 import com.svix.internal.api.MessageApi;
 import com.svix.models.ListResponseMessageOut;
@@ -16,15 +18,15 @@ public final class Message {
 
 	public ListResponseMessageOut list(final String appId, final MessageListOptions options) throws ApiException {
 		try {
-			return api.listMessagesApiV1AppAppIdMsgGet(
+			return api.v1MessageList(
 					appId,
-					options.getIterator(),
 					options.getLimit(),
-					options.getEventTypes(),
+					options.getIterator(),
 					options.getChannel(),
 					options.getBefore(),
 					options.getAfter(),
-					null
+					options.getWithContent(),
+					new HashSet<>(options.getEventTypes())
 			);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
@@ -37,7 +39,7 @@ public MessageOut create(final String appId, final MessageIn messageIn) throws A
 
 	public MessageOut create(final String appId, final MessageIn messageIn, final PostOptions options) throws ApiException {
 		try {
-			return api.createMessageApiV1AppAppIdMsgPost(appId, messageIn.payload(getPayload(messageIn.getPayload())), null, options.getIdempotencyKey());
+			return api.v1MessageCreate(appId, messageIn.payload(getPayload(messageIn.getPayload())), null, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -45,7 +47,7 @@ public MessageOut create(final String appId, final MessageIn messageIn, final Po
 
 	public MessageOut get(final String msgId, final String appId) throws ApiException {
 		try {
-			return api.getMessageApiV1AppAppIdMsgMsgIdGet(msgId, appId, null);
+			return api.v1MessageGet(appId, msgId, null);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -53,7 +55,7 @@ public MessageOut get(final String msgId, final String appId) throws ApiExceptio
 
 	public void expungeContent(final String msgId, final String appId) throws ApiException {
 		try {
-			api.expungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete(msgId, appId, null);
+			api.v1MessageExpungeContent(appId, msgId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
diff --git a/java/lib/src/main/java/com/svix/MessageAttempt.java b/java/lib/src/main/java/com/svix/MessageAttempt.java
index 44ea07b97..1d47802e8 100644
--- a/java/lib/src/main/java/com/svix/MessageAttempt.java
+++ b/java/lib/src/main/java/com/svix/MessageAttempt.java
@@ -1,5 +1,7 @@
 package com.svix;
 
+import java.util.HashSet;
+
 import com.svix.exceptions.ApiException;
 import com.svix.internal.api.MessageAttemptApi;
 import com.svix.models.ListResponseEndpointMessageOut;
@@ -25,19 +27,18 @@ public ListResponseMessageAttemptOut list(final String appId, final String msgId
 
 	public ListResponseMessageAttemptOut listByMsg(final String appId, final String msgId, final MessageAttemptListOptions options) throws ApiException {
 		try {
-			return api.listAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet(
+			return api.v1MessageAttemptListByMsg(
 					appId,
 					msgId,
-					null,
-					options.getIterator(),
 					options.getLimit(),
+					options.getIterator(),
 					options.getMessageStatus(),
 					options.getStatusCodeClass(),
-					options.getEventTypes(),
 					options.getChannel(),
+					options.getEndpointId(),
 					options.getBefore(),
 					options.getAfter(),
-					null
+					new HashSet<>(options.getEventTypes())
 			);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
@@ -46,18 +47,17 @@ public ListResponseMessageAttemptOut listByMsg(final String appId, final String
 
 	public ListResponseMessageAttemptOut listByEndpoint(final String appId, final String endpointId, final MessageAttemptListOptions options) throws ApiException {
 		try {
-			return api.listAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet(
+			return api.v1MessageAttemptListByEndpoint(
 					appId,
 					endpointId,
-					options.getIterator(),
 					options.getLimit(),
+					options.getIterator(),
 					options.getMessageStatus(),
 					options.getStatusCodeClass(),
-					options.getEventTypes(),
 					options.getChannel(),
 					options.getBefore(),
 					options.getAfter(),
-					null
+					new HashSet<>(options.getEventTypes())
 			);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
@@ -66,7 +66,7 @@ public ListResponseMessageAttemptOut listByEndpoint(final String appId, final St
 
 	public MessageAttemptOut get(final String msgId, final String appId, final String attemptId) throws ApiException {
 		try {
-			return api.getAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet(attemptId, msgId, appId, null);
+			return api.v1MessageAttemptGet(appId, msgId, attemptId);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -78,7 +78,7 @@ public void resend(final String msgId, final String appId, final String endpoint
 
 	public void resend(final String msgId, final String appId, final String endpointId, final PostOptions options) throws ApiException {
 		try {
-			api.resendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost(endpointId, msgId, appId, options.getIdempotencyKey());
+			api.v1MessageAttemptResend(appId, msgId, endpointId, options.getIdempotencyKey());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -86,16 +86,16 @@ public void resend(final String msgId, final String appId, final String endpoint
 
 	public ListResponseEndpointMessageOut listAttemptedMessages(final String appId, final String endpointId, final MessageAttemptListOptions options) throws ApiException {
 		try {
-			return api.listAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet(
-					endpointId,
+			return api.v1MessageAttemptListAttemptedMessages(
 					appId,
-					options.getIterator(),
+					endpointId,
 					options.getLimit(),
+					options.getIterator(),
 					options.getChannel(),
 					options.getMessageStatus(),
 					options.getBefore(),
 					options.getAfter(),
-					null
+					options.getWithContent()
 			);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
@@ -104,7 +104,7 @@ public ListResponseEndpointMessageOut listAttemptedMessages(final String appId,
 
 	public ListResponseMessageEndpointOut listAttemptedDestinations(final String appId, final String msgId, final MessageAttemptListOptions options) throws ApiException {
 		try {
-			return api.listAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet(msgId, appId, options.getIterator(), options.getLimit(), null);
+			return api.v1MessageAttemptListAttemptedDestinations(appId, msgId, options.getLimit(), options.getIterator());
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
 		}
@@ -113,18 +113,17 @@ public ListResponseMessageEndpointOut listAttemptedDestinations(final String app
 	public ListResponseMessageAttemptEndpointOut listAttemptsForEndpoint(final String appId, final String msgId, final String endpointId,
 		final MessageAttemptListOptions options) throws ApiException {
 			try {
-				return api.listAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet(
-						msgId,
+				return api.v1MessageAttemptListByEndpointDeprecated(
 						appId,
+						msgId,
 						endpointId,
-						options.getIterator(),
 						options.getLimit(),
-						options.getEventTypes(),
+						options.getIterator(),
 						options.getChannel(),
 						options.getMessageStatus(),
 						options.getBefore(),
 						options.getAfter(),
-						null
+						new HashSet<>(options.getEventTypes())
 				);
 			} catch (com.svix.internal.ApiException e) {
 				throw Utils.wrapInternalApiException(e);
@@ -133,11 +132,10 @@ public ListResponseMessageAttemptEndpointOut listAttemptsForEndpoint(final Strin
 
 	public void expungeContent(final String appId, final String msgId, final String attemptId) throws ApiException {
 		try {
-			api.expungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete(
-				attemptId,
-				msgId,
+			api.v1MessageAttemptExpungeContent(
 				appId,
-				null
+				msgId,
+				attemptId
 			);
 		} catch (com.svix.internal.ApiException e) {
 			throw Utils.wrapInternalApiException(e);
diff --git a/java/lib/src/main/java/com/svix/MessageAttemptListOptions.java b/java/lib/src/main/java/com/svix/MessageAttemptListOptions.java
index 5fd211871..58b0ae5ea 100644
--- a/java/lib/src/main/java/com/svix/MessageAttemptListOptions.java
+++ b/java/lib/src/main/java/com/svix/MessageAttemptListOptions.java
@@ -14,6 +14,8 @@ public class MessageAttemptListOptions extends ListOptions {
 	private OffsetDateTime after;
 	private StatusCodeClass statusCodeClass;
 	private String channel;
+	private Boolean withContent;
+	private String endpointId;
 
 	public MessageAttemptListOptions() {
         super();
@@ -96,4 +98,30 @@ public void setStatusCodeClass(final StatusCodeClass statusCodeClass) {
 	public StatusCodeClass getStatusCodeClass() {
 		return statusCodeClass;
 	}
+
+	public Boolean getWithContent() {
+		return withContent;
+	}
+
+	public void setWithContent(final Boolean withContent) {
+		this.withContent = withContent;
+	}
+
+	public MessageAttemptListOptions withContent(final Boolean withContent) {
+		this.withContent = withContent;
+		return this;
+	}
+
+	public String getEndpointId() {
+		return endpointId;
+	}
+
+	public void setEndpointId(final String endpointId) {
+		this.endpointId = endpointId;
+	}
+
+	public MessageAttemptListOptions endpointId(final String endpointId) {
+		this.endpointId = endpointId;
+		return this;
+	}
 }
diff --git a/java/lib/src/main/java/com/svix/MessageListOptions.java b/java/lib/src/main/java/com/svix/MessageListOptions.java
index 03f3966b8..dfb3871a8 100644
--- a/java/lib/src/main/java/com/svix/MessageListOptions.java
+++ b/java/lib/src/main/java/com/svix/MessageListOptions.java
@@ -8,6 +8,7 @@ public class MessageListOptions extends ListOptions {
 	private OffsetDateTime before;
 	private OffsetDateTime after;
 	private String channel;
+	private Boolean withContent;
 
 	public MessageListOptions eventTypes(final List<String> eventTypes) {
 		this.eventTypes = eventTypes;
@@ -60,4 +61,17 @@ public void setAfter(final OffsetDateTime after) {
 	public OffsetDateTime getAfter() {
 		return after;
 	}
+
+	public Boolean getWithContent() {
+		return withContent;
+	}
+
+	public void setWithContent(final Boolean withContent) {
+		this.withContent = withContent;
+	}
+
+	public MessageListOptions withContent(final Boolean withContent) {
+		this.withContent = withContent;
+		return this;
+	}
 }
diff --git a/java/lib/src/main/java/com/svix/Svix.java b/java/lib/src/main/java/com/svix/Svix.java
index 822dbf79c..10f7f21c0 100644
--- a/java/lib/src/main/java/com/svix/Svix.java
+++ b/java/lib/src/main/java/com/svix/Svix.java
@@ -5,7 +5,7 @@
 import com.svix.internal.auth.HttpBearerAuth;
 
 public final class Svix {
-	public static final String VERSION = "0.81.0";
+	public static final String VERSION = "1.4.12";
 	private final Application application;
 	private final Authentication authentication;
 	private final Endpoint endpoint;
diff --git a/javascript/package.json b/javascript/package.json
index 339adcbe2..f59d7bd2c 100644
--- a/javascript/package.json
+++ b/javascript/package.json
@@ -1,6 +1,6 @@
 {
   "name": "svix",
-  "version": "0.81.0",
+  "version": "1.4.12",
   "description": "Svix API client",
   "author": "svix",
   "repository": "https://github.com/svix/svix-libs",
diff --git a/javascript/src/index.ts b/javascript/src/index.ts
index f1b223d9f..9c0143316 100644
--- a/javascript/src/index.ts
+++ b/javascript/src/index.ts
@@ -20,6 +20,7 @@ import {
   EndpointHeadersPatchIn,
   EndpointHeadersOut,
   EndpointStats,
+  EventExampleIn,
   RecoverIn,
   ReplayIn,
   IntegrationApi,
@@ -53,6 +54,11 @@ import {
   AppPortalAccessOut,
   AppPortalAccessIn,
   Ordering,
+  BackgroundTaskStatus,
+  BackgroundTaskType,
+  BackgroundTaskOut,
+  ListResponseBackgroundTaskOut,
+  BackgroundTasksApi,
 } from "./openapi/index";
 export * from "./openapi/models/all";
 export * from "./openapi/apis/exception";
@@ -61,7 +67,7 @@ import * as base64 from "@stablelib/base64";
 import * as sha256 from "fast-sha256";
 
 const WEBHOOK_TOLERANCE_IN_SECONDS = 5 * 60; // 5 minutes
-const VERSION = "0.81.0";
+const VERSION = "1.4.12";
 
 class UserAgentMiddleware implements Middleware {
   public pre(context: RequestContext): Promise<RequestContext> {
@@ -94,6 +100,7 @@ export class Svix {
   public readonly integration: Integration;
   public readonly message: Message;
   public readonly messageAttempt: MessageAttempt;
+  public readonly backgroundTask: BackgroundTask;
 
   public constructor(token: string, options: SvixOptions = {}) {
     const regionalUrl = REGIONS.find((x) => x.region === token.split(".")[1])?.url;
@@ -122,6 +129,7 @@ export class Svix {
     this.integration = new Integration(config);
     this.message = new Message(config);
     this.messageAttempt = new MessageAttempt(config);
+    this.backgroundTask = new BackgroundTask(config);
   }
 }
 export interface PostOptions {
@@ -139,7 +147,7 @@ class Authentication {
     appPortalAccessIn: AppPortalAccessIn,
     options?: PostOptions
   ): Promise<AppPortalAccessOut> {
-    return this.api.getAppPortalAccessApiV1AuthAppPortalAccessAppIdPost({
+    return this.api.v1AuthenticationAppPortalAccess({
       appId,
       appPortalAccessIn,
       ...options,
@@ -150,14 +158,14 @@ class Authentication {
     appId: string,
     options?: PostOptions
   ): Promise<DashboardAccessOut> {
-    return this.api.getDashboardAccessApiV1AuthDashboardAccessAppIdPost({
+    return this.api.v1AuthenticationDashboardAccess({
       appId,
       ...options,
     });
   }
 
   public logout(options?: PostOptions): Promise<void> {
-    return this.api.logoutApiV1AuthLogoutPost({ ...options });
+    return this.api.v1AuthenticationLogout({ ...options });
   }
 }
 
@@ -174,6 +182,11 @@ export interface EndpointListOptions extends ListOptions {
   order?: Ordering;
 }
 
+export interface EndpointStatsOptions {
+  since?: Date;
+  until?: Date;
+}
+
 export type IntegrationListOptions = ListOptions;
 
 export interface EventTypeListOptions extends ListOptions {
@@ -186,6 +199,7 @@ export interface MessageListOptions extends ListOptions {
   before?: Date;
   after?: Date;
   channel?: string;
+  withContent?: boolean;
 }
 
 export interface MessageAttemptListOptions extends ListOptions {
@@ -197,6 +211,11 @@ export interface MessageAttemptListOptions extends ListOptions {
   channel?: string;
 }
 
+export interface BackgroundTaskListOptions extends ListOptions {
+  status?: BackgroundTaskStatus;
+  task?: BackgroundTaskType;
+}
+
 class Application {
   private readonly api: ApplicationApi;
 
@@ -205,21 +224,21 @@ class Application {
   }
 
   public list(options?: ApplicationListOptions): Promise<ListResponseApplicationOut> {
-    return this.api.listApplicationsApiV1AppGet({ ...options });
+    return this.api.v1ApplicationList({ ...options });
   }
 
   public create(
     applicationIn: ApplicationIn,
     options?: PostOptions
   ): Promise<ApplicationOut> {
-    return this.api.createApplicationApiV1AppPost({ applicationIn, ...options });
+    return this.api.v1ApplicationCreate({ applicationIn, ...options });
   }
 
   public getOrCreate(
     applicationIn: ApplicationIn,
     options?: PostOptions
   ): Promise<ApplicationOut> {
-    return this.api.createApplicationApiV1AppPost({
+    return this.api.v1ApplicationCreate({
       applicationIn,
       ...options,
       getIfExists: true,
@@ -227,15 +246,15 @@ class Application {
   }
 
   public get(appId: string): Promise<ApplicationOut> {
-    return this.api.getApplicationApiV1AppAppIdGet({ appId });
+    return this.api.v1ApplicationGet({ appId });
   }
 
   public update(appId: string, applicationIn: ApplicationIn): Promise<ApplicationOut> {
-    return this.api.updateApplicationApiV1AppAppIdPut({ appId, applicationIn });
+    return this.api.v1ApplicationUpdate({ appId, applicationIn });
   }
 
   public delete(appId: string): Promise<void> {
-    return this.api.deleteApplicationApiV1AppAppIdDelete({ appId });
+    return this.api.v1ApplicationDelete({ appId });
   }
 }
 
@@ -250,7 +269,7 @@ class Endpoint {
     appId: string,
     options?: EndpointListOptions
   ): Promise<ListResponseEndpointOut> {
-    return this.api.listEndpointsApiV1AppAppIdEndpointGet({ appId, ...options });
+    return this.api.v1EndpointList({ appId, ...options });
   }
 
   public create(
@@ -258,7 +277,7 @@ class Endpoint {
     endpointIn: EndpointIn,
     options?: PostOptions
   ): Promise<EndpointOut> {
-    return this.api.createEndpointApiV1AppAppIdEndpointPost({
+    return this.api.v1EndpointCreate({
       appId,
       endpointIn,
       ...options,
@@ -266,7 +285,7 @@ class Endpoint {
   }
 
   public get(appId: string, endpointId: string): Promise<EndpointOut> {
-    return this.api.getEndpointApiV1AppAppIdEndpointEndpointIdGet({ endpointId, appId });
+    return this.api.v1EndpointGet({ endpointId, appId });
   }
 
   public update(
@@ -274,7 +293,7 @@ class Endpoint {
     endpointId: string,
     endpointUpdate: EndpointUpdate
   ): Promise<EndpointOut> {
-    return this.api.updateEndpointApiV1AppAppIdEndpointEndpointIdPut({
+    return this.api.v1EndpointUpdate({
       appId,
       endpointId,
       endpointUpdate,
@@ -282,14 +301,14 @@ class Endpoint {
   }
 
   public delete(appId: string, endpointId: string): Promise<void> {
-    return this.api.deleteEndpointApiV1AppAppIdEndpointEndpointIdDelete({
+    return this.api.v1EndpointDelete({
       endpointId,
       appId,
     });
   }
 
   public getSecret(appId: string, endpointId: string): Promise<EndpointSecretOut> {
-    return this.api.getEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet({
+    return this.api.v1EndpointGetSecret({
       endpointId,
       appId,
     });
@@ -301,7 +320,7 @@ class Endpoint {
     endpointSecretRotateIn: EndpointSecretRotateIn,
     options?: PostOptions
   ): Promise<void> {
-    return this.api.rotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost({
+    return this.api.v1EndpointRotateSecret({
       endpointId,
       appId,
       endpointSecretRotateIn,
@@ -316,7 +335,7 @@ class Endpoint {
     options?: PostOptions
   ): Promise<void> {
     return this.api
-      .recoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost({
+      .v1EndpointRecover({
         appId,
         endpointId,
         recoverIn,
@@ -332,7 +351,7 @@ class Endpoint {
     options?: PostOptions
   ): Promise<void> {
     return this.api
-      .replayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPost({
+      .v1EndpointReplay({
         appId,
         endpointId,
         replayIn,
@@ -342,7 +361,7 @@ class Endpoint {
   }
 
   public getHeaders(appId: string, endpointId: string): Promise<EndpointHeadersOut> {
-    return this.api.getEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet({
+    return this.api.v1EndpointGetHeaders({
       appId,
       endpointId,
     });
@@ -353,7 +372,7 @@ class Endpoint {
     endpointId: string,
     endpointHeadersIn: EndpointHeadersIn
   ): Promise<void> {
-    return this.api.updateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut({
+    return this.api.v1EndpointUpdateHeaders({
       appId,
       endpointId,
       endpointHeadersIn,
@@ -365,17 +384,18 @@ class Endpoint {
     endpointId: string,
     endpointHeadersPatchIn: EndpointHeadersPatchIn
   ): Promise<void> {
-    return this.api.patchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch({
+    return this.api.v1EndpointPatchHeaders({
       appId,
       endpointId,
       endpointHeadersPatchIn,
     });
   }
 
-  public getStats(appId: string, endpointId: string): Promise<EndpointStats> {
-    return this.api.getEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet({
+  public getStats(appId: string, endpointId: string, options?: EndpointStatsOptions): Promise<EndpointStats> {
+    return this.api.v1EndpointGetStats({
       appId,
       endpointId,
+      ...options
     });
   }
 
@@ -383,7 +403,7 @@ class Endpoint {
     appId: string,
     endpointId: string
   ): Promise<EndpointTransformationOut> {
-    return this.api.getEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet(
+    return this.api.v1EndpointTransformationGet(
       { endpointId, appId }
     );
   }
@@ -393,10 +413,21 @@ class Endpoint {
     endpointId: string,
     endpointTransformationIn: EndpointTransformationIn
   ): Promise<void> {
-    return this.api.setEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch(
+    return this.api.v1EndpointTransformationPartialUpdate(
       { appId, endpointId, endpointTransformationIn }
     );
   }
+
+  public sendExample(
+    appId: string,
+    endpointId: string,
+    eventExampleIn: EventExampleIn,
+    options?: PostOptions,
+  ): Promise<MessageOut> {
+    return this.api.v1EndpointSendExample(
+      { appId, endpointId, eventExampleIn, ...options }
+    );
+  }
 }
 
 class EventType {
@@ -407,29 +438,29 @@ class EventType {
   }
 
   public list(options?: EventTypeListOptions): Promise<ListResponseEventTypeOut> {
-    return this.api.listEventTypesApiV1EventTypeGet({ ...options });
+    return this.api.v1EventTypeList({ ...options });
   }
 
   public get(eventTypeName: string): Promise<EventTypeOut> {
-    return this.api.getEventTypeApiV1EventTypeEventTypeNameGet({ eventTypeName });
+    return this.api.v1EventTypeGet({ eventTypeName });
   }
 
   public create(eventTypeIn: EventTypeIn, options?: PostOptions): Promise<EventTypeOut> {
-    return this.api.createEventTypeApiV1EventTypePost({ eventTypeIn, ...options });
+    return this.api.v1EventTypeCreate({ eventTypeIn, ...options });
   }
 
   public update(
     eventTypeName: string,
     eventTypeUpdate: EventTypeUpdate
   ): Promise<EventTypeOut> {
-    return this.api.updateEventTypeApiV1EventTypeEventTypeNamePut({
+    return this.api.v1EventTypeUpdate({
       eventTypeName,
       eventTypeUpdate,
     });
   }
 
   public delete(eventTypeName: string): Promise<void> {
-    return this.api.deleteEventTypeApiV1EventTypeEventTypeNameDelete({ eventTypeName });
+    return this.api.v1EventTypeDelete({ eventTypeName });
   }
 }
 
@@ -444,7 +475,7 @@ class Integration {
     appId: string,
     options?: IntegrationListOptions
   ): Promise<ListResponseIntegrationOut> {
-    return this.api.listIntegrationsApiV1AppAppIdIntegrationGet({ appId, ...options });
+    return this.api.v1IntegrationList({ appId, ...options });
   }
 
   public create(
@@ -452,7 +483,7 @@ class Integration {
     integrationIn: IntegrationIn,
     options?: PostOptions
   ): Promise<IntegrationOut> {
-    return this.api.createIntegrationApiV1AppAppIdIntegrationPost({
+    return this.api.v1IntegrationCreate({
       appId,
       integrationIn,
       ...options,
@@ -460,7 +491,7 @@ class Integration {
   }
 
   public get(appId: string, integId: string): Promise<IntegrationOut> {
-    return this.api.getIntegrationApiV1AppAppIdIntegrationIntegIdGet({ integId, appId });
+    return this.api.v1IntegrationGet({ integId, appId });
   }
 
   public update(
@@ -468,7 +499,7 @@ class Integration {
     integId: string,
     integrationUpdate: IntegrationUpdate
   ): Promise<IntegrationOut> {
-    return this.api.updateIntegrationApiV1AppAppIdIntegrationIntegIdPut({
+    return this.api.v1IntegrationUpdate({
       appId,
       integId,
       integrationUpdate,
@@ -476,14 +507,14 @@ class Integration {
   }
 
   public delete(appId: string, integId: string): Promise<void> {
-    return this.api.deleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete({
+    return this.api.v1IntegrationDelete({
       integId,
       appId,
     });
   }
 
   public getKey(appId: string, integId: string): Promise<IntegrationKeyOut> {
-    return this.api.getIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet({
+    return this.api.v1IntegrationGetKey({
       integId,
       appId,
     });
@@ -494,7 +525,7 @@ class Integration {
     integId: string,
     options?: PostOptions
   ): Promise<IntegrationKeyOut> {
-    return this.api.rotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost({
+    return this.api.v1IntegrationRotateKey({
       integId,
       appId,
       ...options,
@@ -513,7 +544,7 @@ class Message {
     appId: string,
     options?: MessageListOptions
   ): Promise<ListResponseMessageOut> {
-    return this.api.listMessagesApiV1AppAppIdMsgGet({ appId, ...options });
+    return this.api.v1MessageList({ appId, ...options });
   }
 
   public create(
@@ -521,15 +552,15 @@ class Message {
     messageIn: MessageIn,
     options?: PostOptions
   ): Promise<MessageOut> {
-    return this.api.createMessageApiV1AppAppIdMsgPost({ appId, messageIn, ...options });
+    return this.api.v1MessageCreate({ appId, messageIn, ...options });
   }
 
   public get(appId: string, msgId: string): Promise<MessageOut> {
-    return this.api.getMessageApiV1AppAppIdMsgMsgIdGet({ msgId, appId });
+    return this.api.v1MessageGet({ msgId, appId });
   }
 
   public expungeContent(appId: string, msgId: string): Promise<void> {
-    return this.api.expungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete({ appId, msgId });
+    return this.api.v1MessageExpungeContent({ appId, msgId });
   }
 }
 
@@ -556,7 +587,7 @@ class MessageAttempt {
     msgId: string,
     options?: MessageAttemptListOptions
   ): Promise<ListResponseMessageAttemptOut> {
-    return this.api.listAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet({
+    return this.api.v1MessageAttemptListByMsg({
       appId,
       msgId,
       ...options,
@@ -568,7 +599,7 @@ class MessageAttempt {
     endpointId: string,
     options?: MessageAttemptListOptions
   ): Promise<ListResponseMessageAttemptOut> {
-    return this.api.listAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet({
+    return this.api.v1MessageAttemptListByEndpoint({
       appId,
       endpointId,
       ...options,
@@ -580,7 +611,7 @@ class MessageAttempt {
     msgId: string,
     attemptId: string
   ): Promise<MessageAttemptOut> {
-    return this.api.getAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet({
+    return this.api.v1MessageAttemptGet({
       attemptId,
       msgId,
       appId,
@@ -593,7 +624,7 @@ class MessageAttempt {
     endpointId: string,
     options?: PostOptions
   ): Promise<void> {
-    return this.api.resendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost({
+    return this.api.v1MessageAttemptResend({
       endpointId,
       msgId,
       appId,
@@ -606,7 +637,7 @@ class MessageAttempt {
     endpointId: string,
     options?: MessageAttemptListOptions
   ): Promise<ListResponseEndpointMessageOut> {
-    return this.api.listAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet({
+    return this.api.v1MessageAttemptListAttemptedMessages({
       appId,
       endpointId,
       ...options,
@@ -618,7 +649,7 @@ class MessageAttempt {
     msgId: string,
     options?: MessageAttemptListOptions
   ): Promise<ListResponseMessageEndpointOut> {
-    return this.api.listAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet({
+    return this.api.v1MessageAttemptListAttemptedDestinations({
       appId,
       msgId,
       ...options,
@@ -631,7 +662,7 @@ class MessageAttempt {
     endpointId: string,
     options?: MessageAttemptListOptions
   ): Promise<ListResponseMessageAttemptEndpointOut> {
-    return this.api.listAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet(
+    return this.api.v1MessageAttemptListByEndpointDeprecated(
       { appId, msgId, endpointId, ...options }
     );
   }
@@ -641,12 +672,37 @@ class MessageAttempt {
     msgId: string,
     attemptId: string
   ): Promise<void> {
-    return this.api.expungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete({
+    return this.api.v1MessageAttemptExpungeContent({
       appId, msgId, attemptId
     })
   }
 }
 
+class BackgroundTask {
+  private readonly api: BackgroundTasksApi;
+
+  public constructor(config: Configuration) {
+    this.api = new BackgroundTasksApi(config);
+  }
+
+  public listByEndpoint(
+    options?: BackgroundTaskListOptions
+  ): Promise<ListResponseBackgroundTaskOut> {
+    return this.api.listBackgroundTasks({
+      ...options,
+    });
+  }
+
+  public get(
+    taskId: string,
+  ): Promise<BackgroundTaskOut> {
+    return this.api.getBackgroundTask({
+      taskId
+    });
+  }
+
+}
+
 class ExtendableError extends Error {
   constructor(message: any) {
     super(message);
diff --git a/kotlin/README.md b/kotlin/README.md
index b5757b1c4..8fcdc3fd9 100644
--- a/kotlin/README.md
+++ b/kotlin/README.md
@@ -51,7 +51,7 @@ Add this dependency to your project's POM:
 <dependency>
   <groupId>com.svix.kotlin</groupId>
   <artifactId>svix-kotlin</artifactId>
-  <version>0.81.0</version>
+  <version>1.4.12</version>
   <scope>compile</scope>
 </dependency>
 ```
@@ -61,7 +61,7 @@ Add this dependency to your project's POM:
 Add this dependency to your project's build file:
 
 ```groovy
-implementation "com.svix.kotlin:svix-kotlin:0.81.0"
+implementation "com.svix.kotlin:svix-kotlin:1.4.12"
 ```
 
 # Development
diff --git a/kotlin/gradle.properties b/kotlin/gradle.properties
index 8c95fe8c0..7383f84aa 100644
--- a/kotlin/gradle.properties
+++ b/kotlin/gradle.properties
@@ -1,5 +1,5 @@
 GROUP=com.svix.kotlin
-VERSION_NAME=0.81.0
+VERSION_NAME=1.4.12
 
 POM_URL=https://github.com/svix/svix-webhooks
 POM_SCM_URL=git@github.com:svix/svix-webhooks.git
diff --git a/kotlin/lib/src/main/kotlin/Application.kt b/kotlin/lib/src/main/kotlin/Application.kt
index cc9dc7393..ad700fb46 100644
--- a/kotlin/lib/src/main/kotlin/Application.kt
+++ b/kotlin/lib/src/main/kotlin/Application.kt
@@ -18,7 +18,7 @@ class Application internal constructor(token: String, options: SvixOptions) {
 
     suspend fun list(options: ApplicationListOptions = ApplicationListOptions()): ListResponseApplicationOut {
         try {
-            return api.listApplicationsApiV1AppGet(options.iterator, options.limit, options.order, null)
+            return api.v1ApplicationList(options.limit, options.iterator, options.order)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -26,7 +26,7 @@ class Application internal constructor(token: String, options: SvixOptions) {
 
     suspend fun create(applicationIn: ApplicationIn, options: PostOptions = PostOptions()): ApplicationOut {
         try {
-            return api.createApplicationApiV1AppPost(applicationIn, null, options.idempotencyKey)
+            return api.v1ApplicationCreate(applicationIn, null, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -34,7 +34,7 @@ class Application internal constructor(token: String, options: SvixOptions) {
 
     suspend fun getOrCreate(applicationIn: ApplicationIn, options: PostOptions = PostOptions()): ApplicationOut {
         try {
-            return api.createApplicationApiV1AppPost(applicationIn, true, options.idempotencyKey)
+            return api.v1ApplicationCreate(applicationIn, true, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -42,7 +42,7 @@ class Application internal constructor(token: String, options: SvixOptions) {
 
     suspend fun get(appId: String): ApplicationOut {
         try {
-            return api.getApplicationApiV1AppAppIdGet(appId, null)
+            return api.v1ApplicationGet(appId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -50,7 +50,7 @@ class Application internal constructor(token: String, options: SvixOptions) {
 
     suspend fun update(appId: String, applicationIn: ApplicationIn): ApplicationOut {
         try {
-            return api.updateApplicationApiV1AppAppIdPut(appId, applicationIn, null)
+            return api.v1ApplicationUpdate(appId, applicationIn)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -58,7 +58,7 @@ class Application internal constructor(token: String, options: SvixOptions) {
 
     suspend fun delete(appId: String) {
         try {
-            api.deleteApplicationApiV1AppAppIdDelete(appId, null)
+            api.v1ApplicationDelete(appId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
diff --git a/kotlin/lib/src/main/kotlin/Authentication.kt b/kotlin/lib/src/main/kotlin/Authentication.kt
index fefad7833..99160616b 100644
--- a/kotlin/lib/src/main/kotlin/Authentication.kt
+++ b/kotlin/lib/src/main/kotlin/Authentication.kt
@@ -22,7 +22,7 @@ class Authentication internal constructor(token: String, options: SvixOptions) {
         options: PostOptions = PostOptions()
     ): AppPortalAccessOut {
         try {
-            return api.getAppPortalAccessApiV1AuthAppPortalAccessAppIdPost(appId, appPortalAccessIn, options.idempotencyKey)
+            return api.v1AuthenticationAppPortalAccess(appId, appPortalAccessIn, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -30,7 +30,7 @@ class Authentication internal constructor(token: String, options: SvixOptions) {
 
     suspend fun dashboardAccess(appId: String, options: PostOptions = PostOptions()): DashboardAccessOut {
         try {
-            return api.getDashboardAccessApiV1AuthDashboardAccessAppIdPost(appId, options.idempotencyKey)
+            return api.v1AuthenticationDashboardAccess(appId, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -38,7 +38,7 @@ class Authentication internal constructor(token: String, options: SvixOptions) {
 
     suspend fun logout(options: PostOptions = PostOptions()) {
         try {
-            api.logoutApiV1AuthLogoutPost(options.idempotencyKey)
+            api.v1AuthenticationLogout(options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
diff --git a/kotlin/lib/src/main/kotlin/BackgroundTask.kt b/kotlin/lib/src/main/kotlin/BackgroundTask.kt
new file mode 100644
index 000000000..b555d4653
--- /dev/null
+++ b/kotlin/lib/src/main/kotlin/BackgroundTask.kt
@@ -0,0 +1,33 @@
+package com.svix.kotlin
+
+import com.svix.kotlin.exceptions.ApiException
+import com.svix.kotlin.internal.apis.BackgroundTasksApi
+import com.svix.kotlin.models.BackgroundTaskOut
+import com.svix.kotlin.models.ListResponseBackgroundTaskOut
+
+class BackgroundTask internal constructor(token: String, options: SvixOptions) {
+    private val api = BackgroundTasksApi(options.serverUrl)
+
+    init {
+        api.accessToken = token
+        api.userAgent = options.getUA()
+        options.initialRetryDelayMillis?.let { api.initialRetryDelayMillis = it }
+        options.numRetries?.let { api.numRetries = it }
+    }
+
+    suspend fun list(options: BackgroundTaskListOptions = BackgroundTaskListOptions()): ListResponseBackgroundTaskOut {
+        try {
+            return api.listBackgroundTasks(options.status, options.task, options.limit, options.iterator, options.order)
+        } catch (e: Exception) {
+            throw ApiException.wrap(e)
+        }
+    }
+
+    suspend fun get(taskId: String): BackgroundTaskOut {
+        try {
+            return api.getBackgroundTask(taskId)
+        } catch (e: Exception) {
+            throw ApiException.wrap(e)
+        }
+    }
+}
diff --git a/kotlin/lib/src/main/kotlin/BackgroundTaskListOptions.kt b/kotlin/lib/src/main/kotlin/BackgroundTaskListOptions.kt
new file mode 100644
index 000000000..3f9edc9c4
--- /dev/null
+++ b/kotlin/lib/src/main/kotlin/BackgroundTaskListOptions.kt
@@ -0,0 +1,21 @@
+package com.svix.kotlin
+
+import com.svix.kotlin.models.BackgroundTaskStatus
+import com.svix.kotlin.models.BackgroundTaskType
+import com.svix.kotlin.models.Ordering
+
+class BackgroundTaskListOptions : ListOptions() {
+    var status: BackgroundTaskStatus? = null
+    var task: BackgroundTaskType? = null
+    var order: Ordering? = null
+
+    fun order(order: Ordering) = apply { this.order = order }
+
+    fun status(status: BackgroundTaskStatus) = apply { this.status = status }
+
+    fun task(task: BackgroundTaskType) = apply { this.task = task }
+
+    override fun iterator(iterator: String) = apply { super.iterator(iterator) }
+
+    override fun limit(limit: Int) = apply { super.limit(limit) }
+}
diff --git a/kotlin/lib/src/main/kotlin/Endpoint.kt b/kotlin/lib/src/main/kotlin/Endpoint.kt
index a8adcd9e1..41736b018 100644
--- a/kotlin/lib/src/main/kotlin/Endpoint.kt
+++ b/kotlin/lib/src/main/kotlin/Endpoint.kt
@@ -13,6 +13,7 @@ import com.svix.kotlin.models.EndpointStats
 import com.svix.kotlin.models.EndpointTransformationIn
 import com.svix.kotlin.models.EndpointTransformationOut
 import com.svix.kotlin.models.EndpointUpdate
+import com.svix.kotlin.models.EventExampleIn
 import com.svix.kotlin.models.ListResponseEndpointOut
 import com.svix.kotlin.models.RecoverIn
 import com.svix.kotlin.models.ReplayIn
@@ -32,12 +33,11 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         options: EndpointListOptions = EndpointListOptions()
     ): ListResponseEndpointOut {
         try {
-            return api.listEndpointsApiV1AppAppIdEndpointGet(
+            return api.v1EndpointList(
                 appId,
-                options.iterator,
                 options.limit,
-                options.order,
-                null
+                options.iterator,
+                options.order
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -50,7 +50,7 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         options: PostOptions = PostOptions()
     ): EndpointOut {
         try {
-            return api.createEndpointApiV1AppAppIdEndpointPost(
+            return api.v1EndpointCreate(
                 appId,
                 endpointIn,
                 options.idempotencyKey
@@ -62,7 +62,7 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
 
     suspend fun get(appId: String, endpointId: String): EndpointOut {
         try {
-            return api.getEndpointApiV1AppAppIdEndpointEndpointIdGet(endpointId, appId, null)
+            return api.v1EndpointGet(endpointId, appId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -74,11 +74,10 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         endpointUpdate: EndpointUpdate
     ): EndpointOut {
         try {
-            return api.updateEndpointApiV1AppAppIdEndpointEndpointIdPut(
-                endpointId,
+            return api.v1EndpointUpdate(
                 appId,
-                endpointUpdate,
-                null
+                endpointId,
+                endpointUpdate
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -87,7 +86,7 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
 
     suspend fun delete(appId: String, endpointId: String) {
         try {
-            api.deleteEndpointApiV1AppAppIdEndpointEndpointIdDelete(endpointId, appId, null)
+            api.v1EndpointDelete(appId, endpointId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -95,10 +94,9 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
 
     suspend fun getSecret(appId: String, endpointId: String): EndpointSecretOut {
         try {
-            return api.getEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGet(
-                endpointId,
+            return api.v1EndpointGetSecret(
                 appId,
-                null
+                endpointId
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -112,9 +110,9 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         options: PostOptions = PostOptions()
     ) {
         try {
-            api.rotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePost(
-                endpointId,
+            api.v1EndpointRotateSecret(
                 appId,
+                endpointId,
                 endpointSecretRotateIn,
                 options.idempotencyKey
             )
@@ -130,7 +128,7 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         options: PostOptions = PostOptions()
     ) {
         try {
-            api.recoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPost(
+            api.v1EndpointRecover(
                 appId,
                 endpointId,
                 recoverIn,
@@ -143,10 +141,9 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
 
     suspend fun getHeaders(appId: String, endpointId: String): EndpointHeadersOut {
         try {
-            return api.getEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGet(
-                endpointId,
+            return api.v1EndpointGetHeaders(
                 appId,
-                null
+                endpointId
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -159,11 +156,10 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         endpointHeadersIn: EndpointHeadersIn
     ) {
         try {
-            api.updateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPut(
+            api.v1EndpointUpdateHeaders(
                 appId,
                 endpointId,
-                endpointHeadersIn,
-                null
+                endpointHeadersIn
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -176,23 +172,27 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         endpointHeadersIn: EndpointHeadersPatchIn
     ) {
         try {
-            api.patchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatch(
+            api.v1EndpointPatchHeaders(
                 appId,
                 endpointId,
-                endpointHeadersIn,
-                null
+                endpointHeadersIn
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
     }
 
-    suspend fun getStats(appId: String, endpointId: String): EndpointStats {
+    suspend fun getStats(
+        appId: String,
+        endpointId: String,
+        options: EndpointStatsOptions = EndpointStatsOptions()
+    ): EndpointStats {
         try {
-            return api.getEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGet(
-                endpointId,
+            return api.v1EndpointGetStats(
                 appId,
-                null
+                endpointId,
+                options.since,
+                options.until
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -206,7 +206,7 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
         options: PostOptions = PostOptions()
     ) {
         try {
-            api.replayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPost(
+            api.v1EndpointReplay(
                 appId,
                 endpointId,
                 replayIn,
@@ -219,10 +219,9 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
 
     suspend fun transformationGet(appId: String, endpointId: String): EndpointTransformationOut {
         try {
-            return api.getEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGet(
-                endpointId,
+            return api.v1EndpointTransformationGet(
                 appId,
-                null
+                endpointId
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -231,11 +230,23 @@ class Endpoint internal constructor(token: String, options: SvixOptions) {
 
     suspend fun transformationPartialUpdate(appId: String, endpointId: String, endpointTransformationIn: EndpointTransformationIn) {
         try {
-            api.setEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatch(
+            api.v1EndpointTransformationPartialUpdate(
+                appId,
                 endpointId,
+                endpointTransformationIn
+            )
+        } catch (e: Exception) {
+            throw ApiException.wrap(e)
+        }
+    }
+
+    suspend fun sendExample(appId: String, endpointId: String, eventExampleIn: EventExampleIn, options: PostOptions = PostOptions()) {
+        try {
+            api.v1EndpointSendExample(
                 appId,
-                endpointTransformationIn,
-                null
+                endpointId,
+                eventExampleIn,
+                options.idempotencyKey
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
diff --git a/kotlin/lib/src/main/kotlin/EndpointStatsOptions.kt b/kotlin/lib/src/main/kotlin/EndpointStatsOptions.kt
new file mode 100644
index 000000000..b3dc88dcb
--- /dev/null
+++ b/kotlin/lib/src/main/kotlin/EndpointStatsOptions.kt
@@ -0,0 +1,8 @@
+package com.svix.kotlin
+
+import java.time.OffsetDateTime
+
+class EndpointStatsOptions {
+    var since: OffsetDateTime? = null
+    var until: OffsetDateTime? = null
+}
diff --git a/kotlin/lib/src/main/kotlin/EventType.kt b/kotlin/lib/src/main/kotlin/EventType.kt
index c31840167..2f29a1063 100644
--- a/kotlin/lib/src/main/kotlin/EventType.kt
+++ b/kotlin/lib/src/main/kotlin/EventType.kt
@@ -19,7 +19,7 @@ class EventType internal constructor(token: String, options: SvixOptions) {
 
     suspend fun list(options: EventTypeListOptions = EventTypeListOptions()): ListResponseEventTypeOut {
         try {
-            return api.listEventTypesApiV1EventTypeGet(options.iterator, options.limit, options.withContent, options.includeAchived, null)
+            return api.v1EventTypeList(options.limit, options.iterator, null, options.includeAchived, options.withContent)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -27,7 +27,7 @@ class EventType internal constructor(token: String, options: SvixOptions) {
 
     suspend fun create(eventTypeIn: EventTypeIn, options: PostOptions = PostOptions()): EventTypeOut {
         try {
-            return api.createEventTypeApiV1EventTypePost(eventTypeIn, options.idempotencyKey)
+            return api.v1EventTypeCreate(eventTypeIn, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -35,7 +35,7 @@ class EventType internal constructor(token: String, options: SvixOptions) {
 
     suspend fun get(eventTypeName: String): EventTypeOut {
         try {
-            return api.getEventTypeApiV1EventTypeEventTypeNameGet(eventTypeName, null)
+            return api.v1EventTypeGet(eventTypeName)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -43,7 +43,7 @@ class EventType internal constructor(token: String, options: SvixOptions) {
 
     suspend fun update(eventTypeName: String, eventTypeUpdate: EventTypeUpdate): EventTypeOut {
         try {
-            return api.updateEventTypeApiV1EventTypeEventTypeNamePut(eventTypeName, eventTypeUpdate, null)
+            return api.v1EventTypeUpdate(eventTypeName, eventTypeUpdate)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -51,7 +51,7 @@ class EventType internal constructor(token: String, options: SvixOptions) {
 
     suspend fun delete(eventTypeName: String) {
         try {
-            api.deleteEventTypeApiV1EventTypeEventTypeNameDelete(eventTypeName, null, null)
+            api.v1EventTypeDelete(eventTypeName, null)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
diff --git a/kotlin/lib/src/main/kotlin/Integration.kt b/kotlin/lib/src/main/kotlin/Integration.kt
index 4d50cbd28..276737f10 100644
--- a/kotlin/lib/src/main/kotlin/Integration.kt
+++ b/kotlin/lib/src/main/kotlin/Integration.kt
@@ -20,7 +20,7 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun list(appId: String, options: IntegrationListOptions = IntegrationListOptions()): ListResponseIntegrationOut {
         try {
-            return api.listIntegrationsApiV1AppAppIdIntegrationGet(appId, options.iterator, options.limit, null)
+            return api.v1IntegrationList(appId, options.limit, options.iterator)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -28,7 +28,7 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun create(appId: String, integIn: IntegrationIn, options: PostOptions = PostOptions()): IntegrationOut {
         try {
-            return api.createIntegrationApiV1AppAppIdIntegrationPost(appId, integIn, options.idempotencyKey)
+            return api.v1IntegrationCreate(appId, integIn, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -36,7 +36,7 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun get(appId: String, integId: String): IntegrationOut {
         try {
-            return api.getIntegrationApiV1AppAppIdIntegrationIntegIdGet(integId, appId, null)
+            return api.v1IntegrationGet(appId, integId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -44,7 +44,7 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun update(appId: String, integId: String, integUpdate: IntegrationUpdate): IntegrationOut {
         try {
-            return api.updateIntegrationApiV1AppAppIdIntegrationIntegIdPut(integId, appId, integUpdate, null)
+            return api.v1IntegrationUpdate(appId, integId, integUpdate)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -52,7 +52,7 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun delete(appId: String, integId: String) {
         try {
-            api.deleteIntegrationApiV1AppAppIdIntegrationIntegIdDelete(integId, appId, null)
+            api.v1IntegrationDelete(appId, integId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -60,7 +60,7 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun getKey(appId: String, integId: String): IntegrationKeyOut {
         try {
-            return api.getIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGet(integId, appId, null)
+            return api.v1IntegrationGetKey(appId, integId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -68,9 +68,9 @@ class Integration internal constructor(token: String, options: SvixOptions) {
 
     suspend fun rotateKey(appId: String, integId: String, options: PostOptions = PostOptions()): IntegrationKeyOut {
         try {
-            return api.rotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePost(
-                integId,
+            return api.v1IntegrationRotateKey(
                 appId,
+                integId,
                 options.idempotencyKey
             )
         } catch (e: Exception) {
diff --git a/kotlin/lib/src/main/kotlin/Message.kt b/kotlin/lib/src/main/kotlin/Message.kt
index a58de51b6..3cdc688e8 100644
--- a/kotlin/lib/src/main/kotlin/Message.kt
+++ b/kotlin/lib/src/main/kotlin/Message.kt
@@ -18,15 +18,15 @@ class Message internal constructor(token: String, options: SvixOptions) {
 
     suspend fun list(appId: String, options: MessageListOptions = MessageListOptions()): ListResponseMessageOut {
         try {
-            return api.listMessagesApiV1AppAppIdMsgGet(
+            return api.v1MessageList(
                 appId,
-                options.iterator,
                 options.limit,
-                options.eventTypes,
+                options.iterator,
                 options.channel,
                 options.before,
                 options.after,
-                null
+                options.withContent,
+                HashSet(options.eventTypes)
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -35,7 +35,7 @@ class Message internal constructor(token: String, options: SvixOptions) {
 
     suspend fun create(appId: String, messageIn: MessageIn, options: PostOptions = PostOptions()): MessageOut {
         try {
-            return api.createMessageApiV1AppAppIdMsgPost(appId, messageIn, null, options.idempotencyKey)
+            return api.v1MessageCreate(appId, messageIn, null, options.idempotencyKey)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -43,7 +43,7 @@ class Message internal constructor(token: String, options: SvixOptions) {
 
     suspend fun get(msgId: String, appId: String): MessageOut {
         try {
-            return api.getMessageApiV1AppAppIdMsgMsgIdGet(msgId, appId, null)
+            return api.v1MessageGet(appId, msgId, null)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -51,7 +51,7 @@ class Message internal constructor(token: String, options: SvixOptions) {
 
     suspend fun expungeContent(msgId: String, appId: String) {
         try {
-            return api.expungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDelete(msgId, appId, null)
+            return api.v1MessageExpungeContent(appId, msgId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
diff --git a/kotlin/lib/src/main/kotlin/MessageAttempt.kt b/kotlin/lib/src/main/kotlin/MessageAttempt.kt
index 9ecfb0801..ba9c439a2 100644
--- a/kotlin/lib/src/main/kotlin/MessageAttempt.kt
+++ b/kotlin/lib/src/main/kotlin/MessageAttempt.kt
@@ -28,19 +28,18 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
 
     suspend fun listByMsg(appId: String, msgId: String, options: MessageAttemptListOptions = MessageAttemptListOptions()): ListResponseMessageAttemptOut {
         try {
-            return api.listAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGet(
+            return api.v1MessageAttemptListByMsg(
                 appId,
                 msgId,
-                null,
-                options.iterator,
                 options.limit,
+                options.iterator,
                 options.messageStatus,
                 options.statusCodeClass,
-                options.eventTypes,
                 options.channel,
+                options.endpointId,
                 options.before,
                 options.after,
-                null
+                HashSet(options.eventTypes)
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -49,18 +48,17 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
 
     suspend fun listByEndpoint(appId: String, endpointId: String, options: MessageAttemptListOptions = MessageAttemptListOptions()): ListResponseMessageAttemptOut {
         try {
-            return api.listAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGet(
+            return api.v1MessageAttemptListByEndpoint(
                 appId,
                 endpointId,
-                options.iterator,
                 options.limit,
+                options.iterator,
                 options.messageStatus,
                 options.statusCodeClass,
-                options.eventTypes,
                 options.channel,
                 options.before,
                 options.after,
-                null
+                HashSet(options.eventTypes)
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -69,7 +67,7 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
 
     suspend fun get(appId: String, msgId: String, attemptId: String): MessageAttemptOut {
         try {
-            return api.getAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGet(attemptId, msgId, appId, null)
+            return api.v1MessageAttemptGet(appId, msgId, attemptId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
@@ -77,10 +75,10 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
 
     suspend fun resend(appId: String, msgId: String, endpointId: String, options: PostOptions = PostOptions()) {
         try {
-            api.resendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPost(
-                endpointId,
-                msgId,
+            api.v1MessageAttemptResend(
                 appId,
+                msgId,
+                endpointId,
                 options.idempotencyKey
             )
         } catch (e: Exception) {
@@ -94,16 +92,16 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
         options: MessageAttemptListOptions = MessageAttemptListOptions()
     ): ListResponseEndpointMessageOut {
         try {
-            return api.listAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGet(
-                endpointId,
+            return api.v1MessageAttemptListAttemptedMessages(
                 appId,
-                options.iterator,
+                endpointId,
                 options.limit,
+                options.iterator,
                 options.channel,
                 options.messageStatus,
                 options.before,
                 options.after,
-                null
+                options.withContent
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -116,12 +114,11 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
         options: MessageAttemptListOptions = MessageAttemptListOptions()
     ): ListResponseMessageEndpointOut {
         try {
-            return api.listAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGet(
-                msgId,
+            return api.v1MessageAttemptListAttemptedDestinations(
                 appId,
-                options.iterator,
+                msgId,
                 options.limit,
-                null
+                options.iterator
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -135,18 +132,17 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
         options: MessageAttemptListOptions = MessageAttemptListOptions()
     ): ListResponseMessageAttemptEndpointOut {
         return try {
-            api.listAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGet(
-                msgId,
+            api.v1MessageAttemptListByEndpointDeprecated(
                 appId,
+                msgId,
                 endpointId,
-                options.iterator,
                 options.limit,
-                options.eventTypes,
+                options.iterator,
                 options.channel,
                 options.messageStatus,
                 options.before,
                 options.after,
-                null
+                HashSet(options.eventTypes)
             )
         } catch (e: Exception) {
             throw ApiException.wrap(e)
@@ -155,7 +151,7 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
 
     suspend fun expungeContent(appId: String, msgId: String, attemptId: String) {
         try {
-            return api.expungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDelete(attemptId, msgId, appId, null)
+            return api.v1MessageAttemptExpungeContent(appId, msgId, attemptId)
         } catch (e: Exception) {
             throw ApiException.wrap(e)
         }
diff --git a/kotlin/lib/src/main/kotlin/MessageAttemptListOptions.kt b/kotlin/lib/src/main/kotlin/MessageAttemptListOptions.kt
index adb111606..c05276b88 100644
--- a/kotlin/lib/src/main/kotlin/MessageAttemptListOptions.kt
+++ b/kotlin/lib/src/main/kotlin/MessageAttemptListOptions.kt
@@ -4,7 +4,7 @@ import com.svix.kotlin.models.MessageStatus
 import com.svix.kotlin.models.StatusCodeClass
 import java.time.OffsetDateTime
 
-class MessageAttemptListOptions(var messageStatus: MessageStatus? = null, var before: OffsetDateTime? = null, var after: OffsetDateTime? = null, var eventTypes: List<String>? = null, var statusCodeClass: StatusCodeClass? = null, var channel: String? = null) : ListOptions() {
+class MessageAttemptListOptions(var messageStatus: MessageStatus? = null, var before: OffsetDateTime? = null, var after: OffsetDateTime? = null, var eventTypes: List<String>? = null, var statusCodeClass: StatusCodeClass? = null, var channel: String? = null, var endpointId: String? = null, var withContent: Boolean? = null) : ListOptions() {
     fun messageStatus(messageStatus: MessageStatus) = apply { this.messageStatus = messageStatus }
 
     fun before(before: OffsetDateTime) = apply { this.before = before }
@@ -18,4 +18,6 @@ class MessageAttemptListOptions(var messageStatus: MessageStatus? = null, var be
     override fun iterator(iterator: String) = apply { super.iterator(iterator) }
 
     override fun limit(limit: Int) = apply { super.limit(limit) }
+
+    fun endpointId(endpointId: String) = apply { this.endpointId = endpointId }
 }
diff --git a/kotlin/lib/src/main/kotlin/MessageListOptions.kt b/kotlin/lib/src/main/kotlin/MessageListOptions.kt
index 3c5e2b401..06e86d2b2 100644
--- a/kotlin/lib/src/main/kotlin/MessageListOptions.kt
+++ b/kotlin/lib/src/main/kotlin/MessageListOptions.kt
@@ -7,6 +7,7 @@ class MessageListOptions : ListOptions() {
     var before: OffsetDateTime? = null
     var after: OffsetDateTime? = null
     var channel: String? = null
+    var withContent: Boolean? = null
 
     fun eventTypes(eventTypes: List<String>) = apply { this.eventTypes = eventTypes }
 
@@ -18,4 +19,6 @@ class MessageListOptions : ListOptions() {
     override fun iterator(iterator: String) = apply { super.iterator(iterator) }
 
     override fun limit(limit: Int) = apply { super.limit(limit) }
+
+    fun withContent(withContent: Boolean) = apply { this.withContent = withContent }
 }
diff --git a/kotlin/lib/src/main/kotlin/SvixOptions.kt b/kotlin/lib/src/main/kotlin/SvixOptions.kt
index 72a0120e8..bd56bc412 100644
--- a/kotlin/lib/src/main/kotlin/SvixOptions.kt
+++ b/kotlin/lib/src/main/kotlin/SvixOptions.kt
@@ -6,7 +6,7 @@ data class SvixOptions(
     val numRetries: Int? = null
 ) {
 
-    private val version = "0.81.0"
+    private val version = "1.4.12"
 
     var serverUrl: String
         get() = this.wantedServerUrl ?: DEFAULT_URL
diff --git a/openapi.json b/openapi.json
index 98c15780e..edcec83d7 100644
--- a/openapi.json
+++ b/openapi.json
@@ -4,7 +4,7 @@
             "AppPortalAccessIn": {
                 "properties": {
                     "featureFlags": {
-                        "default": [],
+                        "description": "The set of feature flags the created token will have access to.",
                         "example": [],
                         "items": {
                             "example": "cool-new-feature",
@@ -12,19 +12,16 @@
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
                         },
-                        "title": "Featureflags",
                         "type": "array",
                         "uniqueItems": true
                     }
                 },
-                "title": "AppPortalAccessIn",
                 "type": "object"
             },
             "AppPortalAccessOut": {
                 "properties": {
                     "token": {
                         "example": "appsk_kV3ts5tKPNJN4Dl25cMTfUNdmabxbX0O",
-                        "title": "Token",
                         "type": "string"
                     },
                     "url": {
@@ -32,15 +29,62 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "url",
-                    "token"
+                    "token",
+                    "url"
+                ],
+                "type": "object"
+            },
+            "AppUsageStatsIn": {
+                "properties": {
+                    "appIds": {
+                        "items": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "since": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "until": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "since",
+                    "until"
+                ],
+                "type": "object"
+            },
+            "AppUsageStatsOut": {
+                "properties": {
+                    "id": {
+                        "type": "string"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/BackgroundTaskStatus"
+                    },
+                    "task": {
+                        "$ref": "#/components/schemas/BackgroundTaskType"
+                    }
+                },
+                "required": [
+                    "id",
+                    "status",
+                    "task"
                 ],
-                "title": "AppPortalAccessOut",
                 "type": "object"
             },
             "ApplicationIn": {
@@ -49,20 +93,18 @@
                         "additionalProperties": {
                             "type": "string"
                         },
-                        "nullable": true,
-                        "title": "Metadata",
+                        "default": {},
                         "type": "object"
                     },
                     "name": {
                         "example": "My first application",
-                        "title": "Name",
+                        "minLength": 1,
                         "type": "string"
                     },
                     "rateLimit": {
-                        "example": 1000,
-                        "exclusiveMinimum": 0.0,
+                        "format": "uint16",
+                        "minimum": 1,
                         "nullable": true,
-                        "title": "Ratelimit",
                         "type": "integer"
                     },
                     "uid": {
@@ -72,100 +114,118 @@
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Uid",
                         "type": "string"
                     }
                 },
                 "required": [
                     "name"
                 ],
-                "title": "ApplicationIn",
                 "type": "object"
             },
             "ApplicationOut": {
                 "properties": {
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "id": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "metadata": {
                         "additionalProperties": {
                             "type": "string"
                         },
-                        "nullable": true,
-                        "title": "Metadata",
                         "type": "object"
                     },
                     "name": {
                         "example": "My first application",
-                        "title": "Name",
                         "type": "string"
                     },
                     "rateLimit": {
-                        "example": 1000,
-                        "exclusiveMinimum": 0.0,
+                        "format": "uint16",
+                        "minimum": 0,
                         "nullable": true,
-                        "title": "Ratelimit",
                         "type": "integer"
                     },
                     "uid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Uid",
                         "type": "string"
                     },
                     "updatedAt": {
                         "format": "date-time",
-                        "title": "Updatedat",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "name",
-                    "id",
                     "createdAt",
+                    "id",
+                    "metadata",
+                    "name",
                     "updatedAt"
                 ],
-                "title": "ApplicationOut",
+                "type": "object"
+            },
+            "ApplicationPatch": {
+                "properties": {
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "type": "object"
+                    },
+                    "name": {
+                        "type": "string"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "uid": {
+                        "description": "The app's UID",
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    }
+                },
                 "type": "object"
             },
             "ApplicationStats": {
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "messageDestinations": {
-                        "title": "Messagedestinations",
+                        "format": "int",
                         "type": "integer"
                     }
                 },
                 "required": [
-                    "messageDestinations",
-                    "appId"
+                    "appId",
+                    "messageDestinations"
                 ],
-                "title": "ApplicationStats",
                 "type": "object"
             },
             "ApplicationTokenExpireIn": {
@@ -173,36 +233,34 @@
                     "expiry": {
                         "description": "How many seconds until the old key is expired.",
                         "example": 60,
-                        "maximum": 259200.0,
-                        "minimum": 0.0,
+                        "format": "int64",
+                        "maximum": 259200,
+                        "minimum": 0,
                         "nullable": true,
-                        "title": "Expiry",
                         "type": "integer"
                     }
                 },
-                "title": "ApplicationTokenExpireIn",
                 "type": "object"
             },
             "AttemptStatisticsData": {
                 "properties": {
                     "failureCount": {
                         "items": {
+                            "format": "int",
                             "type": "integer"
                         },
                         "nullable": true,
-                        "title": "Failurecount",
                         "type": "array"
                     },
                     "successCount": {
                         "items": {
+                            "format": "int",
                             "type": "integer"
                         },
                         "nullable": true,
-                        "title": "Successcount",
                         "type": "array"
                     }
                 },
-                "title": "AttemptStatisticsData",
                 "type": "object"
             },
             "AttemptStatisticsResponse": {
@@ -212,7 +270,6 @@
                     },
                     "endDate": {
                         "format": "date-time",
-                        "title": "Enddate",
                         "type": "string"
                     },
                     "period": {
@@ -220,19 +277,60 @@
                     },
                     "startDate": {
                         "format": "date-time",
-                        "title": "Startdate",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "startDate",
+                    "data",
                     "endDate",
                     "period",
-                    "data"
+                    "startDate"
+                ],
+                "type": "object"
+            },
+            "BackgroundTaskData": {
+                "type": "object"
+            },
+            "BackgroundTaskOut": {
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/BackgroundTaskData"
+                    },
+                    "id": {
+                        "type": "string"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/BackgroundTaskStatus"
+                    },
+                    "task": {
+                        "$ref": "#/components/schemas/BackgroundTaskType"
+                    }
+                },
+                "required": [
+                    "data",
+                    "id",
+                    "status",
+                    "task"
                 ],
-                "title": "AttemptStatisticsResponse",
                 "type": "object"
             },
+            "BackgroundTaskStatus": {
+                "enum": [
+                    "running",
+                    "finished",
+                    "failed"
+                ],
+                "type": "string"
+            },
+            "BackgroundTaskType": {
+                "enum": [
+                    "endpoint.replay",
+                    "endpoint.recover",
+                    "application.stats",
+                    "message.broadcast"
+                ],
+                "type": "string"
+            },
             "BorderRadiusConfig": {
                 "properties": {
                     "button": {
@@ -248,11 +346,9 @@
                         "nullable": true
                     }
                 },
-                "title": "BorderRadiusConfig",
                 "type": "object"
             },
             "BorderRadiusEnum": {
-                "description": "An enumeration.",
                 "enum": [
                     "none",
                     "lg",
@@ -260,7 +356,6 @@
                     "sm",
                     "full"
                 ],
-                "title": "BorderRadiusEnum",
                 "type": "string"
             },
             "CustomColorPalette": {
@@ -268,41 +363,34 @@
                     "backgroundHover": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Backgroundhover",
                         "type": "string"
                     },
                     "backgroundPrimary": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Backgroundprimary",
                         "type": "string"
                     },
                     "backgroundSecondary": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Backgroundsecondary",
                         "type": "string"
                     },
                     "interactiveAccent": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Interactiveaccent",
                         "type": "string"
                     },
                     "textDanger": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Textdanger",
                         "type": "string"
                     },
                     "textPrimary": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Textprimary",
                         "type": "string"
                     }
                 },
-                "title": "CustomColorPalette",
                 "type": "object"
             },
             "CustomThemeOverride": {
@@ -316,14 +404,12 @@
                         "nullable": true
                     }
                 },
-                "title": "CustomThemeOverride",
                 "type": "object"
             },
             "DashboardAccessOut": {
                 "properties": {
                     "token": {
                         "example": "appsk_kV3ts5tKPNJN4Dl25cMTfUNdmabxbX0O",
-                        "title": "Token",
                         "type": "string"
                     },
                     "url": {
@@ -331,28 +417,17 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "url",
-                    "token"
+                    "token",
+                    "url"
                 ],
-                "title": "DashboardAccessOut",
                 "type": "object"
             },
             "EndpointCreatedEvent": {
                 "description": "Sent when an endpoint is created.",
-                "example": {
-                    "data": {
-                        "appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "appUid": "unique-app-identifier",
-                        "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "endpointUid": "unique-endpoint-identifier"
-                    },
-                    "type": "endpoint.created"
-                },
                 "properties": {
                     "data": {
                         "$ref": "#/components/schemas/EndpointCreatedEventData"
@@ -362,46 +437,43 @@
                         "enum": [
                             "endpoint.created"
                         ],
-                        "title": "Type",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "data"
+                    "data",
+                    "type"
                 ],
-                "title": "EndpointCreatedEvent",
                 "type": "object"
             },
             "EndpointCreatedEventData": {
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "endpointUid": {
-                        "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "description": "The ep's UID",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Endpointuid",
                         "type": "string"
                     }
                 },
@@ -409,20 +481,10 @@
                     "appId",
                     "endpointId"
                 ],
-                "title": "EndpointCreatedEventData",
                 "type": "object"
             },
             "EndpointDeletedEvent": {
                 "description": "Sent when an endpoint is deleted.",
-                "example": {
-                    "data": {
-                        "appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "appUid": "unique-app-identifier",
-                        "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "endpointUid": "unique-endpoint-identifier"
-                    },
-                    "type": "endpoint.deleted"
-                },
                 "properties": {
                     "data": {
                         "$ref": "#/components/schemas/EndpointDeletedEventData"
@@ -432,46 +494,43 @@
                         "enum": [
                             "endpoint.deleted"
                         ],
-                        "title": "Type",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "data"
+                    "data",
+                    "type"
                 ],
-                "title": "EndpointDeletedEvent",
                 "type": "object"
             },
             "EndpointDeletedEventData": {
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "endpointUid": {
-                        "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "description": "The ep's UID",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Endpointuid",
                         "type": "string"
                     }
                 },
@@ -479,21 +538,10 @@
                     "appId",
                     "endpointId"
                 ],
-                "title": "EndpointDeletedEventData",
                 "type": "object"
             },
             "EndpointDisabledEvent": {
                 "description": "Sent when an endpoint has been automatically disabled after continuous failures.",
-                "example": {
-                    "data": {
-                        "appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "appUid": "unique-app-identifier",
-                        "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "endpointUid": "unique-endpoint-identifier",
-                        "failSince": "1970-01-01T00:00:00"
-                    },
-                    "type": "endpoint.disabled"
-                },
                 "properties": {
                     "data": {
                         "$ref": "#/components/schemas/EndpointDisabledEventData"
@@ -503,51 +551,48 @@
                         "enum": [
                             "endpoint.disabled"
                         ],
-                        "title": "Type",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "data"
+                    "data",
+                    "type"
                 ],
-                "title": "EndpointDisabledEvent",
                 "type": "object"
             },
             "EndpointDisabledEventData": {
+                "description": "Sent when an endpoint has been automatically disabled after continuous failures.",
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "endpointUid": {
-                        "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "description": "The ep's UID",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Endpointuid",
                         "type": "string"
                     },
                     "failSince": {
                         "format": "date-time",
-                        "title": "Failsince",
                         "type": "string"
                     }
                 },
@@ -556,7 +601,6 @@
                     "endpointId",
                     "failSince"
                 ],
-                "title": "EndpointDisabledEventData",
                 "type": "object"
             },
             "EndpointHeadersIn": {
@@ -569,14 +613,12 @@
                             "X-Example": "123",
                             "X-Foobar": "Bar"
                         },
-                        "title": "Headers",
                         "type": "object"
                     }
                 },
                 "required": [
                     "headers"
                 ],
-                "title": "EndpointHeadersIn",
                 "type": "object"
             },
             "EndpointHeadersOut": {
@@ -590,7 +632,6 @@
                             "X-Example": "123",
                             "X-Foobar": "Bar"
                         },
-                        "title": "Headers",
                         "type": "object"
                     },
                     "sensitive": {
@@ -598,10 +639,8 @@
                             "Authorization"
                         ],
                         "items": {
-                            "example": "X-Foobar",
                             "type": "string"
                         },
-                        "title": "Sensitive",
                         "type": "array",
                         "uniqueItems": true
                     }
@@ -610,27 +649,25 @@
                     "headers",
                     "sensitive"
                 ],
-                "title": "EndpointHeadersOut",
                 "type": "object"
             },
             "EndpointHeadersPatchIn": {
                 "properties": {
                     "headers": {
                         "additionalProperties": {
+                            "nullable": true,
                             "type": "string"
                         },
                         "example": {
                             "X-Example": "123",
                             "X-Foobar": "Bar"
                         },
-                        "title": "Headers",
                         "type": "object"
                     }
                 },
                 "required": [
                     "headers"
                 ],
-                "title": "EndpointHeadersPatchIn",
                 "type": "object"
             },
             "EndpointIn": {
@@ -650,20 +687,17 @@
                         "maxItems": 10,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "description": {
                         "default": "",
                         "example": "An example endpoint name",
-                        "title": "Description",
                         "type": "string"
                     },
                     "disabled": {
                         "default": false,
                         "example": false,
-                        "title": "Disabled",
                         "type": "boolean"
                     },
                     "filterTypes": {
@@ -672,6 +706,7 @@
                             "user.deleted"
                         ],
                         "items": {
+                            "description": "The event type's name",
                             "example": "user.signup",
                             "maxLength": 256,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
@@ -679,7 +714,6 @@
                         },
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Filtertypes",
                         "type": "array",
                         "uniqueItems": true
                     },
@@ -687,16 +721,13 @@
                         "additionalProperties": {
                             "type": "string"
                         },
-                        "nullable": true,
-                        "title": "Metadata",
+                        "default": {},
                         "type": "object"
                     },
                     "rateLimit": {
-                        "example": 1000,
-                        "maximum": 65535.0,
-                        "minimum": 1.0,
+                        "format": "uint16",
+                        "minimum": 1,
                         "nullable": true,
-                        "title": "Ratelimit",
                         "type": "integer"
                     },
                     "secret": {
@@ -704,17 +735,15 @@
                         "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
                         "nullable": true,
                         "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
-                        "title": "Secret",
                         "type": "string"
                     },
                     "uid": {
                         "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Uid",
                         "type": "string"
                     },
                     "url": {
@@ -722,13 +751,12 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     },
                     "version": {
                         "example": 1,
-                        "exclusiveMinimum": 0.0,
-                        "title": "Version",
+                        "format": "uint16",
+                        "minimum": 1,
                         "type": "integer"
                     }
                 },
@@ -736,10 +764,10 @@
                     "url",
                     "version"
                 ],
-                "title": "EndpointIn",
                 "type": "object"
             },
             "EndpointMessageOut": {
+                "description": "A model containing information on a given message plus additional fields on the last attempt for that message.",
                 "properties": {
                     "channels": {
                         "description": "List of free-form identifiers that endpoints can filter by",
@@ -756,36 +784,33 @@
                         "maxItems": 5,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "eventId": {
                         "description": "Optional unique identifier for the message",
-                        "example": "evt_pNZKtWg8Azow",
+                        "example": "unique-msg-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventid",
                         "type": "string"
                     },
                     "eventType": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventtype",
                         "type": "string"
                     },
                     "id": {
+                        "description": "The msg's ID",
                         "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "nextAttempt": {
                         "format": "date-time",
                         "nullable": true,
-                        "title": "Nextattempt",
                         "type": "string"
                     },
                     "payload": {
@@ -793,7 +818,6 @@
                             "email": "test@example.com",
                             "username": "test_user"
                         },
-                        "title": "Payload",
                         "type": "object"
                     },
                     "status": {
@@ -801,18 +825,16 @@
                     },
                     "timestamp": {
                         "format": "date-time",
-                        "title": "Timestamp",
                         "type": "string"
                     }
                 },
                 "required": [
                     "eventType",
-                    "payload",
                     "id",
-                    "timestamp",
-                    "status"
+                    "payload",
+                    "status",
+                    "timestamp"
                 ],
-                "title": "EndpointMessageOut",
                 "type": "object"
             },
             "EndpointOut": {
@@ -832,25 +854,20 @@
                         "maxItems": 10,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "description": {
-                        "default": "",
-                        "example": "An example endpoint name",
-                        "title": "Description",
+                        "description": "An example endpoint name",
                         "type": "string"
                     },
                     "disabled": {
                         "default": false,
                         "example": false,
-                        "title": "Disabled",
                         "type": "boolean"
                     },
                     "filterTypes": {
@@ -859,6 +876,7 @@
                             "user.deleted"
                         ],
                         "items": {
+                            "description": "The event type's name",
                             "example": "user.signup",
                             "maxLength": 256,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
@@ -866,44 +884,37 @@
                         },
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Filtertypes",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "id": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "metadata": {
                         "additionalProperties": {
                             "type": "string"
                         },
-                        "nullable": true,
-                        "title": "Metadata",
                         "type": "object"
                     },
                     "rateLimit": {
-                        "example": 1000,
-                        "maximum": 65535.0,
-                        "minimum": 1.0,
+                        "format": "uint16",
+                        "minimum": 0,
                         "nullable": true,
-                        "title": "Ratelimit",
                         "type": "integer"
                     },
                     "uid": {
                         "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Uid",
                         "type": "string"
                     },
                     "updatedAt": {
                         "format": "date-time",
-                        "title": "Updatedat",
                         "type": "string"
                     },
                     "url": {
@@ -911,24 +922,95 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     },
                     "version": {
                         "example": 1,
-                        "exclusiveMinimum": 0.0,
-                        "title": "Version",
+                        "format": "int32",
+                        "minimum": 1,
                         "type": "integer"
                     }
                 },
                 "required": [
-                    "url",
-                    "version",
-                    "id",
                     "createdAt",
-                    "updatedAt"
+                    "description",
+                    "id",
+                    "metadata",
+                    "updatedAt",
+                    "url",
+                    "version"
                 ],
-                "title": "EndpointOut",
+                "type": "object"
+            },
+            "EndpointPatch": {
+                "properties": {
+                    "channels": {
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "description": {
+                        "type": "string"
+                    },
+                    "disabled": {
+                        "type": "boolean"
+                    },
+                    "filterTypes": {
+                        "items": {
+                            "description": "The event type's name",
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "type": "object"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "secret": {
+                        "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
+                        "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
+                        "nullable": true,
+                        "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
+                        "type": "string"
+                    },
+                    "uid": {
+                        "description": "The ep's UID",
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "url": {
+                        "format": "uri",
+                        "type": "string"
+                    },
+                    "version": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "type": "integer"
+                    }
+                },
                 "type": "object"
             },
             "EndpointSecretOut": {
@@ -937,56 +1019,52 @@
                         "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
                         "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
                         "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
-                        "title": "Key",
                         "type": "string"
                     }
                 },
                 "required": [
                     "key"
                 ],
-                "title": "EndpointSecretOut",
                 "type": "object"
             },
             "EndpointSecretRotateIn": {
                 "properties": {
                     "key": {
+                        "default": null,
                         "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
                         "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
                         "nullable": true,
                         "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
-                        "title": "Key",
                         "type": "string"
                     }
                 },
-                "title": "EndpointSecretRotateIn",
                 "type": "object"
             },
             "EndpointStats": {
                 "properties": {
                     "fail": {
-                        "title": "Fail",
+                        "format": "int64",
                         "type": "integer"
                     },
                     "pending": {
-                        "title": "Pending",
+                        "format": "int64",
                         "type": "integer"
                     },
                     "sending": {
-                        "title": "Sending",
+                        "format": "int64",
                         "type": "integer"
                     },
                     "success": {
-                        "title": "Success",
+                        "format": "int64",
                         "type": "integer"
                     }
                 },
                 "required": [
-                    "sending",
-                    "success",
+                    "fail",
                     "pending",
-                    "fail"
+                    "sending",
+                    "success"
                 ],
-                "title": "EndpointStats",
                 "type": "object"
             },
             "EndpointTransformationIn": {
@@ -995,16 +1073,12 @@
                         "maxLength": 51200,
                         "minLength": 10,
                         "nullable": true,
-                        "title": "Code",
                         "type": "string"
                     },
                     "enabled": {
-                        "default": false,
-                        "title": "Enabled",
                         "type": "boolean"
                     }
                 },
-                "title": "EndpointTransformationIn",
                 "type": "object"
             },
             "EndpointTransformationOut": {
@@ -1013,16 +1087,13 @@
                         "maxLength": 51200,
                         "minLength": 10,
                         "nullable": true,
-                        "title": "Code",
                         "type": "string"
                     },
                     "enabled": {
                         "default": false,
-                        "title": "Enabled",
                         "type": "boolean"
                     }
                 },
-                "title": "EndpointTransformationOut",
                 "type": "object"
             },
             "EndpointTransformationSimulateIn": {
@@ -1035,24 +1106,22 @@
                             "type": "string"
                         },
                         "nullable": true,
-                        "title": "Channels",
-                        "type": "array"
+                        "type": "array",
+                        "uniqueItems": true
                     },
                     "code": {
                         "maxLength": 51200,
                         "minLength": 10,
-                        "title": "Code",
                         "type": "string"
                     },
                     "eventType": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventtype",
                         "type": "string"
                     },
                     "payload": {
-                        "title": "Payload",
                         "type": "object"
                     }
                 },
@@ -1061,7 +1130,6 @@
                     "eventType",
                     "payload"
                 ],
-                "title": "EndpointTransformationSimulateIn",
                 "type": "object"
             },
             "EndpointTransformationSimulateOut": {
@@ -1071,22 +1139,19 @@
                         "nullable": true
                     },
                     "payload": {
-                        "title": "Payload",
-                        "type": "object"
+                        "type": "string"
                     },
                     "url": {
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "url",
-                    "payload"
+                    "payload",
+                    "url"
                 ],
-                "title": "EndpointTransformationSimulateOut",
                 "type": "object"
             },
             "EndpointUpdate": {
@@ -1106,20 +1171,17 @@
                         "maxItems": 10,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "description": {
                         "default": "",
                         "example": "An example endpoint name",
-                        "title": "Description",
                         "type": "string"
                     },
                     "disabled": {
                         "default": false,
                         "example": false,
-                        "title": "Disabled",
                         "type": "boolean"
                     },
                     "filterTypes": {
@@ -1128,6 +1190,7 @@
                             "user.deleted"
                         ],
                         "items": {
+                            "description": "The event type's name",
                             "example": "user.signup",
                             "maxLength": 256,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
@@ -1135,7 +1198,6 @@
                         },
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Filtertypes",
                         "type": "array",
                         "uniqueItems": true
                     },
@@ -1143,26 +1205,22 @@
                         "additionalProperties": {
                             "type": "string"
                         },
-                        "nullable": true,
-                        "title": "Metadata",
+                        "default": {},
                         "type": "object"
                     },
                     "rateLimit": {
-                        "example": 1000,
-                        "maximum": 65535.0,
-                        "minimum": 1.0,
+                        "format": "uint16",
+                        "minimum": 1,
                         "nullable": true,
-                        "title": "Ratelimit",
                         "type": "integer"
                     },
                     "uid": {
                         "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Uid",
                         "type": "string"
                     },
                     "url": {
@@ -1170,13 +1228,12 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     },
                     "version": {
                         "example": 1,
-                        "exclusiveMinimum": 0.0,
-                        "title": "Version",
+                        "format": "uint16",
+                        "minimum": 1,
                         "type": "integer"
                     }
                 },
@@ -1184,20 +1241,10 @@
                     "url",
                     "version"
                 ],
-                "title": "EndpointUpdate",
                 "type": "object"
             },
             "EndpointUpdatedEvent": {
                 "description": "Sent when an endpoint is updated.",
-                "example": {
-                    "data": {
-                        "appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "appUid": "unique-app-identifier",
-                        "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "endpointUid": "unique-endpoint-identifier"
-                    },
-                    "type": "endpoint.updated"
-                },
                 "properties": {
                     "data": {
                         "$ref": "#/components/schemas/EndpointUpdatedEventData"
@@ -1207,46 +1254,43 @@
                         "enum": [
                             "endpoint.updated"
                         ],
-                        "title": "Type",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "data"
+                    "data",
+                    "type"
                 ],
-                "title": "EndpointUpdatedEvent",
                 "type": "object"
             },
             "EndpointUpdatedEventData": {
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "endpointUid": {
-                        "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "description": "The ep's UID",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Endpointuid",
                         "type": "string"
                     }
                 },
@@ -1254,14 +1298,12 @@
                     "appId",
                     "endpointId"
                 ],
-                "title": "EndpointUpdatedEventData",
                 "type": "object"
             },
             "EnvironmentIn": {
                 "properties": {
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "eventTypes": {
@@ -1269,7 +1311,6 @@
                             "$ref": "#/components/schemas/EventTypeIn"
                         },
                         "nullable": true,
-                        "title": "Eventtypes",
                         "type": "array"
                     },
                     "settings": {
@@ -1277,29 +1318,26 @@
                         "nullable": true
                     },
                     "version": {
-                        "title": "Version",
+                        "format": "int",
                         "type": "integer"
                     }
                 },
                 "required": [
-                    "version",
-                    "createdAt"
+                    "createdAt",
+                    "version"
                 ],
-                "title": "EnvironmentIn",
                 "type": "object"
             },
             "EnvironmentOut": {
                 "properties": {
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "eventTypes": {
                         "items": {
                             "$ref": "#/components/schemas/EventTypeOut"
                         },
-                        "title": "Eventtypes",
                         "type": "array"
                     },
                     "settings": {
@@ -1308,7 +1346,7 @@
                     },
                     "version": {
                         "default": 1,
-                        "title": "Version",
+                        "format": "int",
                         "type": "integer"
                     }
                 },
@@ -1316,7 +1354,6 @@
                     "createdAt",
                     "eventTypes"
                 ],
-                "title": "EnvironmentOut",
                 "type": "object"
             },
             "EnvironmentSettingsOut": {
@@ -1332,14 +1369,12 @@
                     "customColor": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Customcolor",
                         "type": "string"
                     },
                     "customFontFamily": {
                         "example": "Open Sans",
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_ ]+$",
-                        "title": "Customfontfamily",
                         "type": "string"
                     },
                     "customLogoUrl": {
@@ -1347,7 +1382,6 @@
                         "maxLength": 65536,
                         "minLength": 1,
                         "nullable": true,
-                        "title": "Customlogourl",
                         "type": "string"
                     },
                     "customThemeOverride": {
@@ -1356,42 +1390,40 @@
                     },
                     "enableChannels": {
                         "default": false,
-                        "title": "Enablechannels",
                         "type": "boolean"
                     },
                     "enableIntegrationManagement": {
                         "default": false,
-                        "title": "Enableintegrationmanagement",
                         "type": "boolean"
                     },
                     "enableTransformations": {
                         "default": false,
-                        "title": "Enabletransformations",
                         "type": "boolean"
                     }
                 },
-                "title": "EnvironmentSettingsOut",
                 "type": "object"
             },
             "EventExampleIn": {
                 "properties": {
                     "eventType": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventtype",
                         "type": "string"
                     }
                 },
                 "required": [
                     "eventType"
                 ],
-                "title": "EventExampleIn",
                 "type": "object"
             },
             "EventTypeExampleOut": {
                 "properties": {
                     "example": {
+                        "additionalProperties": {
+                            "type": "object"
+                        },
                         "example": {
                             "data": {
                                 "email": "test@example.com",
@@ -1399,14 +1431,12 @@
                             },
                             "type": "user.created"
                         },
-                        "title": "Example",
                         "type": "object"
                     }
                 },
                 "required": [
                     "example"
                 ],
-                "title": "EventTypeExampleOut",
                 "type": "object"
             },
             "EventTypeIn": {
@@ -1414,12 +1444,10 @@
                     "archived": {
                         "default": false,
                         "example": false,
-                        "title": "Archived",
                         "type": "boolean"
                     },
                     "description": {
                         "example": "A user has signed up",
-                        "title": "Description",
                         "type": "string"
                     },
                     "featureFlag": {
@@ -1427,37 +1455,17 @@
                         "maxLength": 256,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Featureflag",
                         "type": "string"
                     },
                     "name": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Name",
                         "type": "string"
                     },
                     "schemas": {
                         "additionalProperties": {
-                            "example": {
-                                "description": "An invoice was paid by a user",
-                                "properties": {
-                                    "invoiceId": {
-                                        "description": "The invoice id",
-                                        "type": "string"
-                                    },
-                                    "userId": {
-                                        "description": "The user id",
-                                        "type": "string"
-                                    }
-                                },
-                                "required": [
-                                    "invoiceId",
-                                    "userId"
-                                ],
-                                "title": "Invoice Paid Event",
-                                "type": "object"
-                            },
                             "type": "object"
                         },
                         "description": "The schema for the event type for a specific version as a JSON schema.",
@@ -1483,7 +1491,6 @@
                             }
                         },
                         "nullable": true,
-                        "title": "Schemas",
                         "type": "object"
                     }
                 },
@@ -1491,7 +1498,6 @@
                     "description",
                     "name"
                 ],
-                "title": "EventTypeIn",
                 "type": "object"
             },
             "EventTypeOut": {
@@ -1499,17 +1505,14 @@
                     "archived": {
                         "default": false,
                         "example": false,
-                        "title": "Archived",
                         "type": "boolean"
                     },
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "description": {
                         "example": "A user has signed up",
-                        "title": "Description",
                         "type": "string"
                     },
                     "featureFlag": {
@@ -1517,42 +1520,22 @@
                         "maxLength": 256,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Featureflag",
                         "type": "string"
                     },
                     "name": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Name",
                         "type": "string"
                     },
                     "schemas": {
                         "additionalProperties": {
-                            "example": {
-                                "description": "An invoice was paid by a user",
-                                "properties": {
-                                    "invoiceId": {
-                                        "description": "The invoice id",
-                                        "type": "string"
-                                    },
-                                    "userId": {
-                                        "description": "The user id",
-                                        "type": "string"
-                                    }
-                                },
-                                "required": [
-                                    "invoiceId",
-                                    "userId"
-                                ],
-                                "title": "Invoice Paid Event",
-                                "type": "object"
-                            },
-                            "type": "object"
-                        },
-                        "description": "The schema for the event type for a specific version as a JSON schema.",
-                        "example": {
-                            "1": {
+                            "type": "object"
+                        },
+                        "description": "The schema for the event type for a specific version as a JSON schema.",
+                        "example": {
+                            "1": {
                                 "description": "An invoice was paid by a user",
                                 "properties": {
                                     "invoiceId": {
@@ -1573,28 +1556,68 @@
                             }
                         },
                         "nullable": true,
-                        "title": "Schemas",
                         "type": "object"
                     },
                     "updatedAt": {
                         "format": "date-time",
-                        "title": "Updatedat",
                         "type": "string"
                     }
                 },
                 "required": [
+                    "createdAt",
                     "description",
                     "name",
-                    "createdAt",
                     "updatedAt"
                 ],
-                "title": "EventTypeOut",
+                "type": "object"
+            },
+            "EventTypePatch": {
+                "properties": {
+                    "archived": {
+                        "type": "boolean"
+                    },
+                    "description": {
+                        "type": "string"
+                    },
+                    "featureFlag": {
+                        "example": "cool-new-feature",
+                        "maxLength": 256,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "schemas": {
+                        "additionalProperties": {
+                            "type": "object"
+                        },
+                        "example": {
+                            "description": "An invoice was paid by a user",
+                            "properties": {
+                                "invoiceId": {
+                                    "description": "The invoice id",
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "The user id",
+                                    "type": "string"
+                                }
+                            },
+                            "required": [
+                                "invoiceId",
+                                "userId"
+                            ],
+                            "title": "Invoice Paid Event",
+                            "type": "object"
+                        },
+                        "nullable": true,
+                        "type": "object"
+                    }
+                },
                 "type": "object"
             },
             "EventTypeSchemaIn": {
                 "properties": {
                     "schema": {
-                        "description": "The schema for an event type",
                         "example": {
                             "description": "An invoice was paid by a user",
                             "properties": {
@@ -1614,14 +1637,12 @@
                             "title": "Invoice Paid Event",
                             "type": "object"
                         },
-                        "title": "Schema",
                         "type": "object"
                     }
                 },
                 "required": [
                     "schema"
                 ],
-                "title": "EventTypeSchemaIn",
                 "type": "object"
             },
             "EventTypeUpdate": {
@@ -1629,12 +1650,10 @@
                     "archived": {
                         "default": false,
                         "example": false,
-                        "title": "Archived",
                         "type": "boolean"
                     },
                     "description": {
                         "example": "A user has signed up",
-                        "title": "Description",
                         "type": "string"
                     },
                     "featureFlag": {
@@ -1642,30 +1661,10 @@
                         "maxLength": 256,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Featureflag",
                         "type": "string"
                     },
                     "schemas": {
                         "additionalProperties": {
-                            "example": {
-                                "description": "An invoice was paid by a user",
-                                "properties": {
-                                    "invoiceId": {
-                                        "description": "The invoice id",
-                                        "type": "string"
-                                    },
-                                    "userId": {
-                                        "description": "The user id",
-                                        "type": "string"
-                                    }
-                                },
-                                "required": [
-                                    "invoiceId",
-                                    "userId"
-                                ],
-                                "title": "Invoice Paid Event",
-                                "type": "object"
-                            },
                             "type": "object"
                         },
                         "description": "The schema for the event type for a specific version as a JSON schema.",
@@ -1691,30 +1690,25 @@
                             }
                         },
                         "nullable": true,
-                        "title": "Schemas",
                         "type": "object"
                     }
                 },
                 "required": [
                     "description"
                 ],
-                "title": "EventTypeUpdate",
                 "type": "object"
             },
             "ExportEnvironmentIn": {
-                "properties": {},
-                "title": "ExportEnvironmentIn",
                 "type": "object"
             },
             "FontSizeConfig": {
                 "properties": {
                     "base": {
+                        "format": "int",
                         "nullable": true,
-                        "title": "Base",
                         "type": "integer"
                     }
                 },
-                "title": "FontSizeConfig",
                 "type": "object"
             },
             "HTTPValidationError": {
@@ -1723,21 +1717,20 @@
                         "items": {
                             "$ref": "#/components/schemas/ValidationError"
                         },
-                        "title": "Detail",
                         "type": "array"
                     }
                 },
-                "title": "HTTPValidationError",
+                "required": [
+                    "detail"
+                ],
                 "type": "object"
             },
             "HttpErrorOut": {
                 "properties": {
                     "code": {
-                        "title": "Code",
                         "type": "string"
                     },
                     "detail": {
-                        "title": "Detail",
                         "type": "string"
                     }
                 },
@@ -1752,74 +1745,64 @@
                 "properties": {
                     "name": {
                         "example": "Example Integration",
-                        "title": "Name",
                         "type": "string"
                     }
                 },
                 "required": [
                     "name"
                 ],
-                "title": "IntegrationIn",
                 "type": "object"
             },
             "IntegrationKeyOut": {
                 "properties": {
                     "key": {
                         "example": "integsk_kV3ts5tKPNJN4Dl25cMTfUNdmabxbX0O",
-                        "title": "Key",
                         "type": "string"
                     }
                 },
                 "required": [
                     "key"
                 ],
-                "title": "IntegrationKeyOut",
                 "type": "object"
             },
             "IntegrationOut": {
                 "properties": {
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "id": {
+                        "description": "The integ's ID",
                         "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "name": {
                         "example": "Example Integration",
-                        "title": "Name",
                         "type": "string"
                     },
                     "updatedAt": {
                         "format": "date-time",
-                        "title": "Updatedat",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "name",
-                    "id",
                     "createdAt",
+                    "id",
+                    "name",
                     "updatedAt"
                 ],
-                "title": "IntegrationOut",
                 "type": "object"
             },
             "IntegrationUpdate": {
                 "properties": {
                     "name": {
                         "example": "Example Integration",
-                        "title": "Name",
                         "type": "string"
                     }
                 },
                 "required": [
                     "name"
                 ],
-                "title": "IntegrationUpdate",
                 "type": "object"
             },
             "ListResponse_ApplicationOut_": {
@@ -1828,23 +1811,19 @@
                         "items": {
                             "$ref": "#/components/schemas/ApplicationOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -1852,7 +1831,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[ApplicationOut]",
                 "type": "object"
             },
             "ListResponse_ApplicationStats_": {
@@ -1861,17 +1839,47 @@
                         "items": {
                             "$ref": "#/components/schemas/ApplicationStats"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_BackgroundTaskOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/BackgroundTaskOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
                         "type": "string"
                     }
                 },
@@ -1879,7 +1887,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[ApplicationStats]",
                 "type": "object"
             },
             "ListResponse_EndpointMessageOut_": {
@@ -1888,23 +1895,19 @@
                         "items": {
                             "$ref": "#/components/schemas/EndpointMessageOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -1912,7 +1915,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[EndpointMessageOut]",
                 "type": "object"
             },
             "ListResponse_EndpointOut_": {
@@ -1921,23 +1923,19 @@
                         "items": {
                             "$ref": "#/components/schemas/EndpointOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -1945,7 +1943,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[EndpointOut]",
                 "type": "object"
             },
             "ListResponse_EventTypeOut_": {
@@ -1954,23 +1951,19 @@
                         "items": {
                             "$ref": "#/components/schemas/EventTypeOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -1978,7 +1971,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[EventTypeOut]",
                 "type": "object"
             },
             "ListResponse_IntegrationOut_": {
@@ -1987,17 +1979,19 @@
                         "items": {
                             "$ref": "#/components/schemas/IntegrationOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
                         "type": "string"
                     }
                 },
@@ -2005,7 +1999,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[IntegrationOut]",
                 "type": "object"
             },
             "ListResponse_MessageAttemptEndpointOut_": {
@@ -2014,23 +2007,19 @@
                         "items": {
                             "$ref": "#/components/schemas/MessageAttemptEndpointOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -2038,7 +2027,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[MessageAttemptEndpointOut]",
                 "type": "object"
             },
             "ListResponse_MessageAttemptOut_": {
@@ -2047,23 +2035,19 @@
                         "items": {
                             "$ref": "#/components/schemas/MessageAttemptOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -2071,7 +2055,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[MessageAttemptOut]",
                 "type": "object"
             },
             "ListResponse_MessageEndpointOut_": {
@@ -2080,17 +2063,19 @@
                         "items": {
                             "$ref": "#/components/schemas/MessageEndpointOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
                         "type": "string"
                     }
                 },
@@ -2098,7 +2083,6 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[MessageEndpointOut]",
                 "type": "object"
             },
             "ListResponse_MessageOut_": {
@@ -2107,23 +2091,19 @@
                         "items": {
                             "$ref": "#/components/schemas/MessageOut"
                         },
-                        "title": "Data",
                         "type": "array"
                     },
                     "done": {
-                        "title": "Done",
                         "type": "boolean"
                     },
                     "iterator": {
                         "example": "iterator",
                         "nullable": true,
-                        "title": "Iterator",
                         "type": "string"
                     },
                     "prevIterator": {
                         "example": "-iterator",
                         "nullable": true,
-                        "title": "Previterator",
                         "type": "string"
                     }
                 },
@@ -2131,34 +2111,32 @@
                     "data",
                     "done"
                 ],
-                "title": "ListResponse[MessageOut]",
                 "type": "object"
             },
             "MessageAttemptEndpointOut": {
                 "properties": {
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "id": {
+                        "description": "The attempt's ID",
                         "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "msgId": {
+                        "description": "The msg's ID",
                         "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Msgid",
                         "type": "string"
                     },
                     "response": {
                         "example": "{}",
-                        "title": "Response",
                         "type": "string"
                     },
                     "responseStatusCode": {
                         "example": 200,
-                        "title": "Responsestatuscode",
+                        "format": "int16",
                         "type": "integer"
                     },
                     "status": {
@@ -2166,7 +2144,6 @@
                     },
                     "timestamp": {
                         "format": "date-time",
-                        "title": "Timestamp",
                         "type": "string"
                     },
                     "triggerType": {
@@ -2177,41 +2154,24 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     }
                 },
                 "required": [
+                    "endpointId",
                     "id",
                     "msgId",
-                    "endpointId",
-                    "url",
                     "response",
                     "responseStatusCode",
-                    "timestamp",
                     "status",
-                    "triggerType"
+                    "timestamp",
+                    "triggerType",
+                    "url"
                 ],
-                "title": "MessageAttemptEndpointOut",
                 "type": "object"
             },
             "MessageAttemptExhaustedEvent": {
                 "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted).",
-                "example": {
-                    "data": {
-                        "appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "appUid": "unique-app-identifier",
-                        "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "lastAttempt": {
-                            "id": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "responseStatusCode": 500,
-                            "timestamp": "1970-01-01T00:00:00"
-                        },
-                        "msgEventId": "unique-msg-identifier",
-                        "msgId": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2"
-                    },
-                    "type": "message.attempt.exhausted"
-                },
                 "properties": {
                     "data": {
                         "$ref": "#/components/schemas/MessageAttemptExhaustedEventData"
@@ -2221,81 +2181,76 @@
                         "enum": [
                             "message.attempt.exhausted"
                         ],
-                        "title": "Type",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "data"
+                    "data",
+                    "type"
                 ],
-                "title": "MessageAttemptExhaustedEvent",
                 "type": "object"
             },
             "MessageAttemptExhaustedEventData": {
+                "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a \"message.attempt.exhausted\" type or after it's failed four times as a \"message.attempt.failing\" event.",
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "lastAttempt": {
                         "$ref": "#/components/schemas/MessageAttemptFailedData"
                     },
                     "msgEventId": {
-                        "description": "Optional unique identifier for the message",
-                        "example": "evt_pNZKtWg8Azow",
+                        "description": "The msg's UID",
+                        "example": "unique-msg-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Msgeventid",
                         "type": "string"
                     },
                     "msgId": {
+                        "description": "The msg's ID",
                         "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Msgid",
                         "type": "string"
                     }
                 },
                 "required": [
                     "appId",
-                    "msgId",
                     "endpointId",
-                    "lastAttempt"
+                    "lastAttempt",
+                    "msgId"
                 ],
-                "title": "MessageAttemptExhaustedEventData",
                 "type": "object"
             },
             "MessageAttemptFailedData": {
                 "properties": {
                     "id": {
+                        "description": "The attempt's ID",
                         "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "responseStatusCode": {
-                        "example": 500,
-                        "title": "Responsestatuscode",
+                        "format": "int16",
                         "type": "integer"
                     },
                     "timestamp": {
                         "format": "date-time",
-                        "title": "Timestamp",
                         "type": "string"
                     }
                 },
@@ -2304,26 +2259,10 @@
                     "responseStatusCode",
                     "timestamp"
                 ],
-                "title": "MessageAttemptFailedData",
                 "type": "object"
             },
             "MessageAttemptFailingEvent": {
                 "description": "Sent after a message has been failing for a few times.\nIt's sent on the fourth failure. It complements `message.attempt.exhausted` which is sent after the last failure.",
-                "example": {
-                    "data": {
-                        "appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "appUid": "unique-app-identifier",
-                        "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "lastAttempt": {
-                            "id": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "responseStatusCode": 500,
-                            "timestamp": "1970-01-01T00:00:00"
-                        },
-                        "msgEventId": "unique-msg-identifier",
-                        "msgId": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2"
-                    },
-                    "type": "message.attempt.failing"
-                },
                 "properties": {
                     "data": {
                         "$ref": "#/components/schemas/MessageAttemptFailingEventData"
@@ -2333,107 +2272,109 @@
                         "enum": [
                             "message.attempt.failing"
                         ],
-                        "title": "Type",
                         "type": "string"
                     }
                 },
                 "required": [
-                    "data"
+                    "data",
+                    "type"
                 ],
-                "title": "MessageAttemptFailingEvent",
                 "type": "object"
             },
             "MessageAttemptFailingEventData": {
+                "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a \"message.attempt.exhausted\" type or after it's failed four times as a \"message.attempt.failing\" event.",
                 "properties": {
                     "appId": {
+                        "description": "The app's ID",
                         "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Appid",
                         "type": "string"
                     },
                     "appUid": {
-                        "description": "Optional unique identifier for the application",
+                        "description": "The app's UID",
                         "example": "unique-app-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Appuid",
                         "type": "string"
                     },
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "lastAttempt": {
                         "$ref": "#/components/schemas/MessageAttemptFailedData"
                     },
                     "msgEventId": {
-                        "description": "Optional unique identifier for the message",
-                        "example": "evt_pNZKtWg8Azow",
+                        "description": "The msg's UID",
+                        "example": "unique-msg-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Msgeventid",
                         "type": "string"
                     },
                     "msgId": {
+                        "description": "The msg's ID",
                         "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Msgid",
                         "type": "string"
                     }
                 },
                 "required": [
                     "appId",
-                    "msgId",
                     "endpointId",
-                    "lastAttempt"
+                    "lastAttempt",
+                    "msgId"
                 ],
-                "title": "MessageAttemptFailingEventData",
                 "type": "object"
             },
             "MessageAttemptHeadersOut": {
                 "properties": {
+                    "sensitive": {
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array",
+                        "uniqueItems": true
+                    },
                     "sentHeaders": {
                         "additionalProperties": {
                             "type": "string"
                         },
-                        "title": "Sentheaders",
                         "type": "object"
                     }
                 },
                 "required": [
+                    "sensitive",
                     "sentHeaders"
                 ],
-                "title": "MessageAttemptHeadersOut",
                 "type": "object"
             },
             "MessageAttemptOut": {
                 "properties": {
                     "endpointId": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Endpointid",
                         "type": "string"
                     },
                     "id": {
+                        "description": "The attempt's ID",
                         "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "msgId": {
+                        "description": "The msg's ID",
                         "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Msgid",
                         "type": "string"
                     },
                     "response": {
                         "example": "{}",
-                        "title": "Response",
                         "type": "string"
                     },
                     "responseStatusCode": {
                         "example": 200,
-                        "title": "Responsestatuscode",
+                        "format": "int16",
                         "type": "integer"
                     },
                     "status": {
@@ -2441,7 +2382,6 @@
                     },
                     "timestamp": {
                         "format": "date-time",
-                        "title": "Timestamp",
                         "type": "string"
                     },
                     "triggerType": {
@@ -2452,22 +2392,20 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     }
                 },
                 "required": [
+                    "endpointId",
                     "id",
                     "msgId",
-                    "endpointId",
-                    "url",
                     "response",
                     "responseStatusCode",
-                    "timestamp",
                     "status",
-                    "triggerType"
+                    "timestamp",
+                    "triggerType",
+                    "url"
                 ],
-                "title": "MessageAttemptOut",
                 "type": "object"
             },
             "MessageAttemptTriggerType": {
@@ -2483,6 +2421,83 @@
                     "Manual"
                 ]
             },
+            "MessageBroadcastIn": {
+                "properties": {
+                    "channels": {
+                        "description": "List of free-form identifiers that endpoints can filter by",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 5,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "eventId": {
+                        "description": "Optional unique identifier for the message",
+                        "example": "unique-msg-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "eventType": {
+                        "description": "The event type's name",
+                        "example": "user.signup",
+                        "maxLength": 256,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "payload": {
+                        "example": {
+                            "email": "test@example.com",
+                            "username": "test_user"
+                        },
+                        "type": "object"
+                    },
+                    "payloadRetentionPeriod": {
+                        "default": 90,
+                        "example": 90,
+                        "format": "int64",
+                        "maximum": 90,
+                        "minimum": 5,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "eventType",
+                    "payload"
+                ],
+                "type": "object"
+            },
+            "MessageBroadcastOut": {
+                "properties": {
+                    "id": {
+                        "type": "string"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/BackgroundTaskStatus"
+                    },
+                    "task": {
+                        "$ref": "#/components/schemas/BackgroundTaskType"
+                    }
+                },
+                "required": [
+                    "id",
+                    "status",
+                    "task"
+                ],
+                "type": "object"
+            },
             "MessageEndpointOut": {
                 "properties": {
                     "channels": {
@@ -2500,25 +2515,20 @@
                         "maxItems": 10,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "createdAt": {
                         "format": "date-time",
-                        "title": "Createdat",
                         "type": "string"
                     },
                     "description": {
-                        "default": "",
-                        "example": "An example endpoint name",
-                        "title": "Description",
+                        "description": "An example endpoint name",
                         "type": "string"
                     },
                     "disabled": {
                         "default": false,
                         "example": false,
-                        "title": "Disabled",
                         "type": "boolean"
                     },
                     "filterTypes": {
@@ -2527,6 +2537,7 @@
                             "user.deleted"
                         ],
                         "items": {
+                            "description": "The event type's name",
                             "example": "user.signup",
                             "maxLength": 256,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
@@ -2534,35 +2545,23 @@
                         },
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Filtertypes",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "id": {
+                        "description": "The ep's ID",
                         "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
-                    "metadata": {
-                        "additionalProperties": {
-                            "type": "string"
-                        },
-                        "nullable": true,
-                        "title": "Metadata",
-                        "type": "object"
-                    },
                     "nextAttempt": {
                         "format": "date-time",
                         "nullable": true,
-                        "title": "Nextattempt",
                         "type": "string"
                     },
                     "rateLimit": {
-                        "example": 1000,
-                        "maximum": 65535.0,
-                        "minimum": 1.0,
+                        "format": "uint16",
+                        "minimum": 0,
                         "nullable": true,
-                        "title": "Ratelimit",
                         "type": "integer"
                     },
                     "status": {
@@ -2570,12 +2569,15 @@
                     },
                     "uid": {
                         "description": "Optional unique identifier for the endpoint",
-                        "example": "unique-endpoint-identifier",
+                        "example": "unique-ep-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Uid",
+                        "type": "string"
+                    },
+                    "updatedAt": {
+                        "format": "date-time",
                         "type": "string"
                     },
                     "url": {
@@ -2583,24 +2585,24 @@
                         "format": "uri",
                         "maxLength": 65536,
                         "minLength": 1,
-                        "title": "Url",
                         "type": "string"
                     },
                     "version": {
                         "example": 1,
-                        "exclusiveMinimum": 0.0,
-                        "title": "Version",
+                        "format": "int32",
+                        "minimum": 1,
                         "type": "integer"
                     }
                 },
                 "required": [
-                    "url",
-                    "version",
-                    "id",
                     "createdAt",
-                    "status"
+                    "description",
+                    "id",
+                    "status",
+                    "updatedAt",
+                    "url",
+                    "version"
                 ],
-                "title": "MessageEndpointOut",
                 "type": "object"
             },
             "MessageIn": {
@@ -2624,25 +2626,23 @@
                         "maxItems": 5,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "eventId": {
                         "description": "Optional unique identifier for the message",
-                        "example": "evt_pNZKtWg8Azow",
+                        "example": "unique-msg-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventid",
                         "type": "string"
                     },
                     "eventType": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventtype",
                         "type": "string"
                     },
                     "payload": {
@@ -2650,16 +2650,14 @@
                             "email": "test@example.com",
                             "username": "test_user"
                         },
-                        "title": "Payload",
                         "type": "object"
                     },
                     "payloadRetentionPeriod": {
                         "default": 90,
-                        "description": "The retention period for the payload (in days).",
                         "example": 90,
-                        "maximum": 90.0,
-                        "minimum": 5.0,
-                        "title": "Payloadretentionperiod",
+                        "format": "int64",
+                        "maximum": 90,
+                        "minimum": 5,
                         "type": "integer"
                     }
                 },
@@ -2667,7 +2665,6 @@
                     "eventType",
                     "payload"
                 ],
-                "title": "MessageIn",
                 "type": "object"
             },
             "MessageOut": {
@@ -2687,30 +2684,28 @@
                         "maxItems": 5,
                         "minItems": 1,
                         "nullable": true,
-                        "title": "Channels",
                         "type": "array",
                         "uniqueItems": true
                     },
                     "eventId": {
                         "description": "Optional unique identifier for the message",
-                        "example": "evt_pNZKtWg8Azow",
+                        "example": "unique-msg-identifier",
                         "maxLength": 256,
                         "minLength": 1,
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventid",
                         "type": "string"
                     },
                     "eventType": {
+                        "description": "The event type's name",
                         "example": "user.signup",
                         "maxLength": 256,
                         "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                        "title": "Eventtype",
                         "type": "string"
                     },
                     "id": {
+                        "description": "The msg's ID",
                         "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                        "title": "Id",
                         "type": "string"
                     },
                     "payload": {
@@ -2718,22 +2713,19 @@
                             "email": "test@example.com",
                             "username": "test_user"
                         },
-                        "title": "Payload",
                         "type": "object"
                     },
                     "timestamp": {
                         "format": "date-time",
-                        "title": "Timestamp",
                         "type": "string"
                     }
                 },
                 "required": [
                     "eventType",
-                    "payload",
                     "id",
+                    "payload",
                     "timestamp"
                 ],
-                "title": "MessageOut",
                 "type": "object"
             },
             "MessageStatus": {
@@ -2753,63 +2745,106 @@
                     "Sending"
                 ]
             },
-            "Ordering": {
+            "OneTimeTokenIn": {
+                "properties": {
+                    "oneTimeToken": {
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "oneTimeToken"
+                ],
+                "type": "object"
+            },
+            "OneTimeTokenOut": {
+                "properties": {
+                    "token": {
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "token"
+                ],
+                "type": "object"
+            },
+            "Ordering": {
                 "description": "Defines the ordering in a listing of results.",
                 "enum": [
                     "ascending",
                     "descending"
                 ],
-                "title": "Ordering",
                 "type": "string"
             },
             "RecoverIn": {
                 "properties": {
                     "since": {
                         "format": "date-time",
-                        "title": "Since",
                         "type": "string"
                     },
                     "until": {
                         "format": "date-time",
                         "nullable": true,
-                        "title": "Until",
                         "type": "string"
                     }
                 },
                 "required": [
                     "since"
                 ],
-                "title": "RecoverIn",
                 "type": "object"
             },
             "RecoverOut": {
-                "properties": {},
-                "title": "RecoverOut",
+                "properties": {
+                    "id": {
+                        "type": "string"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/BackgroundTaskStatus"
+                    },
+                    "task": {
+                        "$ref": "#/components/schemas/BackgroundTaskType"
+                    }
+                },
+                "required": [
+                    "id",
+                    "status",
+                    "task"
+                ],
                 "type": "object"
             },
             "ReplayIn": {
                 "properties": {
                     "since": {
                         "format": "date-time",
-                        "title": "Since",
                         "type": "string"
                     },
                     "until": {
                         "format": "date-time",
                         "nullable": true,
-                        "title": "Until",
                         "type": "string"
                     }
                 },
                 "required": [
                     "since"
                 ],
-                "title": "ReplayIn",
                 "type": "object"
             },
             "ReplayOut": {
-                "properties": {},
-                "title": "ReplayOut",
+                "properties": {
+                    "id": {
+                        "type": "string"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/BackgroundTaskStatus"
+                    },
+                    "task": {
+                        "$ref": "#/components/schemas/BackgroundTaskType"
+                    }
+                },
+                "required": [
+                    "id",
+                    "status",
+                    "task"
+                ],
                 "type": "object"
             },
             "SettingsIn": {
@@ -2823,21 +2858,19 @@
                         "nullable": true
                     },
                     "customBaseFontSize": {
+                        "format": "int",
                         "nullable": true,
-                        "title": "Custombasefontsize",
                         "type": "integer"
                     },
                     "customColor": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Customcolor",
                         "type": "string"
                     },
                     "customFontFamily": {
                         "example": "Open Sans",
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_ ]+$",
-                        "title": "Customfontfamily",
                         "type": "string"
                     },
                     "customLogoUrl": {
@@ -2845,7 +2878,6 @@
                         "maxLength": 65536,
                         "minLength": 1,
                         "nullable": true,
-                        "title": "Customlogourl",
                         "type": "string"
                     },
                     "customThemeOverride": {
@@ -2854,46 +2886,37 @@
                     },
                     "disableEndpointOnFailure": {
                         "default": true,
-                        "title": "Disableendpointonfailure",
                         "type": "boolean"
                     },
                     "displayName": {
                         "nullable": true,
-                        "title": "Displayname",
                         "type": "string"
                     },
                     "enableChannels": {
                         "default": false,
-                        "title": "Enablechannels",
                         "type": "boolean"
                     },
                     "enableIntegrationManagement": {
                         "default": false,
-                        "title": "Enableintegrationmanagement",
                         "type": "boolean"
                     },
                     "enableTransformations": {
                         "default": false,
-                        "title": "Enabletransformations",
                         "type": "boolean"
                     },
                     "enforceHttps": {
                         "default": true,
-                        "title": "Enforcehttps",
                         "type": "boolean"
                     },
                     "eventCatalogPublished": {
                         "default": false,
-                        "title": "Eventcatalogpublished",
                         "type": "boolean"
                     },
                     "readOnly": {
                         "default": false,
-                        "title": "Readonly",
                         "type": "boolean"
                     }
                 },
-                "title": "SettingsIn",
                 "type": "object"
             },
             "SettingsOut": {
@@ -2907,21 +2930,19 @@
                         "nullable": true
                     },
                     "customBaseFontSize": {
+                        "format": "int",
                         "nullable": true,
-                        "title": "Custombasefontsize",
                         "type": "integer"
                     },
                     "customColor": {
                         "format": "color",
                         "nullable": true,
-                        "title": "Customcolor",
                         "type": "string"
                     },
                     "customFontFamily": {
                         "example": "Open Sans",
                         "nullable": true,
                         "pattern": "^[a-zA-Z0-9\\-_ ]+$",
-                        "title": "Customfontfamily",
                         "type": "string"
                     },
                     "customLogoUrl": {
@@ -2929,7 +2950,6 @@
                         "maxLength": 65536,
                         "minLength": 1,
                         "nullable": true,
-                        "title": "Customlogourl",
                         "type": "string"
                     },
                     "customThemeOverride": {
@@ -2938,46 +2958,37 @@
                     },
                     "disableEndpointOnFailure": {
                         "default": true,
-                        "title": "Disableendpointonfailure",
                         "type": "boolean"
                     },
                     "displayName": {
                         "nullable": true,
-                        "title": "Displayname",
                         "type": "string"
                     },
                     "enableChannels": {
                         "default": false,
-                        "title": "Enablechannels",
                         "type": "boolean"
                     },
                     "enableIntegrationManagement": {
                         "default": false,
-                        "title": "Enableintegrationmanagement",
                         "type": "boolean"
                     },
                     "enableTransformations": {
                         "default": false,
-                        "title": "Enabletransformations",
                         "type": "boolean"
                     },
                     "enforceHttps": {
                         "default": true,
-                        "title": "Enforcehttps",
                         "type": "boolean"
                     },
                     "eventCatalogPublished": {
                         "default": false,
-                        "title": "Eventcatalogpublished",
                         "type": "boolean"
                     },
                     "readOnly": {
                         "default": false,
-                        "title": "Readonly",
                         "type": "boolean"
                     }
                 },
-                "title": "SettingsOut",
                 "type": "object"
             },
             "StatisticsPeriod": {
@@ -2986,7 +2997,6 @@
                     "OneDay",
                     "FiveMinutes"
                 ],
-                "title": "StatisticsPeriod",
                 "type": "string"
             },
             "StatusCodeClass": {
@@ -3011,29 +3021,28 @@
                 ]
             },
             "TransformationHttpMethod": {
-                "description": "An enumeration.",
                 "enum": [
-                    "PUT",
-                    "POST"
+                    "POST",
+                    "PUT"
                 ],
-                "title": "TransformationHttpMethod",
                 "type": "string"
             },
             "ValidationError": {
+                "description": "Validation errors have their own schema to provide context for invalid requests eg. mismatched types and out of bounds values. There may be any number of these per 422 UNPROCESSABLE ENTITY error.",
                 "properties": {
                     "loc": {
+                        "description": "The location as a [`Vec`] of [`String`]s -- often in the form `[\"body\", \"field_name\"]`, `[\"query\", \"field_name\"]`, etc. They may, however, be arbitarily deep.",
                         "items": {
                             "type": "string"
                         },
-                        "title": "Location",
                         "type": "array"
                     },
                     "msg": {
-                        "title": "Message",
+                        "description": "The message accompanying the validation error item.",
                         "type": "string"
                     },
                     "type": {
-                        "title": "Error Type",
+                        "description": "The type of error, often \"type_error\" or \"value_error\", but sometimes with more context like as \"value_error.number.not_ge\"",
                         "type": "string"
                     }
                 },
@@ -3042,54 +3051,22 @@
                     "msg",
                     "type"
                 ],
-                "title": "ValidationError",
-                "type": "object"
-            },
-            "WebhookTypes": {
-                "description": "All of the webhook types that we support",
-                "properties": {
-                    "a": {
-                        "$ref": "#/components/schemas/EndpointDisabledEvent"
-                    },
-                    "a1": {
-                        "$ref": "#/components/schemas/MessageAttemptFailingEvent"
-                    },
-                    "b": {
-                        "$ref": "#/components/schemas/EndpointCreatedEvent"
-                    },
-                    "c": {
-                        "$ref": "#/components/schemas/EndpointUpdatedEvent"
-                    },
-                    "d": {
-                        "$ref": "#/components/schemas/EndpointDeletedEvent"
-                    },
-                    "e": {
-                        "$ref": "#/components/schemas/MessageAttemptExhaustedEvent"
-                    }
-                },
-                "required": [
-                    "a",
-                    "b",
-                    "c",
-                    "d",
-                    "e",
-                    "a1"
-                ],
-                "title": "WebhookTypes",
                 "type": "object"
             }
         },
         "securitySchemes": {
             "HTTPBearer": {
+                "bearerFormat": null,
+                "description": "HTTP Bearer token passed in the `Authorization` header",
                 "scheme": "bearer",
                 "type": "http"
             }
         }
     },
     "info": {
-        "description": "Welcome to the Svix API documentation!\n\nUseful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)\n\n# Introduction\n\nThis is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).\n\n## Main concepts\n\nIn Svix you have four important entities you will be interacting with:\n\n- `messages`: these are the webhooks being sent. They can have contents and a few other properties.\n- `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform.\n- `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type).\n- `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.\n\n\n## Authentication\n\nGet your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.\n\n<SecurityDefinitions />\n\n\n## Code samples\n\nThe code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).\n\n\n## Idempotency\n\nSvix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.\n\nTo perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.\n\nSvix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.\n\nPlease note that idempotency is only supported for `POST` requests.\n\n\n## Cross-Origin Resource Sharing\n\nThis API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site.\n",
+        "description": "Welcome to the Svix API documentation!\n\nUseful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)\n\n# Introduction\n\nThis is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).\n\n## Main concepts\n\nIn Svix you have four important entities you will be interacting with:\n\n- `messages`: these are the webhooks being sent. They can have contents and a few other properties.\n- `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform.\n- `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type).\n- `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.\n\n\n## Authentication\n\nGet your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`. For more information on authentication, please refer to the [authentication token docs](https://docs.svix.com/api-keys).\n\n<SecurityDefinitions />\n\n\n## Code samples\n\nThe code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).\n\n\n## Idempotency\n\nSvix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.\n\nTo perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.\n\nSvix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.\n\nPlease note that idempotency is only supported for `POST` requests.\n\n\n## Cross-Origin Resource Sharing\n\nThis API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site.\n",
         "title": "Svix API",
-        "version": "1.4",
+        "version": "1.4.1",
         "x-logo": {
             "altText": "Svix Logo",
             "url": "https://www.svix.com/static/img/brand-padded.svg"
@@ -3100,54 +3077,39 @@
         "/api/v1/app/": {
             "get": {
                 "description": "List of all the organization's applications.",
-                "operationId": "list_applications_api_v1_app__get",
+                "operationId": "v1.application.list",
                 "parameters": [
-                    {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
-                            "type": "string"
-                        }
-                    },
                     {
                         "in": "query",
                         "name": "limit",
-                        "required": false,
                         "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
                             "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The app's ID",
                         "in": "query",
-                        "name": "order",
-                        "required": false,
+                        "name": "iterator",
                         "schema": {
-                            "allOf": [
-                                {
-                                    "$ref": "#/components/schemas/Ordering"
-                                }
-                            ],
-                            "default": "descending"
-                        }
+                            "description": "The app's ID",
+                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "order",
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
@@ -3159,7 +3121,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -3245,32 +3207,32 @@
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_application_out = svix.application.list()"
+                        "source": "list_response_application_out = svix.application.list(None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_application_out = await svix.application.list()"
+                        "source": "list_response_application_out = await svix.application.list(None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseApplicationOut, err := svixClient.Application.List(nil)"
+                        "source": "listResponseApplicationOut, err := svixClient.Application.List(ctx, nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseApplicationOut = svix.application.list(FetchOptions())"
+                        "source": "val listResponseApplicationOut = svix.application.list()"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseApplicationOut listResponseApplicationOut = svix.getApplication().list(new FetchOptions())"
+                        "source": "ListResponseApplicationOut listResponseApplicationOut = svix.getApplication().list()"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_application_out = svix.application.list"
+                        "source": "list_response_application_out = svix.application.list()"
                     },
                     {
                         "label": "Rust",
@@ -3290,37 +3252,33 @@
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
             "post": {
                 "description": "Create a new application.",
-                "operationId": "create_application_api_v1_app__post",
+                "operationId": "v1.application.create",
                 "parameters": [
                     {
                         "description": "Get an existing application, or create a new one if doesn't exist. It's two separate functions in the libs.",
                         "in": "query",
                         "name": "get_if_exists",
-                        "required": false,
                         "schema": {
                             "default": false,
                             "description": "Get an existing application, or create a new one if doesn't exist. It's two separate functions in the libs.",
-                            "title": "Get If Exists",
                             "type": "boolean"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
@@ -3342,7 +3300,7 @@
                                 }
                             }
                         },
-                        "description": "OK"
+                        "description": ""
                     },
                     "201": {
                         "content": {
@@ -3352,7 +3310,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -3428,62 +3386,62 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const applicationOut = await svix.application.create({\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n})\n// Or \nconst applicationOut = await svix.application.getOrCreate({\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n})"
+                        "source": "const applicationOut = await svix.application.create({\n    name: \"My first application\",\n    rateLimit: null,\n    uid: \"unique-app-identifier\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const applicationOut = await svix.application.create({\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n})\n// Or \nconst applicationOut = await svix.application.getOrCreate({\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n})"
+                        "source": "const applicationOut = await svix.application.create({\n    name: \"My first application\",\n    rateLimit: null,\n    uid: \"unique-app-identifier\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "application_out = svix.application.create(ApplicationIn(\n    uid=\"unique-app-identifier\",\n    name=\"My first application\",\n    rate_limit=1000,\n    metadata=None\n))\n# Or \napplication_out = svix.application.get_or_create(ApplicationIn(\n    uid=\"unique-app-identifier\",\n    name=\"My first application\",\n    rate_limit=1000,\n    metadata=None\n))"
+                        "source": "application_out = svix.application.create(ApplicationIn(\n    name=\"My first application\",\n    rate_limit=None,\n    uid=\"unique-app-identifier\"\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "application_out = await svix.application.create(ApplicationIn(\n    uid=\"unique-app-identifier\",\n    name=\"My first application\",\n    rate_limit=1000,\n    metadata=None\n))\n# Or \napplication_out = await svix.application.get_or_create(ApplicationIn(\n    uid=\"unique-app-identifier\",\n    name=\"My first application\",\n    rate_limit=1000,\n    metadata=None\n))"
+                        "source": "application_out = await svix.application.create(ApplicationIn(\n    name=\"My first application\",\n    rate_limit=None,\n    uid=\"unique-app-identifier\"\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "applicationOut, err := svixClient.Application.Create(&svix.ApplicationIn{\n    Uid: \"unique-app-identifier\",\n    Name: \"My first application\",\n    RateLimit: 1000,\n    Metadata: None\n})\n// Or \napplicationOut, err := svixClient.Application.GetOrCreate(&svix.ApplicationIn{\n    Uid: \"unique-app-identifier\",\n    Name: \"My first application\",\n    RateLimit: 1000,\n    Metadata: None\n})"
+                        "source": "applicationOut, err := svixClient.Application.Create(ctx, &ApplicationIn{\n    Name: \"My first application\",\n    RateLimit: nil,\n    Uid: \"unique-app-identifier\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val applicationOut = svix.application.create(ApplicationIn()\n    .uid(\"unique-app-identifier\"),\n    .name(\"My first application\"),\n    .rateLimit(1000),\n    .metadata(None)\n)\n// Or \nval applicationOut = svix.application.getOrCreate(ApplicationIn()\n    .uid(\"unique-app-identifier\"),\n    .name(\"My first application\"),\n    .rateLimit(1000),\n    .metadata(None)\n)"
+                        "source": "val applicationOut = svix.application.create(ApplicationIn()\n    .name(\"My first application\")\n    .rateLimit(null)\n    .uid(\"unique-app-identifier\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ApplicationOut applicationOut = svix.getApplication().create(new ApplicationIn()\n    .uid(\"unique-app-identifier\"),\n    .name(\"My first application\"),\n    .rateLimit(1000),\n    .metadata(None)\n)\n// Or \nApplicationOut applicationOut = svix.getApplication().getOrCreate(new ApplicationIn()\n    .uid(\"unique-app-identifier\"),\n    .name(\"My first application\"),\n    .rateLimit(1000),\n    .metadata(None)\n)"
+                        "source": "ApplicationOut applicationOut = svix.getApplication().create(new ApplicationIn()\n    .name(\"My first application\")\n    .rateLimit(null)\n    .uid(\"unique-app-identifier\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "application_out = svix.application.create(Svix::ApplicationIn.new({\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rate_limit\": 1000,\n    \"metadata\": null\n}))\n# Or \napplication_out = svix.application.get_or_create(Svix::ApplicationIn.new({\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rate_limit\": 1000,\n    \"metadata\": null\n}))"
+                        "source": "application_out = svix.application.create(Svix::ApplicationIn.new({\n    \"name\": \"My first application\",\n    \"rate_limit\": nil,\n    \"uid\": \"unique-app-identifier\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let application_out = svix.application().create(ApplicationIn {\n    uid: Some(\"unique-app-identifier\".to_string()),\n    name: \"My first application\".to_string(),\n    rate_limit: Some(1000),\n    metadata: None\n}, None).await?;\n// Or \nlet application_out = svix.application().get_or_create(ApplicationIn {\n    uid: Some(\"unique-app-identifier\".to_string()),\n    name: \"My first application\".to_string(),\n    rate_limit: Some(1000),\n    metadata: None\n}, None).await?;"
+                        "source": "let application_out = svix.application().create(ApplicationIn {\n    name: \"My first application\".to_string(),\n    rate_limit: None,\n    uid: Some(\"unique-app-identifier\".to_string()),\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var applicationOut = await svix.Application.CreateAsync(new ApplicationIn{\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n})"
+                        "source": "var applicationOut = await svix.Application.CreateAsync(new ApplicationIn{\n    name: \"My first application\",\n    rateLimit: null,\n    uid: \"unique-app-identifier\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix application create '{\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rateLimit\": 1000,\n    \"metadata\": null\n}'"
+                        "source": "svix application create '{\n    \"name\": \"My first application\",\n    \"rateLimit\": null,\n    \"uid\": \"unique-app-identifier\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rateLimit\": 1000,\n    \"metadata\": null\n}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"name\": \"My first application\",\n        \"rateLimit\": null,\n        \"uid\": \"unique-app-identifier\"\n    }'"
                     }
                 ]
             }
@@ -3499,9 +3457,9 @@
                         "required": true,
                         "schema": {
                             "format": "date-time",
-                            "title": "Since",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
@@ -3509,43 +3467,33 @@
                         "required": true,
                         "schema": {
                             "format": "date-time",
-                            "title": "Until",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "limit",
-                        "required": false,
                         "schema": {
                             "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
+                            "format": "int",
+                            "maximum": 250,
+                            "nullable": true,
                             "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The app's ID",
                         "in": "query",
                         "name": "iterator",
-                        "required": false,
                         "schema": {
+                            "description": "The app's ID",
                             "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Iterator",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
@@ -3557,7 +3505,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -3630,10 +3578,65 @@
                     "Application"
                 ],
                 "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseApplicationStats = await svix.app.stats();"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseApplicationStats = await svix.app.stats();"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "list_response_application_stats = svix.app.stats()"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "list_response_application_stats = await svix.app.stats()"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "listResponseApplicationStats, err := svixClient.App.Stats(ctx)"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val listResponseApplicationStats = svix.app.stats()"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "ListResponseApplicationStats listResponseApplicationStats = svix.getApp().stats()"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "list_response_application_stats = svix.app.stats()"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let list_response_application_stats = svix.app().stats().await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var listResponseApplicationStats = await svix.App.StatsAsync()"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix app stats "
+                    },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/stats/usage/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/stats/usage/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
@@ -3641,38 +3644,27 @@
         "/api/v1/app/{app_id}/": {
             "delete": {
                 "description": "Delete an application.",
-                "operationId": "delete_application_api_v1_app__app_id___delete",
+                "operationId": "v1.application.delete",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
                     "204": {
-                        "description": "Successful Response"
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -3748,42 +3740,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.application.delete('app_id');"
+                        "source": "await svix.application.delete(\"app_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.application.delete('app_id');"
+                        "source": "await svix.application.delete(\"app_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.application.delete('app_id')"
+                        "source": "svix.application.delete(\"app_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.application.delete('app_id')"
+                        "source": "await svix.application.delete(\"app_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Application.Delete(\"app_id\")"
+                        "source": "err := svixClient.Application.Delete(ctx, \"app_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.application.delete('app_id')"
+                        "source": "svix.application.delete(\"app_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getApplication().delete('app_id')"
+                        "source": "svix.getApplication().delete(\"app_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.application.delete('app_id')"
+                        "source": "svix.application.delete(\"app_id\")"
                     },
                     {
                         "label": "Rust",
@@ -3798,44 +3790,33 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix application delete 'app_id'"
+                        "source": "svix application delete \"app_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
             "get": {
                 "description": "Get an application.",
-                "operationId": "get_application_api_v1_app__app_id___get",
+                "operationId": "v1.application.get",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -3847,7 +3828,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -3923,42 +3904,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const applicationOut = await svix.application.get('app_id');"
+                        "source": "const applicationOut = await svix.application.get(\"app_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const applicationOut = await svix.application.get('app_id');"
+                        "source": "const applicationOut = await svix.application.get(\"app_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "application_out = svix.application.get('app_id')"
+                        "source": "application_out = svix.application.get(\"app_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "application_out = await svix.application.get('app_id')"
+                        "source": "application_out = await svix.application.get(\"app_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "applicationOut, err := svixClient.Application.Get(\"app_id\")"
+                        "source": "applicationOut, err := svixClient.Application.Get(ctx, \"app_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val applicationOut = svix.application.get('app_id')"
+                        "source": "val applicationOut = svix.application.get(\"app_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ApplicationOut applicationOut = svix.getApplication().get('app_id')"
+                        "source": "ApplicationOut applicationOut = svix.getApplication().get(\"app_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "application_out = svix.application.get('app_id')"
+                        "source": "application_out = svix.application.get(\"app_id\")"
                     },
                     {
                         "label": "Rust",
@@ -3973,51 +3954,40 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix application get 'app_id'"
+                        "source": "svix application get \"app_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
-            "put": {
-                "description": "Update an application.",
-                "operationId": "update_application_api_v1_app__app_id___put",
+            "patch": {
+                "description": "Partially update an application.",
+                "operationId": "patch_application",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/ApplicationIn"
+                                "$ref": "#/components/schemas/ApplicationPatch"
                             }
                         }
                     },
@@ -4032,17 +4002,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
-                    },
-                    "201": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/ApplicationOut"
-                                }
-                            }
-                        },
-                        "description": "Created"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -4110,70 +4070,192 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Update Application",
+                "summary": "Patch Application",
                 "tags": [
                     "Application"
-                ],
-                "x-codeSamples": [
+                ]
+            },
+            "put": {
+                "description": "Update an application.",
+                "operationId": "v1.application.update",
+                "parameters": [
                     {
-                        "label": "JavaScript",
-                        "lang": "JavaScript",
-                        "source": "const applicationOut = await svix.application.update('app_id', {\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n});"
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/ApplicationIn"
+                            }
+                        }
                     },
-                    {
-                        "label": "TypeScript",
-                        "lang": "JavaScript",
-                        "source": "const applicationOut = await svix.application.update('app_id', {\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n});"
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
-                    {
-                        "label": "Python",
-                        "lang": "Python",
-                        "source": "application_out = svix.application.update('app_id', ApplicationIn(\n    uid=\"unique-app-identifier\",\n    name=\"My first application\",\n    rate_limit=1000,\n    metadata=None\n))"
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Update Application",
+                "tags": [
+                    "Application"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const applicationOut = await svix.application.update(\"app_id\", {\n    name: \"My first application\",\n    rateLimit: null,\n    uid: \"unique-app-identifier\"\n});"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const applicationOut = await svix.application.update(\"app_id\", {\n    name: \"My first application\",\n    rateLimit: null,\n    uid: \"unique-app-identifier\"\n});"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "application_out = svix.application.update(\"app_id\", ApplicationIn(\n    name=\"My first application\",\n    rate_limit=None,\n    uid=\"unique-app-identifier\"\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "application_out = await svix.application.update('app_id', ApplicationIn(\n    uid=\"unique-app-identifier\",\n    name=\"My first application\",\n    rate_limit=1000,\n    metadata=None\n))"
+                        "source": "application_out = await svix.application.update(\"app_id\", ApplicationIn(\n    name=\"My first application\",\n    rate_limit=None,\n    uid=\"unique-app-identifier\"\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "applicationOut, err := svixClient.Application.Update(\"app_id\", &svix.ApplicationIn{\n    Uid: \"unique-app-identifier\",\n    Name: \"My first application\",\n    RateLimit: 1000,\n    Metadata: None\n})"
+                        "source": "applicationOut, err := svixClient.Application.Update(ctx, \"app_id\", &ApplicationIn{\n    Name: \"My first application\",\n    RateLimit: nil,\n    Uid: \"unique-app-identifier\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val applicationOut = svix.application.update('app_id', ApplicationIn()\n    .uid(\"unique-app-identifier\"),\n    .name(\"My first application\"),\n    .rateLimit(1000),\n    .metadata(None)\n)"
+                        "source": "val applicationOut = svix.application.update(\"app_id\", ApplicationIn()\n    .name(\"My first application\")\n    .rateLimit(null)\n    .uid(\"unique-app-identifier\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ApplicationOut applicationOut = svix.getApplication().update('app_id', new ApplicationIn()\n    .uid(\"unique-app-identifier\"),\n    .name(\"My first application\"),\n    .rateLimit(1000),\n    .metadata(None)\n)"
+                        "source": "ApplicationOut applicationOut = svix.getApplication().update(\"app_id\", new ApplicationIn()\n    .name(\"My first application\")\n    .rateLimit(null)\n    .uid(\"unique-app-identifier\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "application_out = svix.application.update('app_id', Svix::ApplicationIn.new({\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rate_limit\": 1000,\n    \"metadata\": null\n}))"
+                        "source": "application_out = svix.application.update(\"app_id\", Svix::ApplicationIn.new({\n    \"name\": \"My first application\",\n    \"rate_limit\": nil,\n    \"uid\": \"unique-app-identifier\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let application_out = svix.application().update(\"app_id\", ApplicationIn {\n    uid: Some(\"unique-app-identifier\".to_string()),\n    name: \"My first application\".to_string(),\n    rate_limit: Some(1000),\n    metadata: None\n}, None).await?;"
+                        "source": "let application_out = svix.application().update(\"app_id\", ApplicationIn {\n    name: \"My first application\".to_string(),\n    rate_limit: None,\n    uid: Some(\"unique-app-identifier\".to_string()),\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var applicationOut = await svix.Application.UpdateAsync(\"app_id\", new ApplicationIn{\n    uid: \"unique-app-identifier\",\n    name: \"My first application\",\n    rateLimit: 1000,\n    metadata: None\n})"
+                        "source": "var applicationOut = await svix.Application.UpdateAsync(\"app_id\", new ApplicationIn{\n    name: \"My first application\",\n    rateLimit: null,\n    uid: \"unique-app-identifier\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix application update 'app_id' '{\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rateLimit\": 1000,\n    \"metadata\": null\n}'"
+                        "source": "svix application update \"app_id\" '{\n    \"name\": \"My first application\",\n    \"rateLimit\": null,\n    \"uid\": \"unique-app-identifier\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"uid\": \"unique-app-identifier\",\n    \"name\": \"My first application\",\n    \"rateLimit\": 1000,\n    \"metadata\": null\n}'"
+                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"name\": \"My first application\",\n        \"rateLimit\": null,\n        \"uid\": \"unique-app-identifier\"\n    }'"
                     }
                 ]
             }
@@ -4181,138 +4263,127 @@
         "/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}/": {
             "get": {
                 "description": "List attempts by endpoint id",
-                "operationId": "list_attempts_by_endpoint_api_v1_app__app_id__attempt_endpoint__endpoint_id___get",
+                "operationId": "v1.message-attempt.list-by-endpoint",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "path",
-                        "name": "endpoint_id",
-                        "required": true,
+                        "in": "query",
+                        "name": "limit",
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The attempt's ID",
                         "in": "query",
                         "name": "iterator",
-                        "required": false,
                         "schema": {
+                            "description": "The attempt's ID",
                             "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Iterator",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "status",
-                        "required": false,
                         "schema": {
                             "$ref": "#/components/schemas/MessageStatus",
                             "nullable": true
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "status_code_class",
-                        "required": false,
                         "schema": {
                             "$ref": "#/components/schemas/StatusCodeClass",
                             "nullable": true
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "event_types",
-                        "required": false,
-                        "schema": {
-                            "items": {
-                                "example": "user.signup",
-                                "maxLength": 256,
-                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                                "type": "string"
-                            },
-                            "nullable": true,
-                            "title": "Event Types",
-                            "type": "array"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "channel",
-                        "required": false,
                         "schema": {
                             "example": "project_1337",
                             "maxLength": 128,
                             "nullable": true,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Channel",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "before",
-                        "required": false,
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "Before",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "after",
-                        "required": false,
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "After",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "event_types",
                         "schema": {
-                            "description": "The request's idempotency key",
+                            "items": {
+                                "description": "The event type's name",
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
                             "nullable": true,
-                            "title": "Idempotency-Key",
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -4324,7 +4395,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -4400,42 +4471,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByEndpoint('app_id', 'endpoint_id');"
+                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByEndpoint(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByEndpoint('app_id', 'endpoint_id');"
+                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByEndpoint(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_endpoint('app_id', 'endpoint_id')"
+                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_endpoint(\"app_id\", \"endpoint_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_message_attempt_out = await svix.message_attempt.list_by_endpoint('app_id', 'endpoint_id')"
+                        "source": "list_response_message_attempt_out = await svix.message_attempt.list_by_endpoint(\"app_id\", \"endpoint_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseMessageAttemptOut, err := svixClient.MessageAttempt.ListByEndpoint(\"app_id\", \"endpoint_id\")"
+                        "source": "listResponseMessageAttemptOut, err := svixClient.MessageAttempt.ListByEndpoint(ctx, \"app_id\", \"endpoint_id\", nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseMessageAttemptOut = svix.messageAttempt.listByEndpoint('app_id', 'endpoint_id')"
+                        "source": "val listResponseMessageAttemptOut = svix.messageAttempt.listByEndpoint(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseMessageAttemptOut listResponseMessageAttemptOut = svix.getMessageAttempt().listByEndpoint('app_id', 'endpoint_id')"
+                        "source": "ListResponseMessageAttemptOut listResponseMessageAttemptOut = svix.getMessageAttempt().listByEndpoint(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_endpoint('app_id', 'endpoint_id')"
+                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_endpoint(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
@@ -4450,12 +4521,12 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message-attempt list-by-endpoint 'app_id' 'endpoint_id'"
+                        "source": "svix message-attempt list-by-endpoint \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
@@ -4463,153 +4534,142 @@
         "/api/v1/app/{app_id}/attempt/msg/{msg_id}/": {
             "get": {
                 "description": "List attempts by message id",
-                "operationId": "list_attempts_by_msg_api_v1_app__app_id__attempt_msg__msg_id___get",
+                "operationId": "v1.message-attempt.list-by-msg",
                 "parameters": [
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "path",
-                        "name": "msg_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
-                            "type": "string"
-                        }
-                    },
                     {
                         "in": "query",
-                        "name": "endpoint_id",
-                        "required": false,
+                        "name": "limit",
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "nullable": true,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The attempt's ID",
                         "in": "query",
                         "name": "iterator",
-                        "required": false,
                         "schema": {
+                            "description": "The attempt's ID",
                             "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Iterator",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "status",
-                        "required": false,
                         "schema": {
                             "$ref": "#/components/schemas/MessageStatus",
                             "nullable": true
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "status_code_class",
-                        "required": false,
                         "schema": {
                             "$ref": "#/components/schemas/StatusCodeClass",
                             "nullable": true
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
-                        "name": "event_types",
-                        "required": false,
+                        "name": "channel",
                         "schema": {
-                            "items": {
-                                "example": "user.signup",
-                                "maxLength": 256,
-                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                                "type": "string"
-                            },
+                            "example": "project_1337",
+                            "maxLength": 128,
                             "nullable": true,
-                            "title": "Event Types",
-                            "type": "array"
-                        }
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "query",
-                        "name": "channel",
-                        "required": false,
+                        "name": "endpoint_id",
                         "schema": {
-                            "example": "project_1337",
-                            "maxLength": 128,
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
                             "nullable": true,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Channel",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "before",
-                        "required": false,
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "Before",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "after",
-                        "required": false,
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "After",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The msg's ID or UID",
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "description": "The event type's name",
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
@@ -4621,7 +4681,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -4697,42 +4757,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByMsg('app_id', 'msg_id');"
+                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByMsg(\"app_id\", \"msg_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByMsg('app_id', 'msg_id');"
+                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByMsg(\"app_id\", \"msg_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_msg('app_id', 'msg_id')"
+                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_msg(\"app_id\", \"msg_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_message_attempt_out = await svix.message_attempt.list_by_msg('app_id', 'msg_id')"
+                        "source": "list_response_message_attempt_out = await svix.message_attempt.list_by_msg(\"app_id\", \"msg_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseMessageAttemptOut, err := svixClient.MessageAttempt.ListByMsg(\"app_id\", \"msg_id\")"
+                        "source": "listResponseMessageAttemptOut, err := svixClient.MessageAttempt.ListByMsg(ctx, \"app_id\", \"msg_id\", nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseMessageAttemptOut = svix.messageAttempt.listByMsg('app_id', 'msg_id')"
+                        "source": "val listResponseMessageAttemptOut = svix.messageAttempt.listByMsg(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseMessageAttemptOut listResponseMessageAttemptOut = svix.getMessageAttempt().listByMsg('app_id', 'msg_id')"
+                        "source": "ListResponseMessageAttemptOut listResponseMessageAttemptOut = svix.getMessageAttempt().listByMsg(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_msg('app_id', 'msg_id')"
+                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_msg(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Rust",
@@ -4747,12 +4807,12 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message-attempt list-by-msg 'app_id' 'msg_id'"
+                        "source": "svix message-attempt list-by-msg \"app_id\" \"msg_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/attempt/msg/{msg_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/attempt/msg/{msg_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
@@ -4760,68 +4820,54 @@
         "/api/v1/app/{app_id}/endpoint/": {
             "get": {
                 "description": "List the application's endpoints.",
-                "operationId": "list_endpoints_api_v1_app__app_id__endpoint__get",
+                "operationId": "v1.endpoint.list",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "in": "query",
                         "name": "limit",
-                        "required": false,
                         "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
                             "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The ep's ID",
                         "in": "query",
-                        "name": "order",
-                        "required": false,
+                        "name": "iterator",
                         "schema": {
-                            "allOf": [
-                                {
-                                    "$ref": "#/components/schemas/Ordering"
-                                }
-                            ],
-                            "default": "descending"
-                        }
+                            "description": "The ep's ID",
+                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "order",
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
@@ -4833,7 +4879,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -4909,42 +4955,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseEndpointOut = await svix.endpoint.list('app_id');"
+                        "source": "const listResponseEndpointOut = await svix.endpoint.list(\"app_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseEndpointOut = await svix.endpoint.list('app_id');"
+                        "source": "const listResponseEndpointOut = await svix.endpoint.list(\"app_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_endpoint_out = svix.endpoint.list('app_id')"
+                        "source": "list_response_endpoint_out = svix.endpoint.list(\"app_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_endpoint_out = await svix.endpoint.list('app_id')"
+                        "source": "list_response_endpoint_out = await svix.endpoint.list(\"app_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseEndpointOut, err := svixClient.Endpoint.List(\"app_id\", nil)"
+                        "source": "listResponseEndpointOut, err := svixClient.Endpoint.List(ctx, \"app_id\", nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseEndpointOut = svix.endpoint.list('app_id', FetchOptions())"
+                        "source": "val listResponseEndpointOut = svix.endpoint.list(\"app_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseEndpointOut listResponseEndpointOut = svix.getEndpoint().list('app_id', new FetchOptions())"
+                        "source": "ListResponseEndpointOut listResponseEndpointOut = svix.getEndpoint().list(\"app_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_endpoint_out = svix.endpoint.list('app_id')"
+                        "source": "list_response_endpoint_out = svix.endpoint.list(\"app_id\")"
                     },
                     {
                         "label": "Rust",
@@ -4959,44 +5005,42 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint list 'app_id'"
+                        "source": "svix endpoint list \"app_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
             "post": {
                 "description": "Create a new endpoint for the application.\n\nWhen `secret` is `null` the secret is automatically generated (recommended)",
-                "operationId": "create_endpoint_api_v1_app__app_id__endpoint__post",
+                "operationId": "v1.endpoint.create",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
@@ -5018,7 +5062,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -5094,62 +5138,62 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointOut = await svix.endpoint.create('app_id', {\n    uid: \"unique-endpoint-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    description: \"An example endpoint name\",\n    filterTypes: [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    channels: [\n        \"project_123\",\n        \"group_2\"\n    ],\n    disabled: false,\n    rateLimit: 1000,\n    metadata: None,\n    secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
+                        "source": "const endpointOut = await svix.endpoint.create(\"app_id\", {\n    description: \"An example endpoint name\",\n    rateLimit: null,\n    uid: \"unique-ep-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    disabled: false,\n    filterTypes: [\"user.signup\", \"user.deleted\"],\n    channels: [\"project_123\", \"group_2\"],\n    secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointOut = await svix.endpoint.create('app_id', {\n    uid: \"unique-endpoint-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    description: \"An example endpoint name\",\n    filterTypes: [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    channels: [\n        \"project_123\",\n        \"group_2\"\n    ],\n    disabled: false,\n    rateLimit: 1000,\n    metadata: None,\n    secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
+                        "source": "const endpointOut = await svix.endpoint.create(\"app_id\", {\n    description: \"An example endpoint name\",\n    rateLimit: null,\n    uid: \"unique-ep-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    disabled: false,\n    filterTypes: [\"user.signup\", \"user.deleted\"],\n    channels: [\"project_123\", \"group_2\"],\n    secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_out = svix.endpoint.create('app_id', EndpointIn(\n    uid=\"unique-endpoint-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    description=\"An example endpoint name\",\n    filter_types=['user.signup', 'user.deleted'],\n    channels=['project_123', 'group_2'],\n    disabled=False,\n    rate_limit=1000,\n    metadata=None,\n    secret=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n))"
+                        "source": "endpoint_out = svix.endpoint.create(\"app_id\", EndpointIn(\n    description=\"An example endpoint name\",\n    rate_limit=None,\n    uid=\"unique-ep-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    disabled=False,\n    filter_types=[\"user.signup\", \"user.deleted\"],\n    channels=[\"project_123\", \"group_2\"],\n    secret=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_out = await svix.endpoint.create('app_id', EndpointIn(\n    uid=\"unique-endpoint-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    description=\"An example endpoint name\",\n    filter_types=['user.signup', 'user.deleted'],\n    channels=['project_123', 'group_2'],\n    disabled=False,\n    rate_limit=1000,\n    metadata=None,\n    secret=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n))"
+                        "source": "endpoint_out = await svix.endpoint.create(\"app_id\", EndpointIn(\n    description=\"An example endpoint name\",\n    rate_limit=None,\n    uid=\"unique-ep-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    disabled=False,\n    filter_types=[\"user.signup\", \"user.deleted\"],\n    channels=[\"project_123\", \"group_2\"],\n    secret=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointOut, err := svixClient.Endpoint.Create(\"app_id\", &svix.EndpointIn{\n    Uid: \"unique-endpoint-identifier\",\n    Url: \"https://example.com/webhook/\",\n    Version: 1,\n    Description: \"An example endpoint name\",\n    FilterTypes: [...]string{\"user.signup\", \"user.deleted\"},\n    Channels: [...]string{\"project_123\", \"group_2\"},\n    Disabled: False,\n    RateLimit: 1000,\n    Metadata: None,\n    Secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n})"
+                        "source": "endpointOut, err := svixClient.Endpoint.Create(ctx, \"app_id\", &EndpointIn{\n    Description: \"An example endpoint name\",\n    RateLimit: nil,\n    Uid: \"unique-ep-identifier\",\n    Url: \"https://example.com/webhook/\",\n    Version: 1,\n    Disabled: false,\n    FilterTypes: []string{\"user.signup\", \"user.deleted\"},\n    Channels: []string{\"project_123\", \"group_2\"},\n    Secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointOut = svix.endpoint.create('app_id', EndpointIn()\n    .uid(\"unique-endpoint-identifier\"),\n    .url(\"https://example.com/webhook/\"),\n    .version(1),\n    .description(\"An example endpoint name\"),\n    .filterTypes(arrayOf(\"user.signup\", \"user.deleted\")),\n    .channels(arrayOf(\"project_123\", \"group_2\")),\n    .disabled(False),\n    .rateLimit(1000),\n    .metadata(None),\n    .secret(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
+                        "source": "val endpointOut = svix.endpoint.create(\"app_id\", EndpointIn()\n    .description(\"An example endpoint name\")\n    .rateLimit(null)\n    .uid(\"unique-ep-identifier\")\n    .url(\"https://example.com/webhook/\")\n    .version(1)\n    .disabled(false)\n    .filterTypes(arrayOf(\"user.signup\", \"user.deleted\"))\n    .channels(arrayOf(\"project_123\", \"group_2\"))\n    .secret(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointOut endpointOut = svix.getEndpoint().create('app_id', new EndpointIn()\n    .uid(\"unique-endpoint-identifier\"),\n    .url(\"https://example.com/webhook/\"),\n    .version(1),\n    .description(\"An example endpoint name\"),\n    .filterTypes(new String[]{\"user.signup\", \"user.deleted\"}),\n    .channels(new String[]{\"project_123\", \"group_2\"}),\n    .disabled(False),\n    .rateLimit(1000),\n    .metadata(None),\n    .secret(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
+                        "source": "EndpointOut endpointOut = svix.getEndpoint().create(\"app_id\", new EndpointIn()\n    .description(\"An example endpoint name\")\n    .rateLimit(null)\n    .uid(\"unique-ep-identifier\")\n    .url(\"https://example.com/webhook/\")\n    .version(1)\n    .disabled(false)\n    .filterTypes(new String[]{\"user.signup\", \"user.deleted\"})\n    .channels(new String[]{\"project_123\", \"group_2\"})\n    .secret(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_out = svix.endpoint.create('app_id', Svix::EndpointIn.new({\n    \"uid\": \"unique-endpoint-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"description\": \"An example endpoint name\",\n    \"filter_types\": [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"disabled\": false,\n    \"rate_limit\": 1000,\n    \"metadata\": null,\n    \"secret\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}))"
+                        "source": "endpoint_out = svix.endpoint.create(\"app_id\", Svix::EndpointIn.new({\n    \"description\": \"An example endpoint name\",\n    \"rate_limit\": nil,\n    \"uid\": \"unique-ep-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"disabled\": false,\n    \"filter_types\": [\"user.signup\", \"user.deleted\"],\n    \"channels\": [\"project_123\", \"group_2\"],\n    \"secret\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let endpoint_out = svix.endpoint().create(\"app_id\", EndpointIn {\n    uid: Some(\"unique-endpoint-identifier\".to_string()),\n    url: \"https://example.com/webhook/\".to_string(),\n    version: 1,\n    description: Some(\"An example endpoint name\".to_string()),\n    filter_types: Some(vec![\"user.signup\".to_string(), \"user.deleted\".to_string()]),\n    channels: Some(vec![\"project_123\".to_string(), \"group_2\".to_string()]),\n    disabled: Some(False),\n    rate_limit: Some(1000),\n    metadata: None,\n    secret: Some(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\".to_string())\n}, None).await?;"
+                        "source": "let endpoint_out = svix.endpoint().create(\"app_id\", EndpointIn {\n    description: Some(\"An example endpoint name\".to_string()),\n    rate_limit: None,\n    uid: Some(\"unique-ep-identifier\".to_string()),\n    url: \"https://example.com/webhook/\".to_string(),\n    version: 1,\n    disabled: Some(false),\n    filter_types: Some(vec![\"user.signup\".to_string(), \"user.deleted\".to_string()]),\n    channels: Some(vec![\"project_123\".to_string(), \"group_2\".to_string()]),\n    secret: Some(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\".to_string()),\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var endpointOut = await svix.Endpoint.CreateAsync(\"app_id\", new EndpointIn{\n    uid: \"unique-endpoint-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    description: \"An example endpoint name\",\n    filterTypes: new string[] {\"user.signup\", \"user.deleted\"},\n    channels: new string[] {\"project_123\", \"group_2\"},\n    disabled: false,\n    rateLimit: 1000,\n    metadata: None,\n    secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n})"
+                        "source": "var endpointOut = await svix.Endpoint.CreateAsync(\"app_id\", new EndpointIn{\n    description: \"An example endpoint name\",\n    rateLimit: null,\n    uid: \"unique-ep-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    disabled: false,\n    filterTypes: new string[] {\"user.signup\", \"user.deleted\"},\n    channels: new string[] {\"project_123\", \"group_2\"},\n    secret: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint create 'app_id' '{\n    \"uid\": \"unique-endpoint-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"description\": \"An example endpoint name\",\n    \"filterTypes\": [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"disabled\": false,\n    \"rateLimit\": 1000,\n    \"metadata\": null,\n    \"secret\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}'"
+                        "source": "svix endpoint create \"app_id\" '{\n    \"description\": \"An example endpoint name\",\n    \"rateLimit\": null,\n    \"uid\": \"unique-ep-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"disabled\": false,\n    \"filterTypes\": [\"user.signup\", \"user.deleted\"],\n    \"channels\": [\"project_123\", \"group_2\"],\n    \"secret\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"uid\": \"unique-endpoint-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"description\": \"An example endpoint name\",\n    \"filterTypes\": [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"disabled\": false,\n    \"rateLimit\": 1000,\n    \"metadata\": null,\n    \"secret\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"description\": \"An example endpoint name\",\n        \"rateLimit\": null,\n        \"uid\": \"unique-ep-identifier\",\n        \"url\": \"https://example.com/webhook/\",\n        \"version\": 1,\n        \"disabled\": false,\n        \"filterTypes\": [\"user.signup\", \"user.deleted\"],\n        \"channels\": [\"project_123\", \"group_2\"],\n        \"secret\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n    }'"
                     }
                 ]
             }
@@ -5157,52 +5201,42 @@
         "/api/v1/app/{app_id}/endpoint/{endpoint_id}/": {
             "delete": {
                 "description": "Delete an endpoint.",
-                "operationId": "delete_endpoint_api_v1_app__app_id__endpoint__endpoint_id___delete",
+                "operationId": "v1.endpoint.delete",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
                     "204": {
-                        "description": "Successful Response"
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -5278,42 +5312,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.delete('app_id', 'endpoint_id');"
+                        "source": "await svix.endpoint.delete(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.delete('app_id', 'endpoint_id');"
+                        "source": "await svix.endpoint.delete(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.endpoint.delete('app_id', 'endpoint_id')"
+                        "source": "svix.endpoint.delete(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.endpoint.delete('app_id', 'endpoint_id')"
+                        "source": "await svix.endpoint.delete(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Endpoint.Delete(\"app_id\", \"endpoint_id\")"
+                        "source": "err := svixClient.Endpoint.Delete(ctx, \"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.endpoint.delete('app_id', 'endpoint_id')"
+                        "source": "svix.endpoint.delete(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getEndpoint().delete('app_id', 'endpoint_id')"
+                        "source": "svix.getEndpoint().delete(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.endpoint.delete('app_id', 'endpoint_id')"
+                        "source": "svix.endpoint.delete(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
@@ -5328,58 +5362,48 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint delete 'app_id' 'endpoint_id'"
+                        "source": "svix endpoint delete \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
             "get": {
-                "description": "Get an application.",
-                "operationId": "get_endpoint_api_v1_app__app_id__endpoint__endpoint_id___get",
+                "description": "Get an endpoint.",
+                "operationId": "v1.endpoint.get",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -5391,7 +5415,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -5467,42 +5491,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointOut = await svix.endpoint.get('app_id', 'endpoint_id');"
+                        "source": "const endpointOut = await svix.endpoint.get(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointOut = await svix.endpoint.get('app_id', 'endpoint_id');"
+                        "source": "const endpointOut = await svix.endpoint.get(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_out = svix.endpoint.get('app_id', 'endpoint_id')"
+                        "source": "endpoint_out = svix.endpoint.get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_out = await svix.endpoint.get('app_id', 'endpoint_id')"
+                        "source": "endpoint_out = await svix.endpoint.get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointOut, err := svixClient.Endpoint.Get(\"app_id\", \"endpoint_id\")"
+                        "source": "endpointOut, err := svixClient.Endpoint.Get(ctx, \"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointOut = svix.endpoint.get('app_id', 'endpoint_id')"
+                        "source": "val endpointOut = svix.endpoint.get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointOut endpointOut = svix.getEndpoint().get('app_id', 'endpoint_id')"
+                        "source": "EndpointOut endpointOut = svix.getEndpoint().get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_out = svix.endpoint.get('app_id', 'endpoint_id')"
+                        "source": "endpoint_out = svix.endpoint.get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
@@ -5517,58 +5541,175 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint get 'app_id' 'endpoint_id'"
+                        "source": "svix endpoint get \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
-            "put": {
-                "description": "Update an endpoint.",
-                "operationId": "update_endpoint_api_v1_app__app_id__endpoint__endpoint_id___put",
+            "patch": {
+                "description": "Partially update an endpoint.",
+                "operationId": "patch_endpoint",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointPatch"
+                            }
                         }
                     },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Patch Endpoint",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "put": {
+                "description": "Update an endpoint.",
+                "operationId": "v1.endpoint.update",
+                "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
@@ -5590,7 +5731,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "201": {
                         "content": {
@@ -5600,7 +5741,7 @@
                                 }
                             }
                         },
-                        "description": "Created"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -5676,62 +5817,62 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointOut = await svix.endpoint.update('app_id', 'endpoint_id', {\n    uid: \"unique-endpoint-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    description: \"An example endpoint name\",\n    filterTypes: [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    channels: [\n        \"project_123\",\n        \"group_2\"\n    ],\n    disabled: false,\n    rateLimit: 1000,\n    metadata: None\n});"
+                        "source": "const endpointOut = await svix.endpoint.update(\"app_id\", \"endpoint_id\", {\n    description: \"An example endpoint name\",\n    rateLimit: null,\n    uid: \"unique-ep-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    disabled: false,\n    filterTypes: [\"user.signup\", \"user.deleted\"],\n    channels: [\"project_123\", \"group_2\"]\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointOut = await svix.endpoint.update('app_id', 'endpoint_id', {\n    uid: \"unique-endpoint-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    description: \"An example endpoint name\",\n    filterTypes: [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    channels: [\n        \"project_123\",\n        \"group_2\"\n    ],\n    disabled: false,\n    rateLimit: 1000,\n    metadata: None\n});"
+                        "source": "const endpointOut = await svix.endpoint.update(\"app_id\", \"endpoint_id\", {\n    description: \"An example endpoint name\",\n    rateLimit: null,\n    uid: \"unique-ep-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    disabled: false,\n    filterTypes: [\"user.signup\", \"user.deleted\"],\n    channels: [\"project_123\", \"group_2\"]\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_out = svix.endpoint.update('app_id', 'endpoint_id', EndpointUpdate(\n    uid=\"unique-endpoint-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    description=\"An example endpoint name\",\n    filter_types=['user.signup', 'user.deleted'],\n    channels=['project_123', 'group_2'],\n    disabled=False,\n    rate_limit=1000,\n    metadata=None\n))"
+                        "source": "endpoint_out = svix.endpoint.update(\"app_id\", \"endpoint_id\", EndpointUpdate(\n    description=\"An example endpoint name\",\n    rate_limit=None,\n    uid=\"unique-ep-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    disabled=False,\n    filter_types=[\"user.signup\", \"user.deleted\"],\n    channels=[\"project_123\", \"group_2\"]\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_out = await svix.endpoint.update('app_id', 'endpoint_id', EndpointUpdate(\n    uid=\"unique-endpoint-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    description=\"An example endpoint name\",\n    filter_types=['user.signup', 'user.deleted'],\n    channels=['project_123', 'group_2'],\n    disabled=False,\n    rate_limit=1000,\n    metadata=None\n))"
+                        "source": "endpoint_out = await svix.endpoint.update(\"app_id\", \"endpoint_id\", EndpointUpdate(\n    description=\"An example endpoint name\",\n    rate_limit=None,\n    uid=\"unique-ep-identifier\",\n    url=\"https://example.com/webhook/\",\n    version=1,\n    disabled=False,\n    filter_types=[\"user.signup\", \"user.deleted\"],\n    channels=[\"project_123\", \"group_2\"]\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointOut, err := svixClient.Endpoint.Update(\"app_id\", \"endpoint_id\", &svix.EndpointUpdate{\n    Uid: \"unique-endpoint-identifier\",\n    Url: \"https://example.com/webhook/\",\n    Version: 1,\n    Description: \"An example endpoint name\",\n    FilterTypes: [...]string{\"user.signup\", \"user.deleted\"},\n    Channels: [...]string{\"project_123\", \"group_2\"},\n    Disabled: False,\n    RateLimit: 1000,\n    Metadata: None\n})"
+                        "source": "endpointOut, err := svixClient.Endpoint.Update(ctx, \"app_id\", \"endpoint_id\", &EndpointUpdate{\n    Description: \"An example endpoint name\",\n    RateLimit: nil,\n    Uid: \"unique-ep-identifier\",\n    Url: \"https://example.com/webhook/\",\n    Version: 1,\n    Disabled: false,\n    FilterTypes: []string{\"user.signup\", \"user.deleted\"},\n    Channels: []string{\"project_123\", \"group_2\"},\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointOut = svix.endpoint.update('app_id', 'endpoint_id', EndpointUpdate()\n    .uid(\"unique-endpoint-identifier\"),\n    .url(\"https://example.com/webhook/\"),\n    .version(1),\n    .description(\"An example endpoint name\"),\n    .filterTypes(arrayOf(\"user.signup\", \"user.deleted\")),\n    .channels(arrayOf(\"project_123\", \"group_2\")),\n    .disabled(False),\n    .rateLimit(1000),\n    .metadata(None)\n)"
+                        "source": "val endpointOut = svix.endpoint.update(\"app_id\", \"endpoint_id\", EndpointUpdate()\n    .description(\"An example endpoint name\")\n    .rateLimit(null)\n    .uid(\"unique-ep-identifier\")\n    .url(\"https://example.com/webhook/\")\n    .version(1)\n    .disabled(false)\n    .filterTypes(arrayOf(\"user.signup\", \"user.deleted\"))\n    .channels(arrayOf(\"project_123\", \"group_2\"))\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointOut endpointOut = svix.getEndpoint().update('app_id', 'endpoint_id', new EndpointUpdate()\n    .uid(\"unique-endpoint-identifier\"),\n    .url(\"https://example.com/webhook/\"),\n    .version(1),\n    .description(\"An example endpoint name\"),\n    .filterTypes(new String[]{\"user.signup\", \"user.deleted\"}),\n    .channels(new String[]{\"project_123\", \"group_2\"}),\n    .disabled(False),\n    .rateLimit(1000),\n    .metadata(None)\n)"
+                        "source": "EndpointOut endpointOut = svix.getEndpoint().update(\"app_id\", \"endpoint_id\", new EndpointUpdate()\n    .description(\"An example endpoint name\")\n    .rateLimit(null)\n    .uid(\"unique-ep-identifier\")\n    .url(\"https://example.com/webhook/\")\n    .version(1)\n    .disabled(false)\n    .filterTypes(new String[]{\"user.signup\", \"user.deleted\"})\n    .channels(new String[]{\"project_123\", \"group_2\"})\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_out = svix.endpoint.update('app_id', 'endpoint_id', Svix::EndpointUpdate.new({\n    \"uid\": \"unique-endpoint-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"description\": \"An example endpoint name\",\n    \"filter_types\": [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"disabled\": false,\n    \"rate_limit\": 1000,\n    \"metadata\": null\n}))"
+                        "source": "endpoint_out = svix.endpoint.update(\"app_id\", \"endpoint_id\", Svix::EndpointUpdate.new({\n    \"description\": \"An example endpoint name\",\n    \"rate_limit\": nil,\n    \"uid\": \"unique-ep-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"disabled\": false,\n    \"filter_types\": [\"user.signup\", \"user.deleted\"],\n    \"channels\": [\"project_123\", \"group_2\"]\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let endpoint_out = svix.endpoint().update(\"app_id\", \"endpoint_id\", EndpointUpdate {\n    uid: Some(\"unique-endpoint-identifier\".to_string()),\n    url: \"https://example.com/webhook/\".to_string(),\n    version: 1,\n    description: Some(\"An example endpoint name\".to_string()),\n    filter_types: Some(vec![\"user.signup\".to_string(), \"user.deleted\".to_string()]),\n    channels: Some(vec![\"project_123\".to_string(), \"group_2\".to_string()]),\n    disabled: Some(False),\n    rate_limit: Some(1000),\n    metadata: None\n}, None).await?;"
+                        "source": "let endpoint_out = svix.endpoint().update(\"app_id\", \"endpoint_id\", EndpointUpdate {\n    description: Some(\"An example endpoint name\".to_string()),\n    rate_limit: None,\n    uid: Some(\"unique-ep-identifier\".to_string()),\n    url: \"https://example.com/webhook/\".to_string(),\n    version: 1,\n    disabled: Some(false),\n    filter_types: Some(vec![\"user.signup\".to_string(), \"user.deleted\".to_string()]),\n    channels: Some(vec![\"project_123\".to_string(), \"group_2\".to_string()]),\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var endpointOut = await svix.Endpoint.UpdateAsync(\"app_id\", \"endpoint_id\", new EndpointUpdate{\n    uid: \"unique-endpoint-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    description: \"An example endpoint name\",\n    filterTypes: new string[] {\"user.signup\", \"user.deleted\"},\n    channels: new string[] {\"project_123\", \"group_2\"},\n    disabled: false,\n    rateLimit: 1000,\n    metadata: None\n})"
+                        "source": "var endpointOut = await svix.Endpoint.UpdateAsync(\"app_id\", \"endpoint_id\", new EndpointUpdate{\n    description: \"An example endpoint name\",\n    rateLimit: null,\n    uid: \"unique-ep-identifier\",\n    url: \"https://example.com/webhook/\",\n    version: 1,\n    disabled: false,\n    filterTypes: new string[] {\"user.signup\", \"user.deleted\"},\n    channels: new string[] {\"project_123\", \"group_2\"}\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint update 'app_id' 'endpoint_id' '{\n    \"uid\": \"unique-endpoint-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"description\": \"An example endpoint name\",\n    \"filterTypes\": [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"disabled\": false,\n    \"rateLimit\": 1000,\n    \"metadata\": null\n}'"
+                        "source": "svix endpoint update \"app_id\" \"endpoint_id\" '{\n    \"description\": \"An example endpoint name\",\n    \"rateLimit\": null,\n    \"uid\": \"unique-ep-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"disabled\": false,\n    \"filterTypes\": [\"user.signup\", \"user.deleted\"],\n    \"channels\": [\"project_123\", \"group_2\"]\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"uid\": \"unique-endpoint-identifier\",\n    \"url\": \"https://example.com/webhook/\",\n    \"version\": 1,\n    \"description\": \"An example endpoint name\",\n    \"filterTypes\": [\n        \"user.signup\",\n        \"user.deleted\"\n    ],\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"disabled\": false,\n    \"rateLimit\": 1000,\n    \"metadata\": null\n}'"
+                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"description\": \"An example endpoint name\",\n        \"rateLimit\": null,\n        \"uid\": \"unique-ep-identifier\",\n        \"url\": \"https://example.com/webhook/\",\n        \"version\": 1,\n        \"disabled\": false,\n        \"filterTypes\": [\"user.signup\", \"user.deleted\"],\n        \"channels\": [\"project_123\", \"group_2\"]\n    }'"
                     }
                 ]
             }
@@ -5739,47 +5880,37 @@
         "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/": {
             "get": {
                 "description": "Get the additional headers to be sent with the webhook",
-                "operationId": "get_endpoint_headers_api_v1_app__app_id__endpoint__endpoint_id__headers__get",
+                "operationId": "v1.endpoint.get-headers",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -5791,7 +5922,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -5867,42 +5998,42 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointHeadersOut = await svix.endpoint.getHeaders('app_id', 'endpoint_id');"
+                        "source": "const endpointHeadersOut = await svix.endpoint.getHeaders(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointHeadersOut = await svix.endpoint.getHeaders('app_id', 'endpoint_id');"
+                        "source": "const endpointHeadersOut = await svix.endpoint.getHeaders(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_headers_out = svix.endpoint.get_headers('app_id', 'endpoint_id')"
+                        "source": "endpoint_headers_out = svix.endpoint.get_headers(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_headers_out = await svix.endpoint.get_headers('app_id', 'endpoint_id')"
+                        "source": "endpoint_headers_out = await svix.endpoint.get_headers(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointHeadersOut, err := svixClient.Endpoint.GetHeaders(\"app_id\", \"endpoint_id\")"
+                        "source": "endpointHeadersOut, err := svixClient.Endpoint.GetHeaders(ctx, \"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointHeadersOut = svix.endpoint.getHeaders('app_id', 'endpoint_id')"
+                        "source": "val endpointHeadersOut = svix.endpoint.getHeaders(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointHeadersOut endpointHeadersOut = svix.getEndpoint().getHeaders('app_id', 'endpoint_id')"
+                        "source": "EndpointHeadersOut endpointHeadersOut = svix.getEndpoint().getHeaders(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_headers_out = svix.endpoint.get_headers('app_id', 'endpoint_id')"
+                        "source": "endpoint_headers_out = svix.endpoint.get_headers(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
@@ -5917,58 +6048,48 @@
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint get-headers 'app_id' 'endpoint_id'"
+                        "source": "svix endpoint get-headers \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
             "patch": {
                 "description": "Partially set the additional headers to be sent with the webhook",
-                "operationId": "patch_endpoint_headers_api_v1_app__app_id__endpoint__endpoint_id__headers__patch",
+                "operationId": "v1.endpoint.patch-headers",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
@@ -5983,7 +6104,7 @@
                 },
                 "responses": {
                     "204": {
-                        "description": "Successful Response"
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -6059,108 +6180,98 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.patchHeaders('app_id', 'endpoint_id', {\n    headers: {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n});"
+                        "source": "await svix.endpoint.patchHeaders(\"app_id\", \"endpoint_id\", {\n    headers: {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.patchHeaders('app_id', 'endpoint_id', {\n    headers: {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n});"
+                        "source": "await svix.endpoint.patchHeaders(\"app_id\", \"endpoint_id\", {\n    headers: {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.endpoint.patch_headers('app_id', 'endpoint_id', EndpointHeadersPatchIn(\n    headers={'X-Foobar': 'Bar', 'X-Example': '123'}\n))"
+                        "source": "svix.endpoint.patch_headers(\"app_id\", \"endpoint_id\", EndpointHeadersPatchIn(\n    headers={\"X-Example\": \"123\", \"X-Foobar\": \"Bar\"}\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.endpoint.patch_headers('app_id', 'endpoint_id', EndpointHeadersPatchIn(\n    headers={'X-Foobar': 'Bar', 'X-Example': '123'}\n))"
+                        "source": "await svix.endpoint.patch_headers(\"app_id\", \"endpoint_id\", EndpointHeadersPatchIn(\n    headers={\"X-Example\": \"123\", \"X-Foobar\": \"Bar\"}\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Endpoint.PatchHeaders(\"app_id\", \"endpoint_id\", &svix.EndpointHeadersPatchIn{\n    Headers: map[string]string{\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n})"
+                        "source": "err := svixClient.Endpoint.PatchHeaders(ctx, \"app_id\", \"endpoint_id\", &EndpointHeadersPatchIn{\n    Headers: map[string]interface{}{\"X-Example\": \"123\", \"X-Foobar\": \"Bar\"},\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.endpoint.patchHeaders('app_id', 'endpoint_id', EndpointHeadersPatchIn()\n    .headers(\"\"\"{\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\"\"\")\n)"
+                        "source": "svix.endpoint.patchHeaders(\"app_id\", \"endpoint_id\", EndpointHeadersPatchIn()\n    .headers(\"\"\"{\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\"\"\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getEndpoint().patchHeaders('app_id', 'endpoint_id', new EndpointHeadersPatchIn()\n    .headers(\"{\" +\n        \"\\\"X-Foobar\\\": \\\"Bar\\\",\" +\n        \"\\\"X-Example\\\": \\\"123\\\"\" +\n    \"}\")\n)"
+                        "source": "svix.getEndpoint().patchHeaders(\"app_id\", \"endpoint_id\", new EndpointHeadersPatchIn()\n    .headers(\"{\\\"X-Example\\\":\\\"123\\\",\\\"X-Foobar\\\":\\\"Bar\\\"}\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.endpoint.patch_headers('app_id', 'endpoint_id', Svix::EndpointHeadersPatchIn.new({\n    \"headers\": {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n}))"
+                        "source": "svix.endpoint.patch_headers(\"app_id\", \"endpoint_id\", Svix::EndpointHeadersPatchIn.new({\n    \"headers\": {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.endpoint().patch_headers(\"app_id\", \"endpoint_id\", EndpointHeadersPatchIn {\n    headers: HashMap::from([\n        (\"X-Foobar.\"to_string(), \"Bar\".to_string()),\n        (\"X-Example.\"to_string(), \"123\".to_string())\n    ])\n}).await?;"
+                        "source": "svix.endpoint().patch_headers(\"app_id\", \"endpoint_id\", EndpointHeadersPatchIn {\n    headers: json!({\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}),\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Endpoint.PatchHeadersAsync(\"app_id\", \"endpoint_id\", new EndpointHeadersPatchIn{\n    headers: new {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n})"
+                        "source": "await svix.Endpoint.PatchHeadersAsync(\"app_id\", \"endpoint_id\", new EndpointHeadersPatchIn{\n    headers: new {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint patch-headers 'app_id' 'endpoint_id' '{\n    \"headers\": {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n}'"
+                        "source": "svix endpoint patch-headers \"app_id\" \"endpoint_id\" '{\n    \"headers\": {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PATCH' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"headers\": {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n}'"
+                        "source": "curl -X 'PATCH' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"headers\": {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n    }'"
                     }
                 ]
             },
             "put": {
                 "description": "Set the additional headers to be sent with the webhook",
-                "operationId": "update_endpoint_headers_api_v1_app__app_id__endpoint__endpoint_id__headers__put",
+                "operationId": "v1.endpoint.update-headers",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
@@ -6175,7 +6286,7 @@
                 },
                 "responses": {
                     "204": {
-                        "description": "Successful Response"
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -6251,62 +6362,62 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.updateHeaders('app_id', 'endpoint_id', {\n    headers: {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n});"
+                        "source": "await svix.endpoint.updateHeaders(\"app_id\", \"endpoint_id\", {\n    headers: {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.updateHeaders('app_id', 'endpoint_id', {\n    headers: {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n});"
+                        "source": "await svix.endpoint.updateHeaders(\"app_id\", \"endpoint_id\", {\n    headers: {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.endpoint.update_headers('app_id', 'endpoint_id', EndpointHeadersIn(\n    headers={'X-Foobar': 'Bar', 'X-Example': '123'}\n))"
+                        "source": "svix.endpoint.update_headers(\"app_id\", \"endpoint_id\", EndpointHeadersIn(\n    headers={\"X-Example\": \"123\", \"X-Foobar\": \"Bar\"}\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.endpoint.update_headers('app_id', 'endpoint_id', EndpointHeadersIn(\n    headers={'X-Foobar': 'Bar', 'X-Example': '123'}\n))"
+                        "source": "await svix.endpoint.update_headers(\"app_id\", \"endpoint_id\", EndpointHeadersIn(\n    headers={\"X-Example\": \"123\", \"X-Foobar\": \"Bar\"}\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Endpoint.UpdateHeaders(\"app_id\", \"endpoint_id\", &svix.EndpointHeadersIn{\n    Headers: map[string]string{\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n})"
+                        "source": "err := svixClient.Endpoint.UpdateHeaders(ctx, \"app_id\", \"endpoint_id\", &EndpointHeadersIn{\n    Headers: map[string]interface{}{\"X-Example\": \"123\", \"X-Foobar\": \"Bar\"},\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.endpoint.updateHeaders('app_id', 'endpoint_id', EndpointHeadersIn()\n    .headers(\"\"\"{\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\"\"\")\n)"
+                        "source": "svix.endpoint.updateHeaders(\"app_id\", \"endpoint_id\", EndpointHeadersIn()\n    .headers(\"\"\"{\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\"\"\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getEndpoint().updateHeaders('app_id', 'endpoint_id', new EndpointHeadersIn()\n    .headers(\"{\" +\n        \"\\\"X-Foobar\\\": \\\"Bar\\\",\" +\n        \"\\\"X-Example\\\": \\\"123\\\"\" +\n    \"}\")\n)"
+                        "source": "svix.getEndpoint().updateHeaders(\"app_id\", \"endpoint_id\", new EndpointHeadersIn()\n    .headers(\"{\\\"X-Example\\\":\\\"123\\\",\\\"X-Foobar\\\":\\\"Bar\\\"}\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.endpoint.update_headers('app_id', 'endpoint_id', Svix::EndpointHeadersIn.new({\n    \"headers\": {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n}))"
+                        "source": "svix.endpoint.update_headers(\"app_id\", \"endpoint_id\", Svix::EndpointHeadersIn.new({\n    \"headers\": {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.endpoint().update_headers(\"app_id\", \"endpoint_id\", EndpointHeadersIn {\n    headers: HashMap::from([\n        (\"X-Foobar.\"to_string(), \"Bar\".to_string()),\n        (\"X-Example.\"to_string(), \"123\".to_string())\n    ])\n}, None).await?;"
+                        "source": "svix.endpoint().update_headers(\"app_id\", \"endpoint_id\", EndpointHeadersIn {\n    headers: json!({\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}),\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Endpoint.UpdateHeadersAsync(\"app_id\", \"endpoint_id\", new EndpointHeadersIn{\n    headers: new {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n})"
+                        "source": "await svix.Endpoint.UpdateHeadersAsync(\"app_id\", \"endpoint_id\", new EndpointHeadersIn{\n    headers: new {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint update-headers 'app_id' 'endpoint_id' '{\n    \"headers\": {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n}'"
+                        "source": "svix endpoint update-headers \"app_id\" \"endpoint_id\" '{\n    \"headers\": {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"headers\": {\n        \"X-Foobar\": \"Bar\",\n        \"X-Example\": \"123\"\n    }\n}'"
+                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"headers\": {\"X-Example\":\"123\",\"X-Foobar\":\"Bar\"}\n    }'"
                     }
                 ]
             }
@@ -6314,113 +6425,110 @@
         "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/": {
             "get": {
                 "description": "List messages for a particular endpoint. Additionally includes metadata about the latest message attempt.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.",
-                "operationId": "list_attempted_messages_api_v1_app__app_id__endpoint__endpoint_id__msg__get",
+                "operationId": "v1.message-attempt.list-attempted-messages",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "endpoint_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
+                        "in": "query",
+                        "name": "limit",
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The msg's ID",
                         "in": "query",
                         "name": "iterator",
-                        "required": false,
                         "schema": {
+                            "description": "The msg's ID",
                             "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Iterator",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "channel",
-                        "required": false,
                         "schema": {
                             "example": "project_1337",
                             "maxLength": 128,
                             "nullable": true,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Channel",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "status",
-                        "required": false,
                         "schema": {
                             "$ref": "#/components/schemas/MessageStatus",
                             "nullable": true
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "before",
-                        "required": false,
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "Before",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "after",
-                        "required": false,
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "After",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "with_content",
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -6432,7 +6540,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -6505,80 +6613,134 @@
                     "Message Attempt"
                 ],
                 "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseEndpointMessageOut = await svix.messageAttempt.listAttemptedMessages(\"app_id\", \"endpoint_id\");"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseEndpointMessageOut = await svix.messageAttempt.listAttemptedMessages(\"app_id\", \"endpoint_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "list_response_endpoint_message_out = svix.message_attempt.list_attempted_messages(\"app_id\", \"endpoint_id\", None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "list_response_endpoint_message_out = await svix.message_attempt.list_attempted_messages(\"app_id\", \"endpoint_id\", None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "listResponseEndpointMessageOut, err := svixClient.MessageAttempt.ListAttemptedMessages(ctx, \"app_id\", \"endpoint_id\", nil)"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val listResponseEndpointMessageOut = svix.messageAttempt.listAttemptedMessages(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "ListResponseEndpointMessageOut listResponseEndpointMessageOut = svix.getMessageAttempt().listAttemptedMessages(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "list_response_endpoint_message_out = svix.message_attempt.list_attempted_messages(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let list_response_endpoint_message_out = svix.message_attempt().list_attempted_messages(\"app_id\", \"endpoint_id\", None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var listResponseEndpointMessageOut = await svix.MessageAttempt.ListAttemptedMessagesAsync(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix message-attempt list-attempted-messages \"app_id\" \"endpoint_id\""
+                    },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover/": {
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/test-attempt/": {
             "post": {
-                "description": "Resend all failed messages since a given time.",
-                "operationId": "recover_failed_webhooks_api_v1_app__app_id__endpoint__endpoint_id__recover__post",
+                "description": "Creates and sends a message to the specified endpoint. The message attempt and response from the endpoint is returned.\nFIXME: use MessageIn for expediency, even though the `application` parameter is unused. Since this endpoint isn't publicly documented anyway, it should be fine",
+                "operationId": "create_message_attempt_for_endpoint",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/RecoverIn"
+                                "$ref": "#/components/schemas/MessageIn"
                             }
                         }
                     },
                     "required": true
                 },
                 "responses": {
-                    "202": {
+                    "201": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/RecoverOut"
+                                    "$ref": "#/components/schemas/MessageAttemptOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -6646,125 +6808,62 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Recover Failed Webhooks",
+                "summary": "Create Message Attempt For Endpoint",
                 "tags": [
-                    "Endpoint"
-                ],
-                "x-codeSamples": [
-                    {
-                        "label": "JavaScript",
-                        "lang": "JavaScript",
-                        "source": "const recoverOut = await svix.endpoint.recover('app_id', 'endpoint_id', {\n    since: new Date(\"2019-08-24T14:15:22Z\"),\n    until: new Date(\"2019-08-24T14:15:22Z\")\n});"
-                    },
-                    {
-                        "label": "TypeScript",
-                        "lang": "JavaScript",
-                        "source": "const recoverOut = await svix.endpoint.recover('app_id', 'endpoint_id', {\n    since: new Date(\"2019-08-24T14:15:22Z\"),\n    until: new Date(\"2019-08-24T14:15:22Z\")\n});"
-                    },
-                    {
-                        "label": "Python",
-                        "lang": "Python",
-                        "source": "recover_out = svix.endpoint.recover('app_id', 'endpoint_id', RecoverIn(\n    since=datetime.datetime(2019, 8, 24, 14, 15, 22, timezone.utc),\n    until=datetime.datetime(2019, 8, 24, 14, 15, 22, timezone.utc)\n))"
-                    },
-                    {
-                        "label": "Python (Async)",
-                        "lang": "Python",
-                        "source": "recover_out = await svix.endpoint.recover('app_id', 'endpoint_id', RecoverIn(\n    since=datetime.datetime(2019, 8, 24, 14, 15, 22, timezone.utc),\n    until=datetime.datetime(2019, 8, 24, 14, 15, 22, timezone.utc)\n))"
-                    },
-                    {
-                        "label": "Go",
-                        "lang": "Go",
-                        "source": "recoverOut, err := svixClient.Endpoint.Recover(\"app_id\", \"endpoint_id\", &svix.RecoverIn{\n    Since: \"2019-08-24T14:15:22Z\",\n    Until: \"2019-08-24T14:15:22Z\"\n})"
-                    },
-                    {
-                        "label": "Kotlin",
-                        "lang": "Kotlin",
-                        "source": "val recoverOut = svix.endpoint.recover('app_id', 'endpoint_id', RecoverIn()\n    .since(\"2019-08-24T14:15:22Z\"),\n    .until(\"2019-08-24T14:15:22Z\")\n)"
-                    },
-                    {
-                        "label": "Java",
-                        "lang": "Java",
-                        "source": "RecoverOut recoverOut = svix.getEndpoint().recover('app_id', 'endpoint_id', new RecoverIn()\n    .since(\"2019-08-24T14:15:22Z\"),\n    .until(\"2019-08-24T14:15:22Z\")\n)"
-                    },
-                    {
-                        "label": "Ruby",
-                        "lang": "Ruby",
-                        "source": "recover_out = svix.endpoint.recover('app_id', 'endpoint_id', Svix::RecoverIn.new({\n    \"since\": \"2019-08-24T14:15:22Z\",\n    \"until\": \"2019-08-24T14:15:22Z\"\n}))"
-                    },
-                    {
-                        "label": "Rust",
-                        "lang": "Rust",
-                        "source": "let recover_out = svix.endpoint().recover(\"app_id\", \"endpoint_id\", RecoverIn {\n    since: \"2019-08-24T14:15:22Z\".to_string(),\n    until: Some(\"2019-08-24T14:15:22Z\".to_string())\n}).await?;"
-                    },
-                    {
-                        "label": "C#",
-                        "lang": "C#",
-                        "source": "var recoverOut = await svix.Endpoint.RecoverAsync(\"app_id\", \"endpoint_id\", new RecoverIn{\n    since: \"2019-08-24T14:15:22Z\",\n    until: \"2019-08-24T14:15:22Z\"\n})"
-                    },
-                    {
-                        "label": "CLI",
-                        "lang": "Shell",
-                        "source": "svix endpoint recover 'app_id' 'endpoint_id' '{\n    \"since\": \"2019-08-24T14:15:22Z\",\n    \"until\": \"2019-08-24T14:15:22Z\"\n}'"
-                    },
-                    {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"since\": \"2019-08-24T14:15:22Z\",\n    \"until\": \"2019-08-24T14:15:22Z\"\n}'"
-                    }
+                    "Message"
                 ]
             }
         },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/replay-missing/": {
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover/": {
             "post": {
-                "description": "Replays messages to the endpoint. Only messages that were created after `since` will be sent. Messages that were previously sent to the endpoint are not resent.",
-                "operationId": "replay_missing_webhooks_api_v1_app__app_id__endpoint__endpoint_id__replay_missing__post",
+                "description": "Resend all failed messages since a given time.",
+                "operationId": "v1.endpoint.recover",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/ReplayIn"
+                                "$ref": "#/components/schemas/RecoverIn"
                             }
                         }
                     },
@@ -6775,11 +6874,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ReplayOut"
+                                    "$ref": "#/components/schemas/RecoverOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -6847,75 +6946,139 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Replay Missing Webhooks",
+                "summary": "Recover Failed Webhooks",
                 "tags": [
                     "Endpoint"
                 ],
                 "x-codeSamples": [
                     {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/replay-missing/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"since\": \"2019-08-24T14:15:22Z\",\n    \"until\": \"2019-08-24T14:15:22Z\"\n}'"
-                    }
-                ]
-            }
-        },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/": {
-            "get": {
-                "description": "Get the endpoint's signing secret.\n\nThis is used to verify the authenticity of the webhook.\nFor more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/).",
-                "operationId": "get_endpoint_secret_api_v1_app__app_id__endpoint__endpoint_id__secret__get",
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "endpoint_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const recoverOut = await svix.endpoint.recover(\"app_id\", \"endpoint_id\", {\n    until: null\n});"
                     },
                     {
-                        "in": "path",
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const recoverOut = await svix.endpoint.recover(\"app_id\", \"endpoint_id\", {\n    until: null\n});"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "recover_out = svix.endpoint.recover(\"app_id\", \"endpoint_id\", RecoverIn(\n    until=None\n), None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "recover_out = await svix.endpoint.recover(\"app_id\", \"endpoint_id\", RecoverIn(\n    until=None\n), None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "recoverOut, err := svixClient.Endpoint.Recover(ctx, \"app_id\", \"endpoint_id\", &RecoverIn{\n    Until: nil,\n})"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val recoverOut = svix.endpoint.recover(\"app_id\", \"endpoint_id\", RecoverIn()\n    .until(null)\n)"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "RecoverOut recoverOut = svix.getEndpoint().recover(\"app_id\", \"endpoint_id\", new RecoverIn()\n    .until(null)\n)"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "recover_out = svix.endpoint.recover(\"app_id\", \"endpoint_id\", Svix::RecoverIn.new({\n    \"until\": nil\n}))"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let recover_out = svix.endpoint().recover(\"app_id\", \"endpoint_id\", RecoverIn {\n    until: None,\n}, None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var recoverOut = await svix.Endpoint.RecoverAsync(\"app_id\", \"endpoint_id\", new RecoverIn{\n    until: null\n})"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix endpoint recover \"app_id\" \"endpoint_id\" '{\n    \"until\": null\n}'"
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"until\": null\n    }'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/replay-missing/": {
+            "post": {
+                "description": "Replays messages to the endpoint. Only messages that were created after `since` will be sent. Messages that were previously sent to the endpoint are not resent.",
+                "operationId": "v1.endpoint.replay",
+                "parameters": [
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/ReplayIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
-                    "200": {
+                    "202": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EndpointSecretOut"
+                                    "$ref": "#/components/schemas/ReplayOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -6983,7 +7146,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Endpoint Secret",
+                "summary": "Replay Missing Webhooks",
                 "tags": [
                     "Endpoint"
                 ],
@@ -6991,135 +7154,112 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointSecretOut = await svix.endpoint.getSecret('app_id', 'endpoint_id');"
+                        "source": "const replayOut = await svix.endpoint.replay(\"app_id\", \"endpoint_id\", {\n    until: null\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointSecretOut = await svix.endpoint.getSecret('app_id', 'endpoint_id');"
+                        "source": "const replayOut = await svix.endpoint.replay(\"app_id\", \"endpoint_id\", {\n    until: null\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_secret_out = svix.endpoint.get_secret('app_id', 'endpoint_id')"
+                        "source": "replay_out = svix.endpoint.replay(\"app_id\", \"endpoint_id\", ReplayIn(\n    until=None\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_secret_out = await svix.endpoint.get_secret('app_id', 'endpoint_id')"
+                        "source": "replay_out = await svix.endpoint.replay(\"app_id\", \"endpoint_id\", ReplayIn(\n    until=None\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointSecretOut, err := svixClient.Endpoint.GetSecret(\"app_id\", \"endpoint_id\")"
+                        "source": "replayOut, err := svixClient.Endpoint.Replay(ctx, \"app_id\", \"endpoint_id\", &ReplayIn{\n    Until: nil,\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointSecretOut = svix.endpoint.getSecret('app_id', 'endpoint_id')"
+                        "source": "val replayOut = svix.endpoint.replay(\"app_id\", \"endpoint_id\", ReplayIn()\n    .until(null)\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointSecretOut endpointSecretOut = svix.getEndpoint().getSecret('app_id', 'endpoint_id')"
+                        "source": "ReplayOut replayOut = svix.getEndpoint().replay(\"app_id\", \"endpoint_id\", new ReplayIn()\n    .until(null)\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_secret_out = svix.endpoint.get_secret('app_id', 'endpoint_id')"
+                        "source": "replay_out = svix.endpoint.replay(\"app_id\", \"endpoint_id\", Svix::ReplayIn.new({\n    \"until\": nil\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let endpoint_secret_out = svix.endpoint().get_secret(\"app_id\", \"endpoint_id\").await?;"
+                        "source": "let replay_out = svix.endpoint().replay(\"app_id\", \"endpoint_id\", ReplayIn {\n    until: None,\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var endpointSecretOut = await svix.Endpoint.GetSecretAsync(\"app_id\", \"endpoint_id\")"
+                        "source": "var replayOut = await svix.Endpoint.ReplayAsync(\"app_id\", \"endpoint_id\", new ReplayIn{\n    until: null\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint get-secret 'app_id' 'endpoint_id'"
+                        "source": "svix endpoint replay \"app_id\" \"endpoint_id\" '{\n    \"until\": null\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/replay-missing/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"until\": null\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate/": {
-            "post": {
-                "description": "Rotates the endpoint's signing secret.  The previous secret will be valid for the next 24 hours.",
-                "operationId": "rotate_endpoint_secret_api_v1_app__app_id__endpoint__endpoint_id__secret_rotate__post",
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/": {
+            "get": {
+                "description": "Get the endpoint's signing secret.\n\nThis is used to verify the authenticity of the webhook.\nFor more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/).",
+                "operationId": "v1.endpoint.get-secret",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
-                "requestBody": {
-                    "content": {
-                        "application/json": {
-                            "schema": {
-                                "$ref": "#/components/schemas/EndpointSecretRotateIn"
-                            }
-                        }
-                    },
-                    "required": true
-                },
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
-                    },
-                    "400": {
+                    "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                    "$ref": "#/components/schemas/EndpointSecretOut"
                                 }
                             }
                         },
-                        "description": "Bad Request"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -7187,7 +7327,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Rotate Endpoint Secret",
+                "summary": "Get Endpoint Secret",
                 "tags": [
                     "Endpoint"
                 ],
@@ -7195,142 +7335,124 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.rotateSecret('app_id', 'endpoint_id', {\n    key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
+                        "source": "const endpointSecretOut = await svix.endpoint.getSecret(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.rotateSecret('app_id', 'endpoint_id', {\n    key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
+                        "source": "const endpointSecretOut = await svix.endpoint.getSecret(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.endpoint.rotate_secret('app_id', 'endpoint_id', EndpointSecretRotateIn(\n    key=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n))"
+                        "source": "endpoint_secret_out = svix.endpoint.get_secret(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.endpoint.rotate_secret('app_id', 'endpoint_id', EndpointSecretRotateIn(\n    key=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n))"
+                        "source": "endpoint_secret_out = await svix.endpoint.get_secret(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Endpoint.RotateSecret(\"app_id\", \"endpoint_id\", &svix.EndpointSecretRotateIn{\n    Key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n})"
+                        "source": "endpointSecretOut, err := svixClient.Endpoint.GetSecret(ctx, \"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.endpoint.rotateSecret('app_id', 'endpoint_id', EndpointSecretRotateIn()\n    .key(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
+                        "source": "val endpointSecretOut = svix.endpoint.getSecret(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getEndpoint().rotateSecret('app_id', 'endpoint_id', new EndpointSecretRotateIn()\n    .key(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
+                        "source": "EndpointSecretOut endpointSecretOut = svix.getEndpoint().getSecret(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.endpoint.rotate_secret('app_id', 'endpoint_id', Svix::EndpointSecretRotateIn.new({\n    \"key\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}))"
+                        "source": "endpoint_secret_out = svix.endpoint.get_secret(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.endpoint().rotate_secret(\"app_id\", \"endpoint_id\", EndpointSecretRotateIn {\n    key: Some(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\".to_string())\n}).await?;"
+                        "source": "let endpoint_secret_out = svix.endpoint().get_secret(\"app_id\", \"endpoint_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Endpoint.RotateSecretAsync(\"app_id\", \"endpoint_id\", new EndpointSecretRotateIn{\n    key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n})"
+                        "source": "var endpointSecretOut = await svix.Endpoint.GetSecretAsync(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint rotate-secret 'app_id' 'endpoint_id' '{\n    \"key\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}'"
+                        "source": "svix endpoint get-secret \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"key\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/send-example/": {
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate/": {
             "post": {
-                "description": "Send an example message for event",
-                "operationId": "send_event_type_example_message_api_v1_app__app_id__endpoint__endpoint_id__send_example__post",
+                "description": "Rotates the endpoint's signing secret.  The previous secret will be valid for the next 24 hours.",
+                "operationId": "v1.endpoint.rotate-secret",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/EventExampleIn"
+                                "$ref": "#/components/schemas/EndpointSecretRotateIn"
                             }
                         }
                     },
                     "required": true
                 },
                 "responses": {
-                    "202": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/MessageOut"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
-                    },
-                    "400": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/HttpErrorOut"
-                                }
-                            }
-                        },
-                        "description": "Bad Request"
+                    "204": {
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -7398,7 +7520,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Send Event Type Example Message",
+                "summary": "Rotate Endpoint Secret",
                 "tags": [
                     "Endpoint"
                 ],
@@ -7406,122 +7528,131 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const messageOut = await svix.endpoint.send('app_id', 'endpoint_id', {\n    eventType: \"user.signup\"\n});"
+                        "source": "await svix.endpoint.rotateSecret(\"app_id\", \"endpoint_id\", {\n    key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const messageOut = await svix.endpoint.send('app_id', 'endpoint_id', {\n    eventType: \"user.signup\"\n});"
+                        "source": "await svix.endpoint.rotateSecret(\"app_id\", \"endpoint_id\", {\n    key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "message_out = svix.endpoint.send('app_id', 'endpoint_id', EventExampleIn(\n    event_type=\"user.signup\"\n))"
+                        "source": "svix.endpoint.rotate_secret(\"app_id\", \"endpoint_id\", EndpointSecretRotateIn(\n    key=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "message_out = await svix.endpoint.send('app_id', 'endpoint_id', EventExampleIn(\n    event_type=\"user.signup\"\n))"
+                        "source": "await svix.endpoint.rotate_secret(\"app_id\", \"endpoint_id\", EndpointSecretRotateIn(\n    key=\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "messageOut, err := svixClient.Endpoint.Send(\"app_id\", \"endpoint_id\", &svix.EventExampleIn{\n    EventType: \"user.signup\"\n})"
+                        "source": "err := svixClient.Endpoint.RotateSecret(ctx, \"app_id\", \"endpoint_id\", &EndpointSecretRotateIn{\n    Key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val messageOut = svix.endpoint.send('app_id', 'endpoint_id', EventExampleIn()\n    .eventType(\"user.signup\")\n)"
+                        "source": "svix.endpoint.rotateSecret(\"app_id\", \"endpoint_id\", EndpointSecretRotateIn()\n    .key(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "MessageOut messageOut = svix.getEndpoint().send('app_id', 'endpoint_id', new EventExampleIn()\n    .eventType(\"user.signup\")\n)"
+                        "source": "svix.getEndpoint().rotateSecret(\"app_id\", \"endpoint_id\", new EndpointSecretRotateIn()\n    .key(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "message_out = svix.endpoint.send('app_id', 'endpoint_id', Svix::EventExampleIn.new({\n    \"event_type\": \"user.signup\"\n}))"
+                        "source": "svix.endpoint.rotate_secret(\"app_id\", \"endpoint_id\", Svix::EndpointSecretRotateIn.new({\n    \"key\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let message_out = svix.endpoint().send(\"app_id\", \"endpoint_id\", EventExampleIn {\n    event_type: \"user.signup\".to_string()\n}).await?;"
+                        "source": "svix.endpoint().rotate_secret(\"app_id\", \"endpoint_id\", EndpointSecretRotateIn {\n    key: Some(\"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\".to_string()),\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var messageOut = await svix.Endpoint.SendAsync(\"app_id\", \"endpoint_id\", new EventExampleIn{\n    eventType: \"user.signup\"\n})"
+                        "source": "await svix.Endpoint.RotateSecretAsync(\"app_id\", \"endpoint_id\", new EndpointSecretRotateIn{\n    key: \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint send 'app_id' 'endpoint_id' '{\n    \"eventType\": \"user.signup\"\n}'"
+                        "source": "svix endpoint rotate-secret \"app_id\" \"endpoint_id\" '{\n    \"key\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/send-example/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"eventType\": \"user.signup\"\n}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"key\": \"whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD\"\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/": {
-            "get": {
-                "description": "Get basic statistics for the endpoint.",
-                "operationId": "get_endpoint_stats_api_v1_app__app_id__endpoint__endpoint_id__stats__get",
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/send-example/": {
+            "post": {
+                "description": "Send an example message for event",
+                "operationId": "v1.endpoint.send-example",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EventExampleIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
                     "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EndpointStats"
+                                    "$ref": "#/components/schemas/MessageOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -7589,7 +7720,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Endpoint Stats",
+                "summary": "Send Event Type Example Message",
                 "tags": [
                     "Endpoint"
                 ],
@@ -7597,110 +7728,120 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointStats = await svix.endpoint.getStats('app_id', 'endpoint_id');"
+                        "source": "const messageOut = await svix.endpoint.sendExample(\"app_id\", \"endpoint_id\", {\n    eventType: \"user.signup\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointStats = await svix.endpoint.getStats('app_id', 'endpoint_id');"
+                        "source": "const messageOut = await svix.endpoint.sendExample(\"app_id\", \"endpoint_id\", {\n    eventType: \"user.signup\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_stats = svix.endpoint.get_stats('app_id', 'endpoint_id')"
+                        "source": "message_out = svix.endpoint.send_example(\"app_id\", \"endpoint_id\", EventExampleIn(\n    event_type=\"user.signup\"\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_stats = await svix.endpoint.get_stats('app_id', 'endpoint_id')"
+                        "source": "message_out = await svix.endpoint.send_example(\"app_id\", \"endpoint_id\", EventExampleIn(\n    event_type=\"user.signup\"\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointStats, err := svixClient.Endpoint.GetStats(\"app_id\", \"endpoint_id\")"
+                        "source": "messageOut, err := svixClient.Endpoint.SendExample(ctx, \"app_id\", \"endpoint_id\", &EventExampleIn{\n    EventType: \"user.signup\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointStats = svix.endpoint.getStats('app_id', 'endpoint_id')"
+                        "source": "val messageOut = svix.endpoint.sendExample(\"app_id\", \"endpoint_id\", EventExampleIn()\n    .eventType(\"user.signup\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointStats endpointStats = svix.getEndpoint().getStats('app_id', 'endpoint_id')"
+                        "source": "MessageOut messageOut = svix.getEndpoint().sendExample(\"app_id\", \"endpoint_id\", new EventExampleIn()\n    .eventType(\"user.signup\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_stats = svix.endpoint.get_stats('app_id', 'endpoint_id')"
+                        "source": "message_out = svix.endpoint.send_example(\"app_id\", \"endpoint_id\", Svix::EventExampleIn.new({\n    \"event_type\": \"user.signup\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let endpoint_stats = svix.endpoint().get_stats(\"app_id\", \"endpoint_id\").await?;"
+                        "source": "let message_out = svix.endpoint().send_example(\"app_id\", \"endpoint_id\", EventExampleIn {\n    event_type: \"user.signup\".to_string(),\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var endpointStats = await svix.Endpoint.GetStatsAsync(\"app_id\", \"endpoint_id\")"
+                        "source": "var messageOut = await svix.Endpoint.SendExampleAsync(\"app_id\", \"endpoint_id\", new EventExampleIn{\n    eventType: \"user.signup\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint get-stats 'app_id' 'endpoint_id'"
+                        "source": "svix endpoint send-example \"app_id\" \"endpoint_id\" '{\n    \"eventType\": \"user.signup\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/send-example/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"eventType\": \"user.signup\"\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/": {
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/": {
             "get": {
-                "description": "Get the transformation code associated with this endpoint",
-                "operationId": "get_endpoint_transformation_api_v1_app__app_id__endpoint__endpoint_id__transformation__get",
+                "description": "Get basic statistics for the endpoint.",
+                "operationId": "v1.endpoint.get-stats",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "since",
                         "schema": {
-                            "description": "The request's idempotency key",
+                            "format": "date-time",
                             "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "until",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
@@ -7708,11 +7849,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EndpointTransformationOut"
+                                    "$ref": "#/components/schemas/EndpointStats"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -7780,7 +7921,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Endpoint Transformation",
+                "summary": "Endpoint Stats",
                 "tags": [
                     "Endpoint"
                 ],
@@ -7788,123 +7929,112 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointTransformationOut = await svix.endpoint.transformationGet('app_id', 'endpoint_id');"
+                        "source": "const endpointStats = await svix.endpoint.getStats(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointTransformationOut = await svix.endpoint.transformationGet('app_id', 'endpoint_id');"
+                        "source": "const endpointStats = await svix.endpoint.getStats(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_transformation_out = svix.endpoint.transformation_get('app_id', 'endpoint_id')"
+                        "source": "endpoint_stats = svix.endpoint.get_stats(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_transformation_out = await svix.endpoint.transformation_get('app_id', 'endpoint_id')"
+                        "source": "endpoint_stats = await svix.endpoint.get_stats(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointTransformationOut, err := svixClient.Endpoint.TransformationGet(\"app_id\", \"endpoint_id\")"
+                        "source": "endpointStats, err := svixClient.Endpoint.GetStats(ctx, \"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointTransformationOut = svix.endpoint.transformationGet('app_id', 'endpoint_id')"
+                        "source": "val endpointStats = svix.endpoint.getStats(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointTransformationOut endpointTransformationOut = svix.getEndpoint().transformationGet('app_id', 'endpoint_id')"
+                        "source": "EndpointStats endpointStats = svix.getEndpoint().getStats(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_transformation_out = svix.endpoint.transformation_get('app_id', 'endpoint_id')"
+                        "source": "endpoint_stats = svix.endpoint.get_stats(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let endpoint_transformation_out = svix.endpoint().transformation_get(\"app_id\", \"endpoint_id\").await?;"
+                        "source": "let endpoint_stats = svix.endpoint().get_stats(\"app_id\", \"endpoint_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var endpointTransformationOut = await svix.Endpoint.TransformationGetAsync(\"app_id\", \"endpoint_id\")"
+                        "source": "var endpointStats = await svix.Endpoint.GetStatsAsync(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint transformation-get 'app_id' 'endpoint_id'"
+                        "source": "svix endpoint get-stats \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            },
-            "patch": {
-                "description": "Set or unset the transformation code associated with this endpoint",
-                "operationId": "set_endpoint_transformation_api_v1_app__app_id__endpoint__endpoint_id__transformation__patch",
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/": {
+            "get": {
+                "description": "Get the transformation code associated with this endpoint",
+                "operationId": "v1.endpoint.transformation-get",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
                         "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
-                "requestBody": {
-                    "content": {
-                        "application/json": {
-                            "schema": {
-                                "$ref": "#/components/schemas/EndpointTransformationIn"
-                            }
-                        }
-                    },
-                    "required": true
-                },
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointTransformationOut"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -7972,7 +8102,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Set Endpoint Transformation",
+                "summary": "Get Endpoint Transformation",
                 "tags": [
                     "Endpoint"
                 ],
@@ -7980,142 +8110,113 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.transformationPartialUpdate('app_id', 'endpoint_id', {\n    code: None,\n    enabled: None\n});"
+                        "source": "const endpointTransformationOut = await svix.endpoint.transformationGet(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.endpoint.transformationPartialUpdate('app_id', 'endpoint_id', {\n    code: None,\n    enabled: None\n});"
+                        "source": "const endpointTransformationOut = await svix.endpoint.transformationGet(\"app_id\", \"endpoint_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.endpoint.transformation_partial_update('app_id', 'endpoint_id', EndpointTransformationIn(\n    code=None,\n    enabled=None\n))"
+                        "source": "endpoint_transformation_out = svix.endpoint.transformation_get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.endpoint.transformation_partial_update('app_id', 'endpoint_id', EndpointTransformationIn(\n    code=None,\n    enabled=None\n))"
+                        "source": "endpoint_transformation_out = await svix.endpoint.transformation_get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Endpoint.TransformationPartialUpdate(\"app_id\", \"endpoint_id\", &svix.EndpointTransformationIn{\n    Code: None,\n    Enabled: None\n})"
+                        "source": "endpointTransformationOut, err := svixClient.Endpoint.TransformationGet(ctx, \"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.endpoint.transformationPartialUpdate('app_id', 'endpoint_id', EndpointTransformationIn()\n    .code(None),\n    .enabled(None)\n)"
+                        "source": "val endpointTransformationOut = svix.endpoint.transformationGet(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getEndpoint().transformationPartialUpdate('app_id', 'endpoint_id', new EndpointTransformationIn()\n    .code(None),\n    .enabled(None)\n)"
+                        "source": "EndpointTransformationOut endpointTransformationOut = svix.getEndpoint().transformationGet(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.endpoint.transformation_partial_update('app_id', 'endpoint_id', Svix::EndpointTransformationIn.new({\n    \"code\": null,\n    \"enabled\": null\n}))"
+                        "source": "endpoint_transformation_out = svix.endpoint.transformation_get(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.endpoint().transformation_partial_update(\"app_id\", \"endpoint_id\", EndpointTransformationIn {\n    code: None,\n    enabled: None\n}).await?;"
+                        "source": "let endpoint_transformation_out = svix.endpoint().transformation_get(\"app_id\", \"endpoint_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Endpoint.TransformationPartialUpdateAsync(\"app_id\", \"endpoint_id\", new EndpointTransformationIn{\n    code: None,\n    enabled: None\n})"
+                        "source": "var endpointTransformationOut = await svix.Endpoint.TransformationGetAsync(\"app_id\", \"endpoint_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint transformation-partial-update 'app_id' 'endpoint_id' '{\n    \"code\": null,\n    \"enabled\": null\n}'"
+                        "source": "svix endpoint transformation-get \"app_id\" \"endpoint_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PATCH' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"code\": null,\n    \"enabled\": null\n}'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            }
-        },
-        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/simulate/": {
-            "post": {
-                "description": "Simulate running the transformation on the payload and code",
-                "operationId": "simulate_endpoint_transformation_api_v1_app__app_id__endpoint__endpoint_id__transformation_simulate__post",
+            },
+            "patch": {
+                "description": "Set or unset the transformation code associated with this endpoint",
+                "operationId": "v1.endpoint.transformation-partial-update",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The ep's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "endpoint_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/EndpointTransformationSimulateIn"
+                                "$ref": "#/components/schemas/EndpointTransformationIn"
                             }
                         }
                     },
                     "required": true
                 },
                 "responses": {
-                    "200": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/EndpointTransformationSimulateOut"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
-                    },
-                    "400": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/HttpErrorOut"
-                                }
-                            }
-                        },
-                        "description": "Bad Request"
+                    "204": {
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -8183,7 +8284,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Simulate Endpoint Transformation",
+                "summary": "Set Endpoint Transformation",
                 "tags": [
                     "Endpoint"
                 ],
@@ -8191,129 +8292,131 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const endpointTransformationSimulateOut = await svix.endpoint.simulate('app_id', 'endpoint_id', {\n    code: None,\n    eventType: \"user.signup\",\n    channels: None,\n    payload: None\n});"
+                        "source": "await svix.endpoint.transformationPartialUpdate(\"app_id\", \"endpoint_id\", {\n    code: null\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const endpointTransformationSimulateOut = await svix.endpoint.simulate('app_id', 'endpoint_id', {\n    code: None,\n    eventType: \"user.signup\",\n    channels: None,\n    payload: None\n});"
+                        "source": "await svix.endpoint.transformationPartialUpdate(\"app_id\", \"endpoint_id\", {\n    code: null\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "endpoint_transformation_simulate_out = svix.endpoint.simulate('app_id', 'endpoint_id', EndpointTransformationSimulateIn(\n    code=None,\n    event_type=\"user.signup\",\n    channels=None,\n    payload=None\n))"
+                        "source": "svix.endpoint.transformation_partial_update(\"app_id\", \"endpoint_id\", EndpointTransformationIn(\n    code=None\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "endpoint_transformation_simulate_out = await svix.endpoint.simulate('app_id', 'endpoint_id', EndpointTransformationSimulateIn(\n    code=None,\n    event_type=\"user.signup\",\n    channels=None,\n    payload=None\n))"
+                        "source": "await svix.endpoint.transformation_partial_update(\"app_id\", \"endpoint_id\", EndpointTransformationIn(\n    code=None\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "endpointTransformationSimulateOut, err := svixClient.Endpoint.Simulate(\"app_id\", \"endpoint_id\", &svix.EndpointTransformationSimulateIn{\n    Code: None,\n    EventType: \"user.signup\",\n    Channels: None,\n    Payload: None\n})"
+                        "source": "err := svixClient.Endpoint.TransformationPartialUpdate(ctx, \"app_id\", \"endpoint_id\", &EndpointTransformationIn{\n    Code: nil,\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val endpointTransformationSimulateOut = svix.endpoint.simulate('app_id', 'endpoint_id', EndpointTransformationSimulateIn()\n    .code(None),\n    .eventType(\"user.signup\"),\n    .channels(None),\n    .payload(None)\n)"
+                        "source": "svix.endpoint.transformationPartialUpdate(\"app_id\", \"endpoint_id\", EndpointTransformationIn()\n    .code(null)\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EndpointTransformationSimulateOut endpointTransformationSimulateOut = svix.getEndpoint().simulate('app_id', 'endpoint_id', new EndpointTransformationSimulateIn()\n    .code(None),\n    .eventType(\"user.signup\"),\n    .channels(None),\n    .payload(None)\n)"
+                        "source": "svix.getEndpoint().transformationPartialUpdate(\"app_id\", \"endpoint_id\", new EndpointTransformationIn()\n    .code(null)\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "endpoint_transformation_simulate_out = svix.endpoint.simulate('app_id', 'endpoint_id', Svix::EndpointTransformationSimulateIn.new({\n    \"code\": null,\n    \"event_type\": \"user.signup\",\n    \"channels\": null,\n    \"payload\": null\n}))"
+                        "source": "svix.endpoint.transformation_partial_update(\"app_id\", \"endpoint_id\", Svix::EndpointTransformationIn.new({\n    \"code\": nil\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let endpoint_transformation_simulate_out = svix.endpoint().simulate(\"app_id\", \"endpoint_id\", EndpointTransformationSimulateIn {\n    code: None,\n    event_type: \"user.signup\".to_string(),\n    channels: None,\n    payload: None\n}).await?;"
+                        "source": "svix.endpoint().transformation_partial_update(\"app_id\", \"endpoint_id\", EndpointTransformationIn {\n    code: None,\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var endpointTransformationSimulateOut = await svix.Endpoint.SimulateAsync(\"app_id\", \"endpoint_id\", new EndpointTransformationSimulateIn{\n    code: None,\n    eventType: \"user.signup\",\n    channels: None,\n    payload: None\n})"
+                        "source": "await svix.Endpoint.TransformationPartialUpdateAsync(\"app_id\", \"endpoint_id\", new EndpointTransformationIn{\n    code: null\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix endpoint simulate 'app_id' 'endpoint_id' '{\n    \"code\": null,\n    \"eventType\": \"user.signup\",\n    \"channels\": null,\n    \"payload\": null\n}'"
+                        "source": "svix endpoint transformation-partial-update \"app_id\" \"endpoint_id\" '{\n    \"code\": null\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/simulate/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"code\": null,\n    \"eventType\": \"user.signup\",\n    \"channels\": null,\n    \"payload\": null\n}'"
+                        "source": "curl -X 'PATCH' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"code\": null\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/integration/": {
-            "get": {
-                "description": "List the application's integrations.",
-                "operationId": "list_integrations_api_v1_app__app_id__integration__get",
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/simulate/": {
+            "post": {
+                "description": "Simulate running the transformation on the payload and code",
+                "operationId": "v1.endpoint.transformation-simulate",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
                         "schema": {
-                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointTransformationSimulateIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
                     "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ListResponse_IntegrationOut_"
+                                    "$ref": "#/components/schemas/EndpointTransformationSimulateOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -8381,124 +8484,128 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "List Integrations",
+                "summary": "Simulate",
                 "tags": [
-                    "Integration"
+                    "Endpoint"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseIntegrationOut = await svix.integration.list('app_id');"
+                        "source": "const endpointTransformationSimulateOut = await svix.endpoint.transformationSimulate(\"app_id\", \"endpoint_id\", {\n    eventType: \"user.signup\",\n    channels: null\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseIntegrationOut = await svix.integration.list('app_id');"
+                        "source": "const endpointTransformationSimulateOut = await svix.endpoint.transformationSimulate(\"app_id\", \"endpoint_id\", {\n    eventType: \"user.signup\",\n    channels: null\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_integration_out = svix.integration.list('app_id')"
+                        "source": "endpoint_transformation_simulate_out = svix.endpoint.transformation_simulate(\"app_id\", \"endpoint_id\", EndpointTransformationSimulateIn(\n    event_type=\"user.signup\",\n    channels=None\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_integration_out = await svix.integration.list('app_id')"
+                        "source": "endpoint_transformation_simulate_out = await svix.endpoint.transformation_simulate(\"app_id\", \"endpoint_id\", EndpointTransformationSimulateIn(\n    event_type=\"user.signup\",\n    channels=None\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseIntegrationOut, err := svixClient.Integration.List(\"app_id\", nil)"
+                        "source": "endpointTransformationSimulateOut, err := svixClient.Endpoint.TransformationSimulate(ctx, \"app_id\", \"endpoint_id\", &EndpointTransformationSimulateIn{\n    EventType: \"user.signup\",\n    Channels: nil,\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseIntegrationOut = svix.integration.list('app_id', FetchOptions())"
+                        "source": "val endpointTransformationSimulateOut = svix.endpoint.transformationSimulate(\"app_id\", \"endpoint_id\", EndpointTransformationSimulateIn()\n    .eventType(\"user.signup\")\n    .channels(null)\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseIntegrationOut listResponseIntegrationOut = svix.getIntegration().list('app_id', new FetchOptions())"
+                        "source": "EndpointTransformationSimulateOut endpointTransformationSimulateOut = svix.getEndpoint().transformationSimulate(\"app_id\", \"endpoint_id\", new EndpointTransformationSimulateIn()\n    .eventType(\"user.signup\")\n    .channels(null)\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_integration_out = svix.integration.list('app_id')"
+                        "source": "endpoint_transformation_simulate_out = svix.endpoint.transformation_simulate(\"app_id\", \"endpoint_id\", Svix::EndpointTransformationSimulateIn.new({\n    \"event_type\": \"user.signup\",\n    \"channels\": nil\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let list_response_integration_out = svix.integration().list(\"app_id\", None).await?;"
+                        "source": "let endpoint_transformation_simulate_out = svix.endpoint().transformation_simulate(\"app_id\", \"endpoint_id\", EndpointTransformationSimulateIn {\n    event_type: \"user.signup\".to_string(),\n    channels: None,\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var listResponseIntegrationOut = await svix.Integration.ListAsync(\"app_id\")"
+                        "source": "var endpointTransformationSimulateOut = await svix.Endpoint.TransformationSimulateAsync(\"app_id\", \"endpoint_id\", new EndpointTransformationSimulateIn{\n    eventType: \"user.signup\",\n    channels: null\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration list 'app_id'"
+                        "source": "svix endpoint transformation-simulate \"app_id\" \"endpoint_id\" '{\n    \"eventType\": \"user.signup\",\n    \"channels\": null\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/endpoint/{endpoint_id}/transformation/simulate/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"eventType\": \"user.signup\",\n        \"channels\": null\n    }'"
                     }
                 ]
-            },
-            "post": {
-                "description": "Create an integration.",
-                "operationId": "create_integration_api_v1_app__app_id__integration__post",
+            }
+        },
+        "/api/v1/app/{app_id}/integration/": {
+            "get": {
+                "description": "List the application's integrations.",
+                "operationId": "v1.integration.list",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The integ's ID",
+                        "in": "query",
+                        "name": "iterator",
                         "schema": {
-                            "description": "The request's idempotency key",
+                            "description": "The integ's ID",
+                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     }
                 ],
-                "requestBody": {
-                    "content": {
-                        "application/json": {
-                            "schema": {
-                                "$ref": "#/components/schemas/IntegrationIn"
-                            }
-                        }
-                    },
-                    "required": true
-                },
                 "responses": {
-                    "201": {
+                    "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/IntegrationOut"
+                                    "$ref": "#/components/schemas/ListResponse_IntegrationOut_"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -8566,7 +8673,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Create Integration",
+                "summary": "List Integrations",
                 "tags": [
                     "Integration"
                 ],
@@ -8574,111 +8681,114 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const integrationOut = await svix.integration.create('app_id', {\n    name: \"Example Integration\"\n});"
+                        "source": "const listResponseIntegrationOut = await svix.integration.list(\"app_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const integrationOut = await svix.integration.create('app_id', {\n    name: \"Example Integration\"\n});"
+                        "source": "const listResponseIntegrationOut = await svix.integration.list(\"app_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "integration_out = svix.integration.create('app_id', IntegrationIn(\n    name=\"Example Integration\"\n))"
+                        "source": "list_response_integration_out = svix.integration.list(\"app_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "integration_out = await svix.integration.create('app_id', IntegrationIn(\n    name=\"Example Integration\"\n))"
+                        "source": "list_response_integration_out = await svix.integration.list(\"app_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "integrationOut, err := svixClient.Integration.Create(\"app_id\", &svix.IntegrationIn{\n    Name: \"Example Integration\"\n})"
+                        "source": "listResponseIntegrationOut, err := svixClient.Integration.List(ctx, \"app_id\", nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val integrationOut = svix.integration.create('app_id', IntegrationIn()\n    .name(\"Example Integration\")\n)"
+                        "source": "val listResponseIntegrationOut = svix.integration.list(\"app_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "IntegrationOut integrationOut = svix.getIntegration().create('app_id', new IntegrationIn()\n    .name(\"Example Integration\")\n)"
+                        "source": "ListResponseIntegrationOut listResponseIntegrationOut = svix.getIntegration().list(\"app_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "integration_out = svix.integration.create('app_id', Svix::IntegrationIn.new({\n    \"name\": \"Example Integration\"\n}))"
+                        "source": "list_response_integration_out = svix.integration.list(\"app_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let integration_out = svix.integration().create(\"app_id\", IntegrationIn {\n    name: \"Example Integration\".to_string()\n}, None).await?;"
+                        "source": "let list_response_integration_out = svix.integration().list(\"app_id\", None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var integrationOut = await svix.Integration.CreateAsync(\"app_id\", new IntegrationIn{\n    name: \"Example Integration\"\n})"
+                        "source": "var listResponseIntegrationOut = await svix.Integration.ListAsync(\"app_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration create 'app_id' '{\n    \"name\": \"Example Integration\"\n}'"
+                        "source": "svix integration list \"app_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"name\": \"Example Integration\"\n}'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            }
-        },
-        "/api/v1/app/{app_id}/integration/{integ_id}/": {
-            "delete": {
-                "description": "Delete an integration and revoke it's key.",
-                "operationId": "delete_integration_api_v1_app__app_id__integration__integ_id___delete",
+            },
+            "post": {
+                "description": "Create an integration.",
+                "operationId": "v1.integration.create",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "integ_id",
-                        "required": true,
-                        "schema": {
-                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Integ Id",
-                            "type": "string"
-                        }
-                    },
-                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/IntegrationIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/IntegrationOut"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -8746,7 +8856,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Delete Integration",
+                "summary": "Create Integration",
                 "tags": [
                     "Integration"
                 ],
@@ -8754,116 +8864,102 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.integration.delete('app_id', 'integ_id');"
+                        "source": "const integrationOut = await svix.integration.create(\"app_id\", {\n    name: \"Example Integration\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.integration.delete('app_id', 'integ_id');"
+                        "source": "const integrationOut = await svix.integration.create(\"app_id\", {\n    name: \"Example Integration\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.integration.delete('app_id', 'integ_id')"
+                        "source": "integration_out = svix.integration.create(\"app_id\", IntegrationIn(\n    name=\"Example Integration\"\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.integration.delete('app_id', 'integ_id')"
+                        "source": "integration_out = await svix.integration.create(\"app_id\", IntegrationIn(\n    name=\"Example Integration\"\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Integration.Delete(\"app_id\", \"integ_id\")"
+                        "source": "integrationOut, err := svixClient.Integration.Create(ctx, \"app_id\", &IntegrationIn{\n    Name: \"Example Integration\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.integration.delete('app_id', 'integ_id')"
+                        "source": "val integrationOut = svix.integration.create(\"app_id\", IntegrationIn()\n    .name(\"Example Integration\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getIntegration().delete('app_id', 'integ_id')"
+                        "source": "IntegrationOut integrationOut = svix.getIntegration().create(\"app_id\", new IntegrationIn()\n    .name(\"Example Integration\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.integration.delete('app_id', 'integ_id')"
+                        "source": "integration_out = svix.integration.create(\"app_id\", Svix::IntegrationIn.new({\n    \"name\": \"Example Integration\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.integration().delete(\"app_id\", \"integ_id\").await?;"
+                        "source": "let integration_out = svix.integration().create(\"app_id\", IntegrationIn {\n    name: \"Example Integration\".to_string(),\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Integration.DeleteAsync(\"app_id\", \"integ_id\")"
+                        "source": "var integrationOut = await svix.Integration.CreateAsync(\"app_id\", new IntegrationIn{\n    name: \"Example Integration\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration delete 'app_id' 'integ_id'"
+                        "source": "svix integration create \"app_id\" '{\n    \"name\": \"Example Integration\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"name\": \"Example Integration\"\n    }'"
                     }
                 ]
-            },
-            "get": {
-                "description": "Get an integration.",
-                "operationId": "get_integration_api_v1_app__app_id__integration__integ_id___get",
+            }
+        },
+        "/api/v1/app/{app_id}/integration/{integ_id}/": {
+            "delete": {
+                "description": "Delete an integration.",
+                "operationId": "v1.integration.delete",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "integ_id",
-                        "required": true,
-                        "schema": {
-                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Integ Id",
-                            "type": "string"
-                        }
-                    },
-                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The integ's ID",
+                        "in": "path",
+                        "name": "integ_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The integ's ID",
+                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/IntegrationOut"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
+                    "204": {
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -8931,7 +9027,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Integration",
+                "summary": "Delete Integration",
                 "tags": [
                     "Integration"
                 ],
@@ -8939,116 +9035,97 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const integrationOut = await svix.integration.get('app_id', 'integ_id');"
+                        "source": "await svix.integration.delete(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const integrationOut = await svix.integration.get('app_id', 'integ_id');"
+                        "source": "await svix.integration.delete(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "integration_out = svix.integration.get('app_id', 'integ_id')"
+                        "source": "svix.integration.delete(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "integration_out = await svix.integration.get('app_id', 'integ_id')"
+                        "source": "await svix.integration.delete(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "integrationOut, err := svixClient.Integration.Get(\"app_id\", \"integ_id\")"
+                        "source": "err := svixClient.Integration.Delete(ctx, \"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val integrationOut = svix.integration.get('app_id', 'integ_id')"
+                        "source": "svix.integration.delete(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "IntegrationOut integrationOut = svix.getIntegration().get('app_id', 'integ_id')"
+                        "source": "svix.getIntegration().delete(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "integration_out = svix.integration.get('app_id', 'integ_id')"
+                        "source": "svix.integration.delete(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let integration_out = svix.integration().get(\"app_id\", \"integ_id\").await?;"
+                        "source": "svix.integration().delete(\"app_id\", \"integ_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var integrationOut = await svix.Integration.GetAsync(\"app_id\", \"integ_id\")"
+                        "source": "await svix.Integration.DeleteAsync(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration get 'app_id' 'integ_id'"
+                        "source": "svix integration delete \"app_id\" \"integ_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
-            "put": {
-                "description": "Update an integration.",
-                "operationId": "update_integration_api_v1_app__app_id__integration__integ_id___put",
+            "get": {
+                "description": "Get an integration.",
+                "operationId": "v1.integration.get",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "integ_id",
-                        "required": true,
-                        "schema": {
-                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Integ Id",
-                            "type": "string"
-                        }
-                    },
-                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The integ's ID",
+                        "in": "path",
+                        "name": "integ_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The integ's ID",
+                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
-                "requestBody": {
-                    "content": {
-                        "application/json": {
-                            "schema": {
-                                "$ref": "#/components/schemas/IntegrationUpdate"
-                            }
-                        }
-                    },
-                    "required": true
-                },
                 "responses": {
                     "200": {
                         "content": {
@@ -9058,7 +9135,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -9126,7 +9203,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Update Integration",
+                "summary": "Get Integration",
                 "tags": [
                     "Integration"
                 ],
@@ -9134,118 +9211,117 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const integrationOut = await svix.integration.update('app_id', 'integ_id', {\n    name: \"Example Integration\"\n});"
+                        "source": "const integrationOut = await svix.integration.get(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const integrationOut = await svix.integration.update('app_id', 'integ_id', {\n    name: \"Example Integration\"\n});"
+                        "source": "const integrationOut = await svix.integration.get(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "integration_out = svix.integration.update('app_id', 'integ_id', IntegrationUpdate(\n    name=\"Example Integration\"\n))"
+                        "source": "integration_out = svix.integration.get(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "integration_out = await svix.integration.update('app_id', 'integ_id', IntegrationUpdate(\n    name=\"Example Integration\"\n))"
+                        "source": "integration_out = await svix.integration.get(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "integrationOut, err := svixClient.Integration.Update(\"app_id\", \"integ_id\", &svix.IntegrationUpdate{\n    Name: \"Example Integration\"\n})"
+                        "source": "integrationOut, err := svixClient.Integration.Get(ctx, \"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val integrationOut = svix.integration.update('app_id', 'integ_id', IntegrationUpdate()\n    .name(\"Example Integration\")\n)"
+                        "source": "val integrationOut = svix.integration.get(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "IntegrationOut integrationOut = svix.getIntegration().update('app_id', 'integ_id', new IntegrationUpdate()\n    .name(\"Example Integration\")\n)"
+                        "source": "IntegrationOut integrationOut = svix.getIntegration().get(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "integration_out = svix.integration.update('app_id', 'integ_id', Svix::IntegrationUpdate.new({\n    \"name\": \"Example Integration\"\n}))"
+                        "source": "integration_out = svix.integration.get(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let integration_out = svix.integration().update(\"app_id\", \"integ_id\", IntegrationUpdate {\n    name: \"Example Integration\".to_string()\n}, None).await?;"
+                        "source": "let integration_out = svix.integration().get(\"app_id\", \"integ_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var integrationOut = await svix.Integration.UpdateAsync(\"app_id\", \"integ_id\", new IntegrationUpdate{\n    name: \"Example Integration\"\n})"
+                        "source": "var integrationOut = await svix.Integration.GetAsync(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration update 'app_id' 'integ_id' '{\n    \"name\": \"Example Integration\"\n}'"
+                        "source": "svix integration get \"app_id\" \"integ_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"name\": \"Example Integration\"\n}'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            }
-        },
-        "/api/v1/app/{app_id}/integration/{integ_id}/key/": {
-            "get": {
-                "description": "Get an integration's key.",
-                "operationId": "get_integration_key_api_v1_app__app_id__integration__integ_id__key__get",
+            },
+            "put": {
+                "description": "Update an integration.",
+                "operationId": "v1.integration.update",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "integ_id",
-                        "required": true,
-                        "schema": {
-                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Integ Id",
-                            "type": "string"
-                        }
-                    },
-                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The integ's ID",
+                        "in": "path",
+                        "name": "integ_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The integ's ID",
+                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/IntegrationUpdate"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
                     "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/IntegrationKeyOut"
+                                    "$ref": "#/components/schemas/IntegrationOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -9313,7 +9389,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Integration Key",
+                "summary": "Update Integration",
                 "tags": [
                     "Integration"
                 ],
@@ -9321,106 +9397,97 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const integrationKeyOut = await svix.integration.getKey('app_id', 'integ_id');"
+                        "source": "const integrationOut = await svix.integration.update(\"app_id\", \"integ_id\", {\n    name: \"Example Integration\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const integrationKeyOut = await svix.integration.getKey('app_id', 'integ_id');"
+                        "source": "const integrationOut = await svix.integration.update(\"app_id\", \"integ_id\", {\n    name: \"Example Integration\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "integration_key_out = svix.integration.get_key('app_id', 'integ_id')"
+                        "source": "integration_out = svix.integration.update(\"app_id\", \"integ_id\", IntegrationUpdate(\n    name=\"Example Integration\"\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "integration_key_out = await svix.integration.get_key('app_id', 'integ_id')"
+                        "source": "integration_out = await svix.integration.update(\"app_id\", \"integ_id\", IntegrationUpdate(\n    name=\"Example Integration\"\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "integrationKeyOut, err := svixClient.Integration.GetKey(\"app_id\", \"integ_id\")"
+                        "source": "integrationOut, err := svixClient.Integration.Update(ctx, \"app_id\", \"integ_id\", &IntegrationUpdate{\n    Name: \"Example Integration\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val integrationKeyOut = svix.integration.getKey('app_id', 'integ_id')"
+                        "source": "val integrationOut = svix.integration.update(\"app_id\", \"integ_id\", IntegrationUpdate()\n    .name(\"Example Integration\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "IntegrationKeyOut integrationKeyOut = svix.getIntegration().getKey('app_id', 'integ_id')"
+                        "source": "IntegrationOut integrationOut = svix.getIntegration().update(\"app_id\", \"integ_id\", new IntegrationUpdate()\n    .name(\"Example Integration\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "integration_key_out = svix.integration.get_key('app_id', 'integ_id')"
+                        "source": "integration_out = svix.integration.update(\"app_id\", \"integ_id\", Svix::IntegrationUpdate.new({\n    \"name\": \"Example Integration\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let integration_key_out = svix.integration().get_key(\"app_id\", \"integ_id\").await?;"
+                        "source": "let integration_out = svix.integration().update(\"app_id\", \"integ_id\", IntegrationUpdate {\n    name: \"Example Integration\".to_string(),\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var integrationKeyOut = await svix.Integration.GetKeyAsync(\"app_id\", \"integ_id\")"
+                        "source": "var integrationOut = await svix.Integration.UpdateAsync(\"app_id\", \"integ_id\", new IntegrationUpdate{\n    name: \"Example Integration\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration get-key 'app_id' 'integ_id'"
+                        "source": "svix integration update \"app_id\" \"integ_id\" '{\n    \"name\": \"Example Integration\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/key/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"name\": \"Example Integration\"\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/integration/{integ_id}/key/rotate/": {
-            "post": {
-                "description": "Rotate the integration's key. The previous key will be immediately revoked.",
-                "operationId": "rotate_integration_key_api_v1_app__app_id__integration__integ_id__key_rotate__post",
+        "/api/v1/app/{app_id}/integration/{integ_id}/key/": {
+            "get": {
+                "description": "Get an integration's key.",
+                "operationId": "v1.integration.get-key",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "integ_id",
-                        "required": true,
-                        "schema": {
-                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Integ Id",
-                            "type": "string"
-                        }
-                    },
-                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The integ's ID",
+                        "in": "path",
+                        "name": "integ_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The integ's ID",
+                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -9432,7 +9499,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -9500,7 +9567,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Rotate Integration Key",
+                "summary": "Get Integration Key",
                 "tags": [
                     "Integration"
                 ],
@@ -9508,169 +9575,106 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const integrationKeyOut = await svix.integration.rotateKey('app_id', 'integ_id');"
+                        "source": "const integrationKeyOut = await svix.integration.getKey(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const integrationKeyOut = await svix.integration.rotateKey('app_id', 'integ_id');"
+                        "source": "const integrationKeyOut = await svix.integration.getKey(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "integration_key_out = svix.integration.rotate_key('app_id', 'integ_id')"
+                        "source": "integration_key_out = svix.integration.get_key(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "integration_key_out = await svix.integration.rotate_key('app_id', 'integ_id')"
+                        "source": "integration_key_out = await svix.integration.get_key(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "integrationKeyOut, err := svixClient.Integration.RotateKey(\"app_id\", \"integ_id\")"
+                        "source": "integrationKeyOut, err := svixClient.Integration.GetKey(ctx, \"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val integrationKeyOut = svix.integration.rotateKey('app_id', 'integ_id')"
+                        "source": "val integrationKeyOut = svix.integration.getKey(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "IntegrationKeyOut integrationKeyOut = svix.getIntegration().rotateKey('app_id', 'integ_id')"
+                        "source": "IntegrationKeyOut integrationKeyOut = svix.getIntegration().getKey(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "integration_key_out = svix.integration.rotate_key('app_id', 'integ_id')"
+                        "source": "integration_key_out = svix.integration.get_key(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let integration_key_out = svix.integration().rotate_key(\"app_id\", \"integ_id\").await?;"
+                        "source": "let integration_key_out = svix.integration().get_key(\"app_id\", \"integ_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var integrationKeyOut = await svix.Integration.RotateKeyAsync(\"app_id\", \"integ_id\")"
+                        "source": "var integrationKeyOut = await svix.Integration.GetKeyAsync(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix integration rotate-key 'app_id' 'integ_id'"
+                        "source": "svix integration get-key \"app_id\" \"integ_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/key/rotate/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/key/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/": {
-            "get": {
-                "description": "List all of the application's messages.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.\nThe `after` parameter lets you filter all items created after a certain date and is ignored if an iterator is passed.\n`before` and `after` cannot be used simultaneously.",
-                "operationId": "list_messages_api_v1_app__app_id__msg__get",
+        "/api/v1/app/{app_id}/integration/{integ_id}/key/rotate/": {
+            "post": {
+                "description": "Rotate the integration's key. The previous key will be immediately revoked.",
+                "operationId": "v1.integration.rotate-key",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "event_types",
-                        "required": false,
-                        "schema": {
-                            "items": {
-                                "example": "user.signup",
-                                "maxLength": 256,
-                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                                "type": "string"
-                            },
-                            "nullable": true,
-                            "title": "Event Types",
-                            "type": "array"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "channel",
-                        "required": false,
-                        "schema": {
-                            "example": "project_1337",
-                            "maxLength": 128,
-                            "nullable": true,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Channel",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "before",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "Before",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "in": "query",
-                        "name": "after",
-                        "required": false,
+                        "description": "The integ's ID",
+                        "in": "path",
+                        "name": "integ_id",
+                        "required": true,
                         "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "After",
+                            "description": "The integ's ID",
+                            "example": "integ_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -9678,11 +9682,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ListResponse_MessageOut_"
+                                    "$ref": "#/components/schemas/IntegrationKeyOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -9750,146 +9754,188 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "List Messages",
+                "summary": "Rotate Integration Key",
                 "tags": [
-                    "Message"
+                    "Integration"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageOut = await svix.message.list('app_id');"
+                        "source": "const integrationKeyOut = await svix.integration.rotateKey(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageOut = await svix.message.list('app_id');"
+                        "source": "const integrationKeyOut = await svix.integration.rotateKey(\"app_id\", \"integ_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_message_out = svix.message.list('app_id')"
+                        "source": "integration_key_out = svix.integration.rotate_key(\"app_id\", \"integ_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_message_out = await svix.message.list('app_id')"
+                        "source": "integration_key_out = await svix.integration.rotate_key(\"app_id\", \"integ_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseMessageOut, err := svixClient.Message.List(\"app_id\", nil)"
+                        "source": "integrationKeyOut, err := svixClient.Integration.RotateKey(ctx, \"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseMessageOut = svix.message.list('app_id', FetchOptions())"
+                        "source": "val integrationKeyOut = svix.integration.rotateKey(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseMessageOut listResponseMessageOut = svix.getMessage().list('app_id', new FetchOptions())"
+                        "source": "IntegrationKeyOut integrationKeyOut = svix.getIntegration().rotateKey(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_message_out = svix.message.list('app_id')"
+                        "source": "integration_key_out = svix.integration.rotate_key(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let list_response_message_out = svix.message().list(\"app_id\", None).await?;"
+                        "source": "let integration_key_out = svix.integration().rotate_key(\"app_id\", \"integ_id\", None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var listResponseMessageOut = await svix.Message.ListAsync(\"app_id\")"
+                        "source": "var integrationKeyOut = await svix.Integration.RotateKeyAsync(\"app_id\", \"integ_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message list 'app_id'"
+                        "source": "svix integration rotate-key \"app_id\" \"integ_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/integration/{integ_id}/key/rotate/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            },
-            "post": {
-                "description": "Creates a new message and dispatches it to all of the application's endpoints.\n\nThe `eventId` is an optional custom unique ID. It's verified to be unique only up to a day, after that no verification will be made.\nIf a message with the same `eventId` already exists for any application in your environment, a 409 conflict error will be returned.\n\nThe `eventType` indicates the type and schema of the event. All messages of a certain `eventType` are expected to have the same schema. Endpoints can choose to only listen to specific event types.\nMessages can also have `channels`, which similar to event types let endpoints filter by them. Unlike event types, messages can have multiple channels, and channels don't imply a specific message content or schema.\n\nThe `payload` property is the webhook's body (the actual webhook message). Svix supports payload sizes of up to ~350kb, though it's generally a good idea to keep webhook payloads small, probably no larger than 40kb.",
-                "operationId": "create_message_api_v1_app__app_id__msg__post",
+            }
+        },
+        "/api/v1/app/{app_id}/msg/": {
+            "get": {
+                "description": "List all of the application's messages.\n\nThe `before` and `after` parameters let you filter all items created before or after a certain date. These can be used alongside an iterator to paginate over results\nwithin a certain window.",
+                "operationId": "v1.message.list",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "in": "query",
-                        "name": "with_content",
-                        "required": false,
+                        "name": "limit",
                         "schema": {
-                            "default": true,
-                            "title": "With Content",
-                            "type": "boolean"
-                        }
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The msg's ID",
+                        "in": "query",
+                        "name": "iterator",
                         "schema": {
-                            "description": "The request's idempotency key",
+                            "description": "The msg's ID",
+                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
-                    }
-                ],
-                "requestBody": {
-                    "content": {
-                        "application/json": {
-                            "schema": {
-                                "$ref": "#/components/schemas/MessageIn"
-                            }
-                        }
-                    },
-                    "required": true
-                },
-                "responses": {
-                    "202": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/MessageOut"
-                                }
-                            }
                         },
-                        "description": "Successful Response"
+                        "style": "form"
                     },
-                    "401": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/HttpErrorOut"
-                                }
-                            }
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
                         },
-                        "description": "Unauthorized"
+                        "style": "form"
                     },
-                    "403": {
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "description": "The event type's name",
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
                         "content": {
                             "application/json": {
                                 "schema": {
@@ -9897,9 +9943,9 @@
                                 }
                             }
                         },
-                        "description": "Forbidden"
+                        "description": "Unauthorized"
                     },
-                    "404": {
+                    "403": {
                         "content": {
                             "application/json": {
                                 "schema": {
@@ -9907,9 +9953,9 @@
                                 }
                             }
                         },
-                        "description": "Not Found"
+                        "description": "Forbidden"
                     },
-                    "409": {
+                    "404": {
                         "content": {
                             "application/json": {
                                 "schema": {
@@ -9917,9 +9963,9 @@
                                 }
                             }
                         },
-                        "description": "Conflict"
+                        "description": "Not Found"
                     },
-                    "413": {
+                    "409": {
                         "content": {
                             "application/json": {
                                 "schema": {
@@ -9927,7 +9973,7 @@
                                 }
                             }
                         },
-                        "description": "Request Entity Too Large"
+                        "description": "Conflict"
                     },
                     "422": {
                         "content": {
@@ -9955,7 +10001,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Create Message",
+                "summary": "List Messages",
                 "tags": [
                     "Message"
                 ],
@@ -9963,114 +10009,115 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const messageOut = await svix.message.create('app_id', {\n    eventType: \"user.signup\",\n    eventId: \"evt_pNZKtWg8Azow\",\n    channels: [\n        \"project_123\",\n        \"group_2\"\n    ],\n    payload: {\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    payloadRetentionPeriod: 90,\n    application: None\n});"
+                        "source": "const listResponseMessageOut = await svix.message.list(\"app_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const messageOut = await svix.message.create('app_id', {\n    eventType: \"user.signup\",\n    eventId: \"evt_pNZKtWg8Azow\",\n    channels: [\n        \"project_123\",\n        \"group_2\"\n    ],\n    payload: {\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    payloadRetentionPeriod: 90,\n    application: None\n});"
+                        "source": "const listResponseMessageOut = await svix.message.list(\"app_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "message_out = svix.message.create('app_id', MessageIn(\n    event_type=\"user.signup\",\n    event_id=\"evt_pNZKtWg8Azow\",\n    channels=['project_123', 'group_2'],\n    payload={'username': 'test_user', 'email': 'test@example.com'},\n    payload_retention_period=90,\n    application=None\n))"
+                        "source": "list_response_message_out = svix.message.list(\"app_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "message_out = await svix.message.create('app_id', MessageIn(\n    event_type=\"user.signup\",\n    event_id=\"evt_pNZKtWg8Azow\",\n    channels=['project_123', 'group_2'],\n    payload={'username': 'test_user', 'email': 'test@example.com'},\n    payload_retention_period=90,\n    application=None\n))"
+                        "source": "list_response_message_out = await svix.message.list(\"app_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "messageOut, err := svixClient.Message.Create(\"app_id\", &svix.MessageIn{\n    EventType: \"user.signup\",\n    EventId: \"evt_pNZKtWg8Azow\",\n    Channels: [...]string{\"project_123\", \"group_2\"},\n    Payload: map[string]interface{}{\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    PayloadRetentionPeriod: 90,\n    Application: None\n})"
+                        "source": "listResponseMessageOut, err := svixClient.Message.List(ctx, \"app_id\", nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val messageOut = svix.message.create('app_id', MessageIn()\n    .eventType(\"user.signup\"),\n    .eventId(\"evt_pNZKtWg8Azow\"),\n    .channels(arrayOf(\"project_123\", \"group_2\")),\n    .payload(\"\"\"{\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    }\"\"\"),\n    .payloadRetentionPeriod(90),\n    .application(None)\n)"
+                        "source": "val listResponseMessageOut = svix.message.list(\"app_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "MessageOut messageOut = svix.getMessage().create('app_id', new MessageIn()\n    .eventType(\"user.signup\"),\n    .eventId(\"evt_pNZKtWg8Azow\"),\n    .channels(new String[]{\"project_123\", \"group_2\"}),\n    .payload(\"{\" +\n        \"\\\"username\\\": \\\"test_user\\\",\" +\n        \"\\\"email\\\": \\\"test@example.com\\\"\" +\n    \"}\"),\n    .payloadRetentionPeriod(90),\n    .application(None)\n)"
+                        "source": "ListResponseMessageOut listResponseMessageOut = svix.getMessage().list(\"app_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "message_out = svix.message.create('app_id', Svix::MessageIn.new({\n    \"event_type\": \"user.signup\",\n    \"event_id\": \"evt_pNZKtWg8Azow\",\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"payload\": {\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    \"payload_retention_period\": 90,\n    \"application\": null\n}))"
+                        "source": "list_response_message_out = svix.message.list(\"app_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let message_out = svix.message().create(\"app_id\", MessageIn {\n    event_type: \"user.signup\".to_string(),\n    event_id: Some(\"evt_pNZKtWg8Azow\".to_string()),\n    channels: Some(vec![\"project_123\".to_string(), \"group_2\".to_string()]),\n    payload: json!({\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    }),\n    payload_retention_period: Some(90),\n    application: None\n}, None).await?;"
+                        "source": "let list_response_message_out = svix.message().list(\"app_id\", None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var messageOut = await svix.Message.CreateAsync(\"app_id\", new MessageIn{\n    eventType: \"user.signup\",\n    eventId: \"evt_pNZKtWg8Azow\",\n    channels: new string[] {\"project_123\", \"group_2\"},\n    payload: new {\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    payloadRetentionPeriod: 90,\n    application: None\n})"
+                        "source": "var listResponseMessageOut = await svix.Message.ListAsync(\"app_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message create 'app_id' '{\n    \"eventType\": \"user.signup\",\n    \"eventId\": \"evt_pNZKtWg8Azow\",\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"payload\": {\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    \"payloadRetentionPeriod\": 90,\n    \"application\": null\n}'"
+                        "source": "svix message list \"app_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"eventType\": \"user.signup\",\n    \"eventId\": \"evt_pNZKtWg8Azow\",\n    \"channels\": [\n        \"project_123\",\n        \"group_2\"\n    ],\n    \"payload\": {\n        \"username\": \"test_user\",\n        \"email\": \"test@example.com\"\n    },\n    \"payloadRetentionPeriod\": 90,\n    \"application\": null\n}'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            }
-        },
-        "/api/v1/app/{app_id}/msg/{msg_id}/": {
-            "get": {
-                "description": "Get a message by its ID or eventID.",
-                "operationId": "get_message_api_v1_app__app_id__msg__msg_id___get",
+            },
+            "post": {
+                "description": "Creates a new message and dispatches it to all of the application's endpoints.\n\nThe `eventId` is an optional custom unique ID. It's verified to be unique only up to a day, after that no verification will be made.\nIf a message with the same `eventId` already exists for any application in your environment, a 409 conflict error will be returned.\n\nThe `eventType` indicates the type and schema of the event. All messages of a certain `eventType` are expected to have the same schema. Endpoints can choose to only listen to specific event types.\nMessages can also have `channels`, which similar to event types let endpoints filter by them. Unlike event types, messages can have multiple channels, and channels don't imply a specific message content or schema.\n\nThe `payload` property is the webhook's body (the actual webhook message). Svix supports payload sizes of up to ~350kb, though it's generally a good idea to keep webhook payloads small, probably no larger than 40kb.",
+                "operationId": "v1.message.create",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "msg_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
+                        "in": "query",
+                        "name": "with_content",
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
+                            "default": true,
+                            "type": "boolean"
+                        },
+                        "style": "form"
                     },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/MessageIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
-                    "200": {
+                    "202": {
                         "content": {
                             "application/json": {
                                 "schema": {
@@ -10078,7 +10125,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -10146,7 +10193,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Message",
+                "summary": "Create Message",
                 "tags": [
                     "Message"
                 ],
@@ -10154,208 +10201,109 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const messageOut = await svix.message.get('app_id', 'msg_id');"
+                        "source": "const messageOut = await svix.message.create(\"app_id\", {\n    eventId: \"unique-msg-identifier\",\n    eventType: \"user.signup\",\n    payload: {\"email\":\"test@example.com\",\"username\":\"test_user\"},\n    channels: [\"project_123\", \"group_2\"],\n    payloadRetentionPeriod: 90,\n    application: null\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const messageOut = await svix.message.get('app_id', 'msg_id');"
+                        "source": "const messageOut = await svix.message.create(\"app_id\", {\n    eventId: \"unique-msg-identifier\",\n    eventType: \"user.signup\",\n    payload: {\"email\":\"test@example.com\",\"username\":\"test_user\"},\n    channels: [\"project_123\", \"group_2\"],\n    payloadRetentionPeriod: 90,\n    application: null\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "message_out = svix.message.get('app_id', 'msg_id')"
+                        "source": "message_out = svix.message.create(\"app_id\", MessageIn(\n    event_id=\"unique-msg-identifier\",\n    event_type=\"user.signup\",\n    payload={\"email\": \"test@example.com\", \"username\": \"test_user\"},\n    channels=[\"project_123\", \"group_2\"],\n    payload_retention_period=90,\n    application=None\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "message_out = await svix.message.get('app_id', 'msg_id')"
+                        "source": "message_out = await svix.message.create(\"app_id\", MessageIn(\n    event_id=\"unique-msg-identifier\",\n    event_type=\"user.signup\",\n    payload={\"email\": \"test@example.com\", \"username\": \"test_user\"},\n    channels=[\"project_123\", \"group_2\"],\n    payload_retention_period=90,\n    application=None\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "messageOut, err := svixClient.Message.Get(\"app_id\", \"msg_id\")"
+                        "source": "messageOut, err := svixClient.Message.Create(ctx, \"app_id\", &MessageIn{\n    EventId: \"unique-msg-identifier\",\n    EventType: \"user.signup\",\n    Payload: map[string]interface{}{\"email\": \"test@example.com\", \"username\": \"test_user\"},\n    Channels: []string{\"project_123\", \"group_2\"},\n    PayloadRetentionPeriod: 90,\n    Application: nil,\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val messageOut = svix.message.get('app_id', 'msg_id')"
+                        "source": "val messageOut = svix.message.create(\"app_id\", MessageIn()\n    .eventId(\"unique-msg-identifier\")\n    .eventType(\"user.signup\")\n    .payload(\"\"\"{\"email\":\"test@example.com\",\"username\":\"test_user\"}\"\"\")\n    .channels(arrayOf(\"project_123\", \"group_2\"))\n    .payloadRetentionPeriod(90)\n    .application(null)\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "MessageOut messageOut = svix.getMessage().get('app_id', 'msg_id')"
+                        "source": "MessageOut messageOut = svix.getMessage().create(\"app_id\", new MessageIn()\n    .eventId(\"unique-msg-identifier\")\n    .eventType(\"user.signup\")\n    .payload(\"{\\\"email\\\":\\\"test@example.com\\\",\\\"username\\\":\\\"test_user\\\"}\")\n    .channels(new String[]{\"project_123\", \"group_2\"})\n    .payloadRetentionPeriod(90)\n    .application(null)\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "message_out = svix.message.get('app_id', 'msg_id')"
+                        "source": "message_out = svix.message.create(\"app_id\", Svix::MessageIn.new({\n    \"event_id\": \"unique-msg-identifier\",\n    \"event_type\": \"user.signup\",\n    \"payload\": {\"email\":\"test@example.com\",\"username\":\"test_user\"},\n    \"channels\": [\"project_123\", \"group_2\"],\n    \"payload_retention_period\": 90,\n    \"application\": nil\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let message_out = svix.message().get(\"app_id\", \"msg_id\").await?;"
+                        "source": "let message_out = svix.message().create(\"app_id\", MessageIn {\n    event_id: Some(\"unique-msg-identifier\".to_string()),\n    event_type: \"user.signup\".to_string(),\n    payload: json!({\"email\":\"test@example.com\",\"username\":\"test_user\"}),\n    channels: Some(vec![\"project_123\".to_string(), \"group_2\".to_string()]),\n    payload_retention_period: Some(90),\n    application: None,\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var messageOut = await svix.Message.GetAsync(\"app_id\", \"msg_id\")"
+                        "source": "var messageOut = await svix.Message.CreateAsync(\"app_id\", new MessageIn{\n    eventId: \"unique-msg-identifier\",\n    eventType: \"user.signup\",\n    payload: new {\"email\":\"test@example.com\",\"username\":\"test_user\"},\n    channels: new string[] {\"project_123\", \"group_2\"},\n    payloadRetentionPeriod: 90,\n    application: null\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message get 'app_id' 'msg_id'"
+                        "source": "svix message create \"app_id\" '{\n    \"eventId\": \"unique-msg-identifier\",\n    \"eventType\": \"user.signup\",\n    \"payload\": {\"email\":\"test@example.com\",\"username\":\"test_user\"},\n    \"channels\": [\"project_123\", \"group_2\"],\n    \"payloadRetentionPeriod\": 90,\n    \"application\": null\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"eventId\": \"unique-msg-identifier\",\n        \"eventType\": \"user.signup\",\n        \"payload\": {\"email\":\"test@example.com\",\"username\":\"test_user\"},\n        \"channels\": [\"project_123\", \"group_2\"],\n        \"payloadRetentionPeriod\": 90,\n        \"application\": null\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/": {
+        "/api/v1/app/{app_id}/msg/{msg_id}/": {
             "get": {
-                "deprecated": true,
-                "description": "Deprecated: Please use \"List Attempts by Endpoint\" and \"List Attempts by Msg\" instead.\n\n`msg_id`: Use a message id or a message `eventId`",
-                "operationId": "list_attempts_api_v1_app__app_id__msg__msg_id__attempt__get",
+                "description": "Get a message by its ID or eventID.",
+                "operationId": "v1.message.get",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The msg's ID or UID",
                         "in": "path",
                         "name": "msg_id",
                         "required": true,
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "endpoint_id",
-                        "required": false,
-                        "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
                             "maxLength": 256,
                             "minLength": 1,
-                            "nullable": true,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "event_types",
-                        "required": false,
-                        "schema": {
-                            "items": {
-                                "example": "user.signup",
-                                "maxLength": 256,
-                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                                "type": "string"
-                            },
-                            "nullable": true,
-                            "title": "Event Types",
-                            "type": "array"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "channel",
-                        "required": false,
-                        "schema": {
-                            "example": "project_1337",
-                            "maxLength": 128,
-                            "nullable": true,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Channel",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "status",
-                        "required": false,
-                        "schema": {
-                            "$ref": "#/components/schemas/MessageStatus",
-                            "nullable": true
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "before",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "Before",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
                         "in": "query",
-                        "name": "after",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "After",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "name": "with_content",
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
+                            "default": true,
+                            "type": "boolean"
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
@@ -10363,11 +10311,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptOut_"
+                                    "$ref": "#/components/schemas/MessageOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -10435,128 +10383,214 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "List Attempts",
+                "summary": "Get Message",
                 "tags": [
-                    "Message Attempt"
+                    "Message"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.list('app_id', 'msg_id');"
+                        "source": "const messageOut = await svix.message.get(\"app_id\", \"msg_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.list('app_id', 'msg_id');"
+                        "source": "const messageOut = await svix.message.get(\"app_id\", \"msg_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_message_attempt_out = svix.message_attempt.list('app_id', 'msg_id')"
+                        "source": "message_out = svix.message.get(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_message_attempt_out = await svix.message_attempt.list('app_id', 'msg_id')"
+                        "source": "message_out = await svix.message.get(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseMessageAttemptOut, err := svixClient.MessageAttempt.List(\"app_id\", \"msg_id\", nil)"
+                        "source": "messageOut, err := svixClient.Message.Get(ctx, \"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseMessageAttemptOut = svix.messageAttempt.list('app_id', 'msg_id', FetchOptionsMessageAttempt())"
+                        "source": "val messageOut = svix.message.get(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseMessageAttemptOut listResponseMessageAttemptOut = svix.getMessageAttempt().list('app_id', 'msg_id', new FetchOptionsMessageAttempt())"
+                        "source": "MessageOut messageOut = svix.getMessage().get(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_message_attempt_out = svix.message_attempt.list('app_id', 'msg_id')"
+                        "source": "message_out = svix.message.get(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let list_response_message_attempt_out = svix.message_attempt().list(\"app_id\", \"msg_id\", None).await?;"
+                        "source": "let message_out = svix.message().get(\"app_id\", \"msg_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var listResponseMessageAttemptOut = await svix.MessageAttempt.ListAsync(\"app_id\", \"msg_id\")"
+                        "source": "var messageOut = await svix.Message.GetAsync(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message-attempt list 'app_id' 'msg_id'"
+                        "source": "svix message get \"app_id\" \"msg_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/": {
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/": {
             "get": {
-                "description": "`msg_id`: Use a message id or a message `eventId`",
-                "operationId": "get_attempt_api_v1_app__app_id__msg__msg_id__attempt__attempt_id___get",
+                "deprecated": true,
+                "description": "Deprecated: Please use \"List Attempts by Endpoint\" and \"List Attempts by Msg\" instead.\n\n`msg_id`: Use a message id or a message `eventId`",
+                "operationId": "v1.message-attempt.list-by-msg-deprecated",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "attempt_id",
-                        "required": true,
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The attempt's ID",
+                        "in": "query",
+                        "name": "iterator",
                         "schema": {
+                            "description": "The attempt's ID",
                             "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Attempt Id",
+                            "nullable": true,
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
-                        "in": "path",
-                        "name": "msg_id",
-                        "required": true,
+                        "description": "The ep's ID or UID",
+                        "in": "query",
+                        "name": "endpoint_id",
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
                             "maxLength": 256,
                             "minLength": 1,
+                            "nullable": true,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status_code_class",
+                        "schema": {
+                            "$ref": "#/components/schemas/StatusCodeClass",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "description": "The event type's name",
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The msg's ID or UID",
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -10564,11 +10598,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/MessageAttemptOut"
+                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptOut_"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -10636,7 +10670,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Attempt",
+                "summary": "List Attempts",
                 "tags": [
                     "Message Attempt"
                 ],
@@ -10644,125 +10678,124 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const messageAttemptOut = await svix.messageAttempt.get('app_id', 'msg_id', 'attempt_id');"
+                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByMsgDeprecated(\"app_id\", \"msg_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const messageAttemptOut = await svix.messageAttempt.get('app_id', 'msg_id', 'attempt_id');"
+                        "source": "const listResponseMessageAttemptOut = await svix.messageAttempt.listByMsgDeprecated(\"app_id\", \"msg_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "message_attempt_out = svix.message_attempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_msg_deprecated(\"app_id\", \"msg_id\", None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "message_attempt_out = await svix.message_attempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "list_response_message_attempt_out = await svix.message_attempt.list_by_msg_deprecated(\"app_id\", \"msg_id\", None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "messageAttemptOut, err := svixClient.MessageAttempt.Get(\"app_id\", \"msg_id\", \"attempt_id\")"
+                        "source": "listResponseMessageAttemptOut, err := svixClient.MessageAttempt.ListByMsgDeprecated(ctx, \"app_id\", \"msg_id\", nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val messageAttemptOut = svix.messageAttempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "val listResponseMessageAttemptOut = svix.messageAttempt.listByMsgDeprecated(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "MessageAttemptOut messageAttemptOut = svix.getMessageAttempt().get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "ListResponseMessageAttemptOut listResponseMessageAttemptOut = svix.getMessageAttempt().listByMsgDeprecated(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "message_attempt_out = svix.message_attempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "list_response_message_attempt_out = svix.message_attempt.list_by_msg_deprecated(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let message_attempt_out = svix.message_attempt().get(\"app_id\", \"msg_id\", \"attempt_id\").await?;"
+                        "source": "let list_response_message_attempt_out = svix.message_attempt().list_by_msg_deprecated(\"app_id\", \"msg_id\", None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var messageAttemptOut = await svix.MessageAttempt.GetAsync(\"app_id\", \"msg_id\", \"attempt_id\")"
+                        "source": "var listResponseMessageAttemptOut = await svix.MessageAttempt.ListByMsgDeprecatedAsync(\"app_id\", \"msg_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message-attempt get 'app_id' 'msg_id' 'attempt_id'"
+                        "source": "svix message-attempt list-by-msg-deprecated \"app_id\" \"msg_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content/": {
-            "delete": {
-                "description": "Deletes the given attempt's repsonse body. Useful when an endpoint accidentally returned sensitive content.",
-                "operationId": "expunge_attempt_content_api_v1_app__app_id__msg__msg_id__attempt__attempt_id__content__delete",
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/": {
+            "get": {
+                "description": "`msg_id`: Use a message id or a message `eventId`",
+                "operationId": "v1.message-attempt.get",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "attempt_id",
-                        "required": true,
-                        "schema": {
-                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Attempt Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "path",
-                        "name": "msg_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The msg's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "msg_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The attempt's ID",
+                        "in": "path",
+                        "name": "attempt_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The attempt's ID",
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/MessageAttemptOut"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -10830,7 +10863,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Delete attempt response body",
+                "summary": "Get Attempt",
                 "tags": [
                     "Message Attempt"
                 ],
@@ -10838,132 +10871,117 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.messageAttempt.expungeContent('app_id', 'msg_id', 'attempt_id');"
+                        "source": "const messageAttemptOut = await svix.messageAttempt.get(\"app_id\", \"msg_id\", \"attempt_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.messageAttempt.expungeContent('app_id', 'msg_id', 'attempt_id');"
+                        "source": "const messageAttemptOut = await svix.messageAttempt.get(\"app_id\", \"msg_id\", \"attempt_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.message_attempt.expunge_content('app_id', 'msg_id', 'attempt_id')"
+                        "source": "message_attempt_out = svix.message_attempt.get(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.message_attempt.expunge_content('app_id', 'msg_id', 'attempt_id')"
+                        "source": "message_attempt_out = await svix.message_attempt.get(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.MessageAttempt.ExpungeContent(\"app_id\", \"msg_id\", \"attempt_id\")"
+                        "source": "messageAttemptOut, err := svixClient.MessageAttempt.Get(ctx, \"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.messageAttempt.expungeContent('app_id', 'msg_id', 'attempt_id')"
+                        "source": "val messageAttemptOut = svix.messageAttempt.get(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getMessageAttempt().expungeContent('app_id', 'msg_id', 'attempt_id')"
+                        "source": "MessageAttemptOut messageAttemptOut = svix.getMessageAttempt().get(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.message_attempt.expunge_content('app_id', 'msg_id', 'attempt_id')"
+                        "source": "message_attempt_out = svix.message_attempt.get(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.message_attempt().expunge_content(\"app_id\", \"msg_id\", \"attempt_id\").await?;"
+                        "source": "let message_attempt_out = svix.message_attempt().get(\"app_id\", \"msg_id\", \"attempt_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.MessageAttempt.ExpungeContentAsync(\"app_id\", \"msg_id\", \"attempt_id\")"
+                        "source": "var messageAttemptOut = await svix.MessageAttempt.GetAsync(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message-attempt expunge-content 'app_id' 'msg_id' 'attempt_id'"
+                        "source": "svix message-attempt get \"app_id\" \"msg_id\" \"attempt_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/headers/": {
-            "get": {
-                "description": "Calculate and return headers used on a given message attempt",
-                "operationId": "get_attempt_headers_api_v1_app__app_id__msg__msg_id__attempt__attempt_id__headers__get",
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content/": {
+            "delete": {
+                "description": "Deletes the given attempt's response body. Useful when an endpoint accidentally returned sensitive content.",
+                "operationId": "v1.message-attempt.expunge-content",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The msg's ID or UID",
                         "in": "path",
                         "name": "msg_id",
                         "required": true,
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The attempt's ID",
                         "in": "path",
                         "name": "attempt_id",
                         "required": true,
                         "schema": {
+                            "description": "The attempt's ID",
                             "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "title": "Attempt Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/MessageAttemptHeadersOut"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
+                    "204": {
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -11031,7 +11049,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Attempt Headers",
+                "summary": "Delete attempt response body",
                 "tags": [
                     "Message Attempt"
                 ],
@@ -11039,115 +11057,124 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const messageAttemptHeadersOut = await svix.messageAttempt.get('app_id', 'msg_id', 'attempt_id');"
+                        "source": "await svix.messageAttempt.expungeContent(\"app_id\", \"msg_id\", \"attempt_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const messageAttemptHeadersOut = await svix.messageAttempt.get('app_id', 'msg_id', 'attempt_id');"
+                        "source": "await svix.messageAttempt.expungeContent(\"app_id\", \"msg_id\", \"attempt_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "message_attempt_headers_out = svix.message_attempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "svix.message_attempt.expunge_content(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "message_attempt_headers_out = await svix.message_attempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "await svix.message_attempt.expunge_content(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "messageAttemptHeadersOut, err := svixClient.MessageAttempt.Get(\"app_id\", \"msg_id\", \"attempt_id\")"
+                        "source": "err := svixClient.MessageAttempt.ExpungeContent(ctx, \"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val messageAttemptHeadersOut = svix.messageAttempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "svix.messageAttempt.expungeContent(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "MessageAttemptHeadersOut messageAttemptHeadersOut = svix.getMessageAttempt().get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "svix.getMessageAttempt().expungeContent(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "message_attempt_headers_out = svix.message_attempt.get('app_id', 'msg_id', 'attempt_id')"
+                        "source": "svix.message_attempt.expunge_content(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let message_attempt_headers_out = svix.message_attempt().get(\"app_id\", \"msg_id\", \"attempt_id\").await?;"
+                        "source": "svix.message_attempt().expunge_content(\"app_id\", \"msg_id\", \"attempt_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var messageAttemptHeadersOut = await svix.MessageAttempt.GetAsync(\"app_id\", \"msg_id\", \"attempt_id\")"
+                        "source": "await svix.MessageAttempt.ExpungeContentAsync(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message-attempt get 'app_id' 'msg_id' 'attempt_id'"
+                        "source": "svix message-attempt expunge-content \"app_id\" \"msg_id\" \"attempt_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/content/": {
-            "delete": {
-                "description": "Delete the given message's payload. Useful in cases when a message was accidentally sent with sensitive content.\n\nThe message can't be replayed or resent once its payload has been deleted or expired.",
-                "operationId": "expunge_message_payload_api_v1_app__app_id__msg__msg_id__content__delete",
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/headers/": {
+            "get": {
+                "description": "Calculate and return headers used on a given message attempt",
+                "operationId": "v1.message-attempt.get-headers",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "msg_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The msg's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "msg_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The attempt's ID",
+                        "in": "path",
+                        "name": "attempt_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The attempt's ID",
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/MessageAttemptHeadersOut"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -11215,162 +11242,123 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Delete message payload",
+                "summary": "Get Attempt Headers",
                 "tags": [
-                    "Message"
+                    "Message Attempt"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.message.expungeContent('app_id', 'msg_id');"
+                        "source": "const messageAttemptHeadersOut = await svix.messageAttempt.getHeaders(\"app_id\", \"msg_id\", \"attempt_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.message.expungeContent('app_id', 'msg_id');"
+                        "source": "const messageAttemptHeadersOut = await svix.messageAttempt.getHeaders(\"app_id\", \"msg_id\", \"attempt_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.message.expunge_content('app_id', 'msg_id')"
+                        "source": "message_attempt_headers_out = svix.message_attempt.get_headers(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.message.expunge_content('app_id', 'msg_id')"
+                        "source": "message_attempt_headers_out = await svix.message_attempt.get_headers(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Message.ExpungeContent(\"app_id\", \"msg_id\")"
+                        "source": "messageAttemptHeadersOut, err := svixClient.MessageAttempt.GetHeaders(ctx, \"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.message.expungeContent('app_id', 'msg_id')"
+                        "source": "val messageAttemptHeadersOut = svix.messageAttempt.getHeaders(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getMessage().expungeContent('app_id', 'msg_id')"
+                        "source": "MessageAttemptHeadersOut messageAttemptHeadersOut = svix.getMessageAttempt().getHeaders(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.message.expunge_content('app_id', 'msg_id')"
+                        "source": "message_attempt_headers_out = svix.message_attempt.get_headers(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.message().expunge_content(\"app_id\", \"msg_id\").await?;"
+                        "source": "let message_attempt_headers_out = svix.message_attempt().get_headers(\"app_id\", \"msg_id\", \"attempt_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Message.ExpungeContentAsync(\"app_id\", \"msg_id\")"
+                        "source": "var messageAttemptHeadersOut = await svix.MessageAttempt.GetHeadersAsync(\"app_id\", \"msg_id\", \"attempt_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix message expunge-content 'app_id' 'msg_id'"
+                        "source": "svix message-attempt get-headers \"app_id\" \"msg_id\" \"attempt_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/content/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/headers/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/": {
-            "get": {
-                "description": "`msg_id`: Use a message id or a message `eventId`",
-                "operationId": "list_attempted_destinations_api_v1_app__app_id__msg__msg_id__endpoint__get",
+        "/api/v1/app/{app_id}/msg/{msg_id}/content/": {
+            "delete": {
+                "description": "Delete the given message's payload. Useful in cases when a message was accidentally sent with sensitive content.\n\nThe message can't be replayed or resent once its payload has been deleted or expired.",
+                "operationId": "v1.message.expunge-content",
                 "parameters": [
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "msg_id",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The msg's ID or UID",
                         "in": "path",
-                        "name": "app_id",
+                        "name": "msg_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "msgep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
-                    "200": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ListResponse_MessageEndpointOut_"
+                                    "$ref": "#/components/schemas/HttpErrorOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
-                    },
-                    "401": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/HttpErrorOut"
-                                }
-                            }
-                        },
-                        "description": "Unauthorized"
+                        "description": "Unauthorized"
                     },
                     "403": {
                         "content": {
@@ -11428,172 +11416,1494 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "List Attempted Destinations",
+                "summary": "Delete message payload",
                 "tags": [
-                    "Message Attempt"
+                    "Message"
                 ],
                 "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.message.expungeContent(\"app_id\", \"msg_id\");"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.message.expungeContent(\"app_id\", \"msg_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "svix.message.expunge_content(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "await svix.message.expunge_content(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "err := svixClient.Message.ExpungeContent(ctx, \"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "svix.message.expungeContent(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "svix.getMessage().expungeContent(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "svix.message.expunge_content(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "svix.message().expunge_content(\"app_id\", \"msg_id\").await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "await svix.Message.ExpungeContentAsync(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix message expunge-content \"app_id\" \"msg_id\""
+                    },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/endpoint/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/content/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/": {
+        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/": {
             "get": {
-                "deprecated": true,
-                "description": "DEPRECATED: please use list_attempts with endpoint_id as a query parameter instead.\n\nList the message attempts for a particular endpoint.\n\nReturning the endpoint.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.",
-                "operationId": "list_attempts_for_endpoint_api_v1_app__app_id__msg__msg_id__endpoint__endpoint_id__attempt__get",
+                "description": "`msg_id`: Use a message id or a message `eventId`",
+                "operationId": "v1.message-attempt.list-attempted-destinations",
                 "parameters": [
                     {
-                        "in": "path",
-                        "name": "msg_id",
-                        "required": true,
+                        "in": "query",
+                        "name": "limit",
                         "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "nullable": true,
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The app's ID or UID",
                         "in": "path",
                         "name": "app_id",
                         "required": true,
                         "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
+                        "description": "The msg's ID or UID",
                         "in": "path",
-                        "name": "endpoint_id",
+                        "name": "msg_id",
                         "required": true,
                         "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
                             "maxLength": 256,
                             "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageEndpointOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "List Attempted Destinations",
+                "tags": [
+                    "Message Attempt"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseMessageEndpointOut = await svix.messageAttempt.listAttemptedDestinations(\"app_id\", \"msg_id\");"
                     },
                     {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "nullable": true,
-                            "title": "Iterator",
-                            "type": "string"
-                        }
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseMessageEndpointOut = await svix.messageAttempt.listAttemptedDestinations(\"app_id\", \"msg_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "list_response_message_endpoint_out = svix.message_attempt.list_attempted_destinations(\"app_id\", \"msg_id\", None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "list_response_message_endpoint_out = await svix.message_attempt.list_attempted_destinations(\"app_id\", \"msg_id\", None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "listResponseMessageEndpointOut, err := svixClient.MessageAttempt.ListAttemptedDestinations(ctx, \"app_id\", \"msg_id\", nil)"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val listResponseMessageEndpointOut = svix.messageAttempt.listAttemptedDestinations(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "ListResponseMessageEndpointOut listResponseMessageEndpointOut = svix.getMessageAttempt().listAttemptedDestinations(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "list_response_message_endpoint_out = svix.message_attempt.list_attempted_destinations(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let list_response_message_endpoint_out = svix.message_attempt().list_attempted_destinations(\"app_id\", \"msg_id\", None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var listResponseMessageEndpointOut = await svix.MessageAttempt.ListAttemptedDestinationsAsync(\"app_id\", \"msg_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix message-attempt list-attempted-destinations \"app_id\" \"msg_id\""
                     },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/endpoint/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/": {
+            "get": {
+                "deprecated": true,
+                "description": "DEPRECATED: please use list_attempts with endpoint_id as a query parameter instead.\n\nList the message attempts for a particular endpoint.\n\nReturning the endpoint.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.",
+                "operationId": "v1.message-attempt.list-by-endpoint-deprecated",
+                "parameters": [
                     {
                         "in": "query",
                         "name": "limit",
-                        "required": false,
                         "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
                             "type": "integer"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
+                        "description": "The attempt's ID",
                         "in": "query",
-                        "name": "event_types",
-                        "required": false,
+                        "name": "iterator",
                         "schema": {
-                            "items": {
-                                "example": "user.signup",
-                                "maxLength": 256,
-                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                                "type": "string"
-                            },
+                            "description": "The attempt's ID",
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
                             "nullable": true,
-                            "title": "Event Types",
-                            "type": "array"
-                        }
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
                         "in": "query",
                         "name": "channel",
-                        "required": false,
                         "schema": {
                             "example": "project_1337",
                             "maxLength": 128,
                             "nullable": true,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Channel",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "description": "The event type's name",
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The msg's ID or UID",
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptEndpointOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "List Attempts For Endpoint",
+                "tags": [
+                    "Message Attempt"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseMessageAttemptEndpointOut = await svix.messageAttempt.listByEndpointDeprecated(\"app_id\", \"msg_id\", \"endpoint_id\");"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const listResponseMessageAttemptEndpointOut = await svix.messageAttempt.listByEndpointDeprecated(\"app_id\", \"msg_id\", \"endpoint_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "list_response_message_attempt_endpoint_out = svix.message_attempt.list_by_endpoint_deprecated(\"app_id\", \"msg_id\", \"endpoint_id\", None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "list_response_message_attempt_endpoint_out = await svix.message_attempt.list_by_endpoint_deprecated(\"app_id\", \"msg_id\", \"endpoint_id\", None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "listResponseMessageAttemptEndpointOut, err := svixClient.MessageAttempt.ListByEndpointDeprecated(ctx, \"app_id\", \"msg_id\", \"endpoint_id\", nil)"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val listResponseMessageAttemptEndpointOut = svix.messageAttempt.listByEndpointDeprecated(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "ListResponseMessageAttemptEndpointOut listResponseMessageAttemptEndpointOut = svix.getMessageAttempt().listByEndpointDeprecated(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "list_response_message_attempt_endpoint_out = svix.message_attempt.list_by_endpoint_deprecated(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let list_response_message_attempt_endpoint_out = svix.message_attempt().list_by_endpoint_deprecated(\"app_id\", \"msg_id\", \"endpoint_id\", None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var listResponseMessageAttemptEndpointOut = await svix.MessageAttempt.ListByEndpointDeprecatedAsync(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix message-attempt list-by-endpoint-deprecated \"app_id\" \"msg_id\" \"endpoint_id\""
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend/": {
+            "post": {
+                "description": "Resend a message to the specified endpoint.",
+                "operationId": "v1.message-attempt.resend",
+                "parameters": [
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The msg's ID or UID",
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The msg's ID or UID",
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "202": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Resend Webhook",
+                "tags": [
+                    "Message Attempt"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.messageAttempt.resend(\"app_id\", \"msg_id\", \"endpoint_id\");"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.messageAttempt.resend(\"app_id\", \"msg_id\", \"endpoint_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "svix.message_attempt.resend(\"app_id\", \"msg_id\", \"endpoint_id\", None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "await svix.message_attempt.resend(\"app_id\", \"msg_id\", \"endpoint_id\", None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "err := svixClient.MessageAttempt.Resend(ctx, \"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "svix.messageAttempt.resend(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "svix.getMessageAttempt().resend(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "svix.message_attempt.resend(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "svix.message_attempt().resend(\"app_id\", \"msg_id\", \"endpoint_id\", None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "await svix.MessageAttempt.ResendAsync(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix message-attempt resend \"app_id\" \"msg_id\" \"endpoint_id\""
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/stats/": {
+            "get": {
+                "description": "Get basic statistics for the application",
+                "operationId": "v1.application.get-stats",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "since",
+                        "required": true,
+                        "schema": {
+                            "format": "date-time",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "until",
+                        "required": true,
+                        "schema": {
+                            "format": "date-time",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationStats"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Get App Stats",
+                "tags": [
+                    "Application"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const applicationStats = await svix.application.getStats(\"app_id\");"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const applicationStats = await svix.application.getStats(\"app_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "application_stats = svix.application.get_stats(\"app_id\")"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "application_stats = await svix.application.get_stats(\"app_id\")"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "applicationStats, err := svixClient.Application.GetStats(ctx, \"app_id\")"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val applicationStats = svix.application.getStats(\"app_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "ApplicationStats applicationStats = svix.getApplication().getStats(\"app_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "application_stats = svix.application.get_stats(\"app_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let application_stats = svix.application().get_stats(\"app_id\").await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var applicationStats = await svix.Application.GetStatsAsync(\"app_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix application get-stats \"app_id\""
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/stats/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/auth/app-portal-access/{app_id}/": {
+            "post": {
+                "description": "Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.",
+                "operationId": "v1.authentication.app-portal-access",
+                "parameters": [
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/AppPortalAccessIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/AppPortalAccessOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Get Consumer App Portal Access",
+                "tags": [
+                    "Authentication"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const appPortalAccessOut = await svix.authentication.appPortalAccess(\"app_id\", {\n    featureFlags: []\n});"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const appPortalAccessOut = await svix.authentication.appPortalAccess(\"app_id\", {\n    featureFlags: []\n});"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "app_portal_access_out = svix.authentication.app_portal_access(\"app_id\", AppPortalAccessIn(\n    feature_flags=[]\n), None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "app_portal_access_out = await svix.authentication.app_portal_access(\"app_id\", AppPortalAccessIn(\n    feature_flags=[]\n), None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "appPortalAccessOut, err := svixClient.Authentication.AppPortalAccess(ctx, \"app_id\", &AppPortalAccessIn{\n    FeatureFlags: []interface{}{},\n})"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val appPortalAccessOut = svix.authentication.appPortalAccess(\"app_id\", AppPortalAccessIn()\n    .featureFlags(arrayOf())\n)"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "AppPortalAccessOut appPortalAccessOut = svix.getAuthentication().appPortalAccess(\"app_id\", new AppPortalAccessIn()\n    .featureFlags(new Object[]{})\n)"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "app_portal_access_out = svix.authentication.app_portal_access(\"app_id\", Svix::AppPortalAccessIn.new({\n    \"feature_flags\": []\n}))"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let app_portal_access_out = svix.authentication().app_portal_access(\"app_id\", AppPortalAccessIn {\n    feature_flags: Some(vec![]),\n}, None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var appPortalAccessOut = await svix.Authentication.AppPortalAccessAsync(\"app_id\", new AppPortalAccessIn{\n    featureFlags: new Object[] {}\n})"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix authentication app-portal-access \"app_id\" '{\n    \"featureFlags\": []\n}'"
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/app-portal-access/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"featureFlags\": []\n    }'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/auth/app/{app_id}/expire-all/": {
+            "post": {
+                "description": "Expire all of the tokens associated with a specific Application",
+                "operationId": "v1.authentication.expire-all",
+                "parameters": [
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/ApplicationTokenExpireIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Expire All",
+                "tags": [
+                    "Authentication"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.authentication.expireAll(\"app_id\", {\n    expiry: 60\n});"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.authentication.expireAll(\"app_id\", {\n    expiry: 60\n});"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "svix.authentication.expire_all(\"app_id\", ApplicationTokenExpireIn(\n    expiry=60\n), None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "await svix.authentication.expire_all(\"app_id\", ApplicationTokenExpireIn(\n    expiry=60\n), None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "err := svixClient.Authentication.ExpireAll(ctx, \"app_id\", &ApplicationTokenExpireIn{\n    Expiry: 60,\n})"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "svix.authentication.expireAll(\"app_id\", ApplicationTokenExpireIn()\n    .expiry(60)\n)"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "svix.getAuthentication().expireAll(\"app_id\", new ApplicationTokenExpireIn()\n    .expiry(60)\n)"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "svix.authentication.expire_all(\"app_id\", Svix::ApplicationTokenExpireIn.new({\n    \"expiry\": 60\n}))"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "svix.authentication().expire_all(\"app_id\", ApplicationTokenExpireIn {\n    expiry: Some(60),\n}, None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "await svix.Authentication.ExpireAllAsync(\"app_id\", new ApplicationTokenExpireIn{\n    expiry: 60\n})"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix authentication expire-all \"app_id\" '{\n    \"expiry\": 60\n}'"
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/app/{app_id}/expire-all/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"expiry\": 60\n    }'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/auth/dashboard-access/{app_id}/": {
+            "post": {
+                "deprecated": true,
+                "description": "DEPRECATED: Please use `app-portal-access` instead.\n\nUse this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.",
+                "operationId": "v1.authentication.dashboard-access",
+                "parameters": [
+                    {
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/DashboardAccessOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Dashboard Access",
+                "tags": [
+                    "Authentication"
+                ],
+                "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const dashboardAccessOut = await svix.authentication.dashboardAccess(\"app_id\");"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const dashboardAccessOut = await svix.authentication.dashboardAccess(\"app_id\");"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "dashboard_access_out = svix.authentication.dashboard_access(\"app_id\", None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "dashboard_access_out = await svix.authentication.dashboard_access(\"app_id\", None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "dashboardAccessOut, err := svixClient.Authentication.DashboardAccess(ctx, \"app_id\")"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val dashboardAccessOut = svix.authentication.dashboardAccess(\"app_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "DashboardAccessOut dashboardAccessOut = svix.getAuthentication().dashboardAccess(\"app_id\")"
                     },
                     {
-                        "in": "query",
-                        "name": "status",
-                        "required": false,
-                        "schema": {
-                            "$ref": "#/components/schemas/MessageStatus",
-                            "nullable": true
-                        }
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "dashboard_access_out = svix.authentication.dashboard_access(\"app_id\")"
                     },
                     {
-                        "in": "query",
-                        "name": "before",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "Before",
-                            "type": "string"
-                        }
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let dashboard_access_out = svix.authentication().dashboard_access(\"app_id\", None).await?;"
                     },
                     {
-                        "in": "query",
-                        "name": "after",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "After",
-                            "type": "string"
-                        }
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var dashboardAccessOut = await svix.Authentication.DashboardAccessAsync(\"app_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix authentication dashboard-access \"app_id\""
                     },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/dashboard-access/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/auth/logout/": {
+            "post": {
+                "description": "Logout an app token.\n\nTrying to log out other tokens will fail.",
+                "operationId": "v1.authentication.logout",
+                "parameters": [
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptEndpointOut_"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
+                    "204": {
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -11661,92 +12971,109 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "List Attempts For Endpoint",
+                "summary": "Logout",
                 "tags": [
-                    "Message Attempt"
+                    "Authentication"
                 ],
                 "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.authentication.logout();"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.authentication.logout();"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "svix.authentication.logout(None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "await svix.authentication.logout(None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "err := svixClient.Authentication.Logout(ctx)"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "svix.authentication.logout()"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "svix.getAuthentication().logout()"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "svix.authentication.logout()"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "svix.authentication().logout(None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "await svix.Authentication.LogoutAsync()"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix authentication logout "
+                    },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/logout/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend/": {
+        "/api/v1/auth/one-time-token/": {
             "post": {
-                "description": "Resend a message to the specified endpoint.",
-                "operationId": "resend_webhook_api_v1_app__app_id__msg__msg_id__endpoint__endpoint_id__resend__post",
+                "description": "This is a one time token",
+                "operationId": "v1.authentication.exchange-one-time-token",
                 "parameters": [
-                    {
-                        "in": "path",
-                        "name": "endpoint_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "path",
-                        "name": "msg_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The message's ID or eventID",
-                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Msg Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
-                "responses": {
-                    "202": {
-                        "description": "Successful Response"
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/OneTimeTokenIn"
+                            }
+                        }
                     },
-                    "400": {
+                    "required": true
+                },
+                "responses": {
+                    "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                    "$ref": "#/components/schemas/OneTimeTokenOut"
                                 }
                             }
                         },
-                        "description": "Bad Request"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -11814,124 +13141,223 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Resend Webhook",
+                "summary": "Exchange One Time Token",
                 "tags": [
-                    "Message Attempt"
+                    "Authentication"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.messageAttempt.resend('app_id', 'msg_id', 'endpoint_id');"
+                        "source": "const oneTimeTokenOut = await svix.authentication.exchangeOneTimeToken(\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.messageAttempt.resend('app_id', 'msg_id', 'endpoint_id');"
+                        "source": "const oneTimeTokenOut = await svix.authentication.exchangeOneTimeToken(\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.message_attempt.resend('app_id', 'msg_id', 'endpoint_id')"
+                        "source": "one_time_token_out = svix.authentication.exchange_one_time_token(OneTimeTokenIn\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.message_attempt.resend('app_id', 'msg_id', 'endpoint_id')"
+                        "source": "one_time_token_out = await svix.authentication.exchange_one_time_token(OneTimeTokenIn\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.MessageAttempt.Resend(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                        "source": "oneTimeTokenOut, err := svixClient.Authentication.ExchangeOneTimeToken(ctx, &OneTimeTokenIn{\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.messageAttempt.resend('app_id', 'msg_id', 'endpoint_id')"
+                        "source": "val oneTimeTokenOut = svix.authentication.exchangeOneTimeToken(OneTimeTokenIn()\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getMessageAttempt().resend('app_id', 'msg_id', 'endpoint_id')"
+                        "source": "OneTimeTokenOut oneTimeTokenOut = svix.getAuthentication().exchangeOneTimeToken(new OneTimeTokenIn()\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.message_attempt.resend('app_id', 'msg_id', 'endpoint_id')"
+                        "source": "one_time_token_out = svix.authentication.exchange_one_time_token(Svix::OneTimeTokenIn.new(\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.message_attempt().resend(\"app_id\", \"msg_id\", \"endpoint_id\").await?;"
+                        "source": "let one_time_token_out = svix.authentication().exchange_one_time_token(OneTimeTokenIn {\n}, None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var oneTimeTokenOut = await svix.Authentication.ExchangeOneTimeTokenAsync(new OneTimeTokenIn\n})"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix authentication exchange-one-time-token '\n}'"
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/one-time-token/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '\n    }'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/background-task/": {
+            "get": {
+                "description": "List background tasks executed in the past 90 days.",
+                "operationId": "list_background_tasks",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/BackgroundTaskStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "task",
+                        "schema": {
+                            "$ref": "#/components/schemas/BackgroundTaskType",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "order",
+                        "schema": {
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_BackgroundTaskOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
                     },
-                    {
-                        "label": "C#",
-                        "lang": "C#",
-                        "source": "await svix.MessageAttempt.ResendAsync(\"app_id\", \"msg_id\", \"endpoint_id\")"
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
                     },
-                    {
-                        "label": "CLI",
-                        "lang": "Shell",
-                        "source": "svix message-attempt resend 'app_id' 'msg_id' 'endpoint_id'"
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
                     },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "security": [
                     {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "HTTPBearer": []
                     }
+                ],
+                "summary": "List Background Tasks",
+                "tags": [
+                    "Background Tasks"
                 ]
             }
         },
-        "/api/v1/app/{app_id}/stats/": {
+        "/api/v1/background-task/{task_id}/": {
             "get": {
-                "description": "Get basic statistics for the application",
-                "operationId": "get_app_stats_api_v1_app__app_id__stats__get",
+                "description": "Get a background task by ID.",
+                "operationId": "get_background_task",
                 "parameters": [
                     {
                         "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "since",
-                        "required": true,
-                        "schema": {
-                            "format": "date-time",
-                            "title": "Since",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "until",
+                        "name": "task_id",
                         "required": true,
                         "schema": {
-                            "format": "date-time",
-                            "title": "Until",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -11939,11 +13365,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ApplicationStats"
+                                    "$ref": "#/components/schemas/BackgroundTaskOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -12011,56 +13437,32 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get App Stats",
+                "summary": "Get Background Task",
                 "tags": [
-                    "Application"
-                ],
-                "x-codeSamples": [
-                    {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/app/{app_id}/stats/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
-                    }
+                    "Background Tasks"
                 ]
             }
         },
-        "/api/v1/auth/app-portal-access/{app_id}/": {
+        "/api/v1/environment/export/": {
             "post": {
-                "description": "Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.",
-                "operationId": "get_app_portal_access_api_v1_auth_app_portal_access__app_id___post",
+                "description": "Download a JSON file containing all org-settings and event types",
+                "operationId": "v1.environment.export",
                 "parameters": [
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/AppPortalAccessIn"
+                                "$ref": "#/components/schemas/ExportEnvironmentIn"
                             }
                         }
                     },
@@ -12071,11 +13473,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/AppPortalAccessOut"
+                                    "$ref": "#/components/schemas/EnvironmentOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -12143,111 +13545,94 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Consumer App Portal Access",
+                "summary": "Export Environment Configuration",
                 "tags": [
-                    "Authentication"
+                    "Environment"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const appPortalAccessOut = await svix.authentication.appPortalAccess('app_id', {\n    featureFlags: [    ]\n});"
+                        "source": "const environmentOut = await svix.environment.export(\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const appPortalAccessOut = await svix.authentication.appPortalAccess('app_id', {\n    featureFlags: [    ]\n});"
+                        "source": "const environmentOut = await svix.environment.export(\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "app_portal_access_out = svix.authentication.app_portal_access('app_id', AppPortalAccessIn(\n    feature_flags=[]\n))"
+                        "source": "environment_out = svix.environment.export(ExportEnvironmentIn\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "app_portal_access_out = await svix.authentication.app_portal_access('app_id', AppPortalAccessIn(\n    feature_flags=[]\n))"
+                        "source": "environment_out = await svix.environment.export(ExportEnvironmentIn\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "appPortalAccessOut, err := svixClient.Authentication.AppPortalAccess(\"app_id\", &svix.AppPortalAccessIn{\n    FeatureFlags: [...]string{}\n})"
+                        "source": "environmentOut, err := svixClient.Environment.Export(ctx, &ExportEnvironmentIn{\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val appPortalAccessOut = svix.authentication.appPortalAccess('app_id', AppPortalAccessIn()\n    .featureFlags(arrayOf())\n)"
+                        "source": "val environmentOut = svix.environment.export(ExportEnvironmentIn()\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "AppPortalAccessOut appPortalAccessOut = svix.getAuthentication().appPortalAccess('app_id', new AppPortalAccessIn()\n    .featureFlags(new String[]{})\n)"
+                        "source": "EnvironmentOut environmentOut = svix.getEnvironment().export(new ExportEnvironmentIn()\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "app_portal_access_out = svix.authentication.app_portal_access('app_id', Svix::AppPortalAccessIn.new({\n    \"feature_flags\": []\n}))"
+                        "source": "environment_out = svix.environment.export(Svix::ExportEnvironmentIn.new(\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let app_portal_access_out = svix.authentication().app_portal_access(\"app_id\", AppPortalAccessIn {\n    feature_flags: Some(vec![])\n}).await?;"
+                        "source": "let environment_out = svix.environment().export(ExportEnvironmentIn {\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var appPortalAccessOut = await svix.Authentication.AppPortalAccessAsync(\"app_id\", new AppPortalAccessIn{\n    featureFlags: new string[] {}\n})"
+                        "source": "var environmentOut = await svix.Environment.ExportAsync(new ExportEnvironmentIn\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix authentication app-portal-access 'app_id' '{\n    \"featureFlags\": []\n}'"
+                        "source": "svix environment export '\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/app-portal-access/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"featureFlags\": []\n}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/environment/export/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/auth/app/{app_id}/expire-all/": {
+        "/api/v1/environment/import/": {
             "post": {
-                "description": "Expire all of the tokens associated with a specific Application",
-                "operationId": "expire_all_api_v1_auth_app__app_id__expire_all__post",
+                "description": "Import a configuration into the active organization.\nIt doesn't delete anything, only adds/updates what was passed to it.",
+                "operationId": "v1.environment.import",
                 "parameters": [
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/ApplicationTokenExpireIn"
+                                "$ref": "#/components/schemas/EnvironmentIn"
                             }
                         }
                     },
@@ -12255,7 +13640,7 @@
                 },
                 "responses": {
                     "204": {
-                        "description": "Successful Response"
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -12323,117 +13708,88 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Expire All",
+                "summary": "Import Environment Configuration",
                 "tags": [
-                    "Authentication"
+                    "Environment"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.authentication.expireAll('app_id', {\n    expiry: 60\n});"
+                        "source": "await svix.environment.import({\n    eventTypes: null,\n    settings: null\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.authentication.expireAll('app_id', {\n    expiry: 60\n});"
+                        "source": "await svix.environment.import({\n    eventTypes: null,\n    settings: null\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.authentication.expire_all('app_id', ApplicationTokenExpireIn(\n    expiry=60\n))"
+                        "source": "svix.environment.import(EnvironmentIn(\n    event_types=None,\n    settings=None\n), None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.authentication.expire_all('app_id', ApplicationTokenExpireIn(\n    expiry=60\n))"
+                        "source": "await svix.environment.import(EnvironmentIn(\n    event_types=None,\n    settings=None\n), None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Authentication.ExpireAll(\"app_id\", &svix.ApplicationTokenExpireIn{\n    Expiry: 60\n})"
+                        "source": "err := svixClient.Environment.Import(ctx, &EnvironmentIn{\n    EventTypes: nil,\n    Settings: nil,\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.authentication.expireAll('app_id', ApplicationTokenExpireIn()\n    .expiry(60)\n)"
+                        "source": "svix.environment.import(EnvironmentIn()\n    .eventTypes(null)\n    .settings(null)\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getAuthentication().expireAll('app_id', new ApplicationTokenExpireIn()\n    .expiry(60)\n)"
+                        "source": "svix.getEnvironment().import(new EnvironmentIn()\n    .eventTypes(null)\n    .settings(null)\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.authentication.expire_all('app_id', Svix::ApplicationTokenExpireIn.new({\n    \"expiry\": 60\n}))"
+                        "source": "svix.environment.import(Svix::EnvironmentIn.new({\n    \"event_types\": nil,\n    \"settings\": nil\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.authentication().expire_all(\"app_id\", ApplicationTokenExpireIn {\n    expiry: Some(60)\n}).await?;"
+                        "source": "svix.environment().import(EnvironmentIn {\n    event_types: None,\n    settings: None,\n}, None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Authentication.ExpireAllAsync(\"app_id\", new ApplicationTokenExpireIn{\n    expiry: 60\n})"
+                        "source": "await svix.Environment.ImportAsync(new EnvironmentIn{\n    eventTypes: null,\n    settings: null\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix authentication expire-all 'app_id' '{\n    \"expiry\": 60\n}'"
+                        "source": "svix environment import '{\n    \"eventTypes\": null,\n    \"settings\": null\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/app/{app_id}/expire-all/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"expiry\": 60\n}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/environment/import/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"eventTypes\": null,\n        \"settings\": null\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/auth/dashboard-access/{app_id}/": {
-            "post": {
-                "deprecated": true,
-                "description": "DEPRECATED: Please use `app-portal-access` instead.\n\nUse this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.",
-                "operationId": "get_dashboard_access_api_v1_auth_dashboard_access__app_id___post",
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
-                    }
-                ],
+        "/api/v1/environment/settings/": {
+            "get": {
+                "description": "Get the environment's settings",
+                "operationId": "v1.environment.get-settings",
                 "responses": {
                     "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/DashboardAccessOut"
+                                    "$ref": "#/components/schemas/EnvironmentSettingsOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -12501,95 +13857,142 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Dashboard Access",
+                "summary": "Get Org Settings",
                 "tags": [
-                    "Authentication"
+                    "Environment-Settings"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const dashboardAccessOut = await svix.authentication.dashboardAccess('app_id');"
+                        "source": "const environmentSettingsOut = await svix.environment.getSettings();"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const dashboardAccessOut = await svix.authentication.dashboardAccess('app_id');"
+                        "source": "const environmentSettingsOut = await svix.environment.getSettings();"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "dashboard_access_out = svix.authentication.dashboard_access('app_id')"
+                        "source": "environment_settings_out = svix.environment.get_settings()"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "dashboard_access_out = await svix.authentication.dashboard_access('app_id')"
+                        "source": "environment_settings_out = await svix.environment.get_settings()"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "dashboardAccessOut, err := svixClient.Authentication.DashboardAccess(\"app_id\")"
+                        "source": "environmentSettingsOut, err := svixClient.Environment.GetSettings(ctx)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val dashboardAccessOut = svix.authentication.dashboardAccess('app_id')"
+                        "source": "val environmentSettingsOut = svix.environment.getSettings()"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "DashboardAccessOut dashboardAccessOut = svix.getAuthentication().dashboardAccess('app_id')"
+                        "source": "EnvironmentSettingsOut environmentSettingsOut = svix.getEnvironment().getSettings()"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "dashboard_access_out = svix.authentication.dashboard_access('app_id')"
+                        "source": "environment_settings_out = svix.environment.get_settings()"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let dashboard_access_out = svix.authentication().dashboard_access(\"app_id\").await?;"
+                        "source": "let environment_settings_out = svix.environment().get_settings().await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var dashboardAccessOut = await svix.Authentication.DashboardAccessAsync(\"app_id\")"
+                        "source": "var environmentSettingsOut = await svix.Environment.GetSettingsAsync()"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix authentication dashboard-access 'app_id'"
+                        "source": "svix environment get-settings "
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/dashboard-access/{app_id}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/environment/settings/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/auth/logout/": {
-            "post": {
-                "description": "Logout an app token.\n\nTrying to log out other tokens will fail.",
-                "operationId": "logout_api_v1_auth_logout__post",
+        "/api/v1/event-type/": {
+            "get": {
+                "description": "Return the list of event types.",
+                "operationId": "v1.event-type.list",
                 "parameters": [
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "maximum": 250,
+                            "minimum": 1,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The event type's name",
+                        "in": "query",
+                        "name": "iterator",
                         "schema": {
-                            "description": "The request's idempotency key",
+                            "description": "The event type's name",
+                            "example": "user.signup",
+                            "maxLength": 256,
                             "nullable": true,
-                            "title": "Idempotency-Key",
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "order",
+                        "schema": {
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "include_archived",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_EventTypeOut_"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -12657,112 +14060,107 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Logout",
+                "summary": "List Event Types",
                 "tags": [
-                    "Authentication"
+                    "Event Type"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.authentication.logout();"
+                        "source": "const listResponseEventTypeOut = await svix.eventType.list();"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.authentication.logout();"
+                        "source": "const listResponseEventTypeOut = await svix.eventType.list();"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.authentication.logout()"
+                        "source": "list_response_event_type_out = svix.event_type.list(None)"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.authentication.logout()"
+                        "source": "list_response_event_type_out = await svix.event_type.list(None)"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.Authentication.Logout()"
+                        "source": "listResponseEventTypeOut, err := svixClient.EventType.List(ctx, nil)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.authentication.logout()"
+                        "source": "val listResponseEventTypeOut = svix.eventType.list()"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getAuthentication().logout()"
+                        "source": "ListResponseEventTypeOut listResponseEventTypeOut = svix.getEventType().list()"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.authentication.logout"
+                        "source": "list_response_event_type_out = svix.event_type.list()"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.authentication().logout().await?;"
+                        "source": "let list_response_event_type_out = svix.event_type().list(None).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.Authentication.LogoutAsync()"
+                        "source": "var listResponseEventTypeOut = await svix.EventType.ListAsync()"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix authentication logout "
+                        "source": "svix event-type list "
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/auth/logout/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/event-type/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
-                ]
-            }
-        },
-        "/api/v1/environment/export/": {
+                ]
+            },
             "post": {
-                "description": "Download a JSON file containing all org-settings and event types",
-                "operationId": "export_environment_configuration_api_v1_environment_export__post",
+                "description": "Create new or unarchive existing event type.\n\nUnarchiving an event type will allow endpoints to filter on it and messages to be sent with it.\nEndpoints filtering on the event type before archival will continue to filter on it.\nThis operation does not preserve the description and schemas.",
+                "operationId": "v1.event-type.create",
                 "parameters": [
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/ExportEnvironmentIn"
+                                "$ref": "#/components/schemas/EventTypeIn"
                             }
                         }
                     },
                     "required": true
                 },
                 "responses": {
-                    "200": {
+                    "201": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EnvironmentOut"
+                                    "$ref": "#/components/schemas/EventTypeOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -12830,50 +14228,109 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Export Environment Configuration",
+                "summary": "Create Event Type",
                 "tags": [
-                    "Environment"
+                    "Event Type"
                 ],
                 "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const eventTypeOut = await svix.eventType.create({\n    name: \"user.signup\",\n    description: \"A user has signed up\",\n    archived: false,\n    schemas: {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    featureFlag: \"cool-new-feature\"\n});"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const eventTypeOut = await svix.eventType.create({\n    name: \"user.signup\",\n    description: \"A user has signed up\",\n    archived: false,\n    schemas: {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    featureFlag: \"cool-new-feature\"\n});"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "event_type_out = svix.event_type.create(EventTypeIn(\n    name=\"user.signup\",\n    description=\"A user has signed up\",\n    archived=False,\n    schemas={\"1\": {\"description\": \"An invoice was paid by a user\", \"properties\": {\"invoiceId\": {\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": {\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": [\"invoiceId\", \"userId\"], \"title\": \"Invoice Paid Event\", \"type\": \"object\"}},\n    feature_flag=\"cool-new-feature\"\n), None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "event_type_out = await svix.event_type.create(EventTypeIn(\n    name=\"user.signup\",\n    description=\"A user has signed up\",\n    archived=False,\n    schemas={\"1\": {\"description\": \"An invoice was paid by a user\", \"properties\": {\"invoiceId\": {\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": {\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": [\"invoiceId\", \"userId\"], \"title\": \"Invoice Paid Event\", \"type\": \"object\"}},\n    feature_flag=\"cool-new-feature\"\n), None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "eventTypeOut, err := svixClient.EventType.Create(ctx, &EventTypeIn{\n    Name: \"user.signup\",\n    Description: \"A user has signed up\",\n    Archived: false,\n    Schemas: map[interface{}]interface{}{\"1\": map[string]interface{}{\"description\": \"An invoice was paid by a user\", \"properties\": map[interface{}]interface{}{\"invoiceId\": map[string]interface{}{\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": map[string]interface{}{\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": []string{\"invoiceId\", \"userId\"}, \"title\": \"Invoice Paid Event\", \"type\": \"object\"}},\n    FeatureFlag: \"cool-new-feature\",\n})"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val eventTypeOut = svix.eventType.create(EventTypeIn()\n    .name(\"user.signup\")\n    .description(\"A user has signed up\")\n    .archived(false)\n    .schemas(\"\"\"{\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}}\"\"\")\n    .featureFlag(\"cool-new-feature\")\n)"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "EventTypeOut eventTypeOut = svix.getEventType().create(new EventTypeIn()\n    .name(\"user.signup\")\n    .description(\"A user has signed up\")\n    .archived(false)\n    .schemas(\"{\\\"1\\\":{\\\"description\\\":\\\"An invoice was paid by a user\\\",\\\"properties\\\":{\\\"invoiceId\\\":{\\\"description\\\":\\\"The invoice id\\\",\\\"type\\\":\\\"string\\\"},\\\"userId\\\":{\\\"description\\\":\\\"The user id\\\",\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"invoiceId\\\",\\\"userId\\\"],\\\"title\\\":\\\"Invoice Paid Event\\\",\\\"type\\\":\\\"object\\\"}}\")\n    .featureFlag(\"cool-new-feature\")\n)"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "event_type_out = svix.event_type.create(Svix::EventTypeIn.new({\n    \"name\": \"user.signup\",\n    \"description\": \"A user has signed up\",\n    \"archived\": false,\n    \"schemas\": {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    \"feature_flag\": \"cool-new-feature\"\n}))"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let event_type_out = svix.event_type().create(EventTypeIn {\n    name: \"user.signup\".to_string(),\n    description: \"A user has signed up\".to_string(),\n    archived: Some(false),\n    schemas: Some(json!({\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}})),\n    feature_flag: Some(\"cool-new-feature\".to_string()),\n}, None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var eventTypeOut = await svix.EventType.CreateAsync(new EventTypeIn{\n    name: \"user.signup\",\n    description: \"A user has signed up\",\n    archived: false,\n    schemas: new {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    featureFlag: \"cool-new-feature\"\n})"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix event-type create '{\n    \"name\": \"user.signup\",\n    \"description\": \"A user has signed up\",\n    \"archived\": false,\n    \"schemas\": {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    \"featureFlag\": \"cool-new-feature\"\n}'"
+                    },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/environment/export/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/event-type/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"name\": \"user.signup\",\n        \"description\": \"A user has signed up\",\n        \"archived\": false,\n        \"schemas\": {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n        \"featureFlag\": \"cool-new-feature\"\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/environment/import/": {
+        "/api/v1/event-type/schema/generate-example/": {
             "post": {
-                "description": "Import a configuration into the active organization.\nIt doesn't delete anything, only adds/updates what was passed to it.",
-                "operationId": "import_environment_configuration_api_v1_environment_import__post",
+                "description": "Generates a fake example from the given JSONSchema",
+                "operationId": "v1.event-type.generate-example",
                 "parameters": [
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/EnvironmentIn"
+                                "$ref": "#/components/schemas/EventTypeSchemaIn"
                             }
                         }
                     },
                     "required": true
                 },
                 "responses": {
-                    "204": {
-                        "description": "Successful Response"
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeExampleOut"
+                                }
+                            }
+                        },
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -12941,47 +14398,106 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Import Environment Configuration",
+                "summary": "Generate Schema Example",
                 "tags": [
-                    "Environment"
+                    "Event Type"
                 ],
                 "x-codeSamples": [
+                    {
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const eventTypeExampleOut = await svix.eventType.generateExample({\n    schema: {\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\n});"
+                    },
+                    {
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const eventTypeExampleOut = await svix.eventType.generateExample({\n    schema: {\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\n});"
+                    },
+                    {
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "event_type_example_out = svix.event_type.generate_example(EventTypeSchemaIn(\n    schema={\"description\": \"An invoice was paid by a user\", \"properties\": {\"invoiceId\": {\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": {\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": [\"invoiceId\", \"userId\"], \"title\": \"Invoice Paid Event\", \"type\": \"object\"}\n), None)"
+                    },
+                    {
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "event_type_example_out = await svix.event_type.generate_example(EventTypeSchemaIn(\n    schema={\"description\": \"An invoice was paid by a user\", \"properties\": {\"invoiceId\": {\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": {\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": [\"invoiceId\", \"userId\"], \"title\": \"Invoice Paid Event\", \"type\": \"object\"}\n), None)"
+                    },
+                    {
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "eventTypeExampleOut, err := svixClient.EventType.GenerateExample(ctx, &EventTypeSchemaIn{\n    Schema: map[string]interface{}{\"description\": \"An invoice was paid by a user\", \"properties\": map[interface{}]interface{}{\"invoiceId\": map[string]interface{}{\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": map[string]interface{}{\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": []string{\"invoiceId\", \"userId\"}, \"title\": \"Invoice Paid Event\", \"type\": \"object\"},\n})"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val eventTypeExampleOut = svix.eventType.generateExample(EventTypeSchemaIn()\n    .schema(\"\"\"{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\"\"\")\n)"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "EventTypeExampleOut eventTypeExampleOut = svix.getEventType().generateExample(new EventTypeSchemaIn()\n    .schema(\"{\\\"description\\\":\\\"An invoice was paid by a user\\\",\\\"properties\\\":{\\\"invoiceId\\\":{\\\"description\\\":\\\"The invoice id\\\",\\\"type\\\":\\\"string\\\"},\\\"userId\\\":{\\\"description\\\":\\\"The user id\\\",\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"invoiceId\\\",\\\"userId\\\"],\\\"title\\\":\\\"Invoice Paid Event\\\",\\\"type\\\":\\\"object\\\"}\")\n)"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "event_type_example_out = svix.event_type.generate_example(Svix::EventTypeSchemaIn.new({\n    \"schema\": {\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\n}))"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let event_type_example_out = svix.event_type().generate_example(EventTypeSchemaIn {\n    schema: json!({\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}),\n}, None).await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var eventTypeExampleOut = await svix.EventType.GenerateExampleAsync(new EventTypeSchemaIn{\n    schema: new {\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\n})"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix event-type generate-example '{\n    \"schema\": {\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\n}'"
+                    },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/environment/import/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"version\": null,\n    \"createdAt\": \"2019-08-24T14:15:22Z\",\n    \"eventTypes\": null,\n    \"settings\": null\n}'"
+                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/event-type/schema/generate-example/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"schema\": {\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/environment/settings/": {
-            "get": {
-                "description": "Get the environment's settings",
-                "operationId": "get_org_settings_api_v1_environment_settings__get",
+        "/api/v1/event-type/{event_type_name}/": {
+            "delete": {
+                "description": "Archive an event type.\n\nEndpoints already configured to filter on an event type will continue to do so after archival.\nHowever, new messages can not be sent with it and endpoints can not filter on it.\nAn event type can be unarchived with the\n[create operation](#operation/create_event_type_api_v1_event_type__post).",
+                "operationId": "v1.event-type.delete",
                 "parameters": [
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The event type's name",
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The event type's name",
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "query",
+                        "name": "expunge",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
                     }
                 ],
                 "responses": {
-                    "200": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/EnvironmentSettingsOut"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
+                    "204": {
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -13049,79 +14565,90 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Org Settings",
+                "summary": "Delete Event Type",
                 "tags": [
-                    "Environment-Settings"
+                    "Event Type"
                 ],
                 "x-codeSamples": [
                     {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/environment/settings/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
-                    }
-                ]
-            }
-        },
-        "/api/v1/event-type/": {
-            "get": {
-                "description": "Return the list of event types.",
-                "operationId": "list_event_types_api_v1_event_type__get",
-                "parameters": [
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.eventType.delete(\"event_type_name\");"
+                    },
                     {
-                        "in": "query",
-                        "name": "iterator",
-                        "required": false,
-                        "schema": {
-                            "example": "user.signup",
-                            "maxLength": 256,
-                            "nullable": true,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Iterator",
-                            "type": "string"
-                        }
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "await svix.eventType.delete(\"event_type_name\");"
                     },
                     {
-                        "in": "query",
-                        "name": "limit",
-                        "required": false,
-                        "schema": {
-                            "default": 50,
-                            "maximum": 250.0,
-                            "title": "Limit",
-                            "type": "integer"
-                        }
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "svix.event_type.delete(\"event_type_name\")"
                     },
                     {
-                        "in": "query",
-                        "name": "with_content",
-                        "required": false,
-                        "schema": {
-                            "default": false,
-                            "title": "With Content",
-                            "type": "boolean"
-                        }
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "await svix.event_type.delete(\"event_type_name\")"
                     },
                     {
-                        "in": "query",
-                        "name": "include_archived",
-                        "required": false,
-                        "schema": {
-                            "default": false,
-                            "title": "Include Archived",
-                            "type": "boolean"
-                        }
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "err := svixClient.EventType.Delete(ctx, \"event_type_name\")"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "svix.eventType.delete(\"event_type_name\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "svix.getEventType().delete(\"event_type_name\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "svix.event_type.delete(\"event_type_name\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "svix.event_type().delete(\"event_type_name\").await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "await svix.EventType.DeleteAsync(\"event_type_name\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix event-type delete \"event_type_name\""
+                    },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/event-type/{event_type_name}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            },
+            "get": {
+                "description": "Get an event type.",
+                "operationId": "v1.event-type.get",
+                "parameters": [
+                    {
+                        "description": "The event type's name",
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The event type's name",
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -13129,11 +14656,11 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/ListResponse_EventTypeOut_"
+                                    "$ref": "#/components/schemas/EventTypeOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -13201,7 +14728,7 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "List Event Types",
+                "summary": "Get Event Type",
                 "tags": [
                     "Event Type"
                 ],
@@ -13209,94 +14736,96 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseEventTypeOut = await svix.eventType.list();"
+                        "source": "const eventTypeOut = await svix.eventType.get(\"event_type_name\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const listResponseEventTypeOut = await svix.eventType.list();"
+                        "source": "const eventTypeOut = await svix.eventType.get(\"event_type_name\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "list_response_event_type_out = svix.event_type.list()"
+                        "source": "event_type_out = svix.event_type.get(\"event_type_name\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "list_response_event_type_out = await svix.event_type.list()"
+                        "source": "event_type_out = await svix.event_type.get(\"event_type_name\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "listResponseEventTypeOut, err := svixClient.EventType.List(nil)"
+                        "source": "eventTypeOut, err := svixClient.EventType.Get(ctx, \"event_type_name\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val listResponseEventTypeOut = svix.eventType.list(FetchOptions())"
+                        "source": "val eventTypeOut = svix.eventType.get(\"event_type_name\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "ListResponseEventTypeOut listResponseEventTypeOut = svix.getEventType().list(new FetchOptions())"
+                        "source": "EventTypeOut eventTypeOut = svix.getEventType().get(\"event_type_name\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "list_response_event_type_out = svix.event_type.list"
+                        "source": "event_type_out = svix.event_type.get(\"event_type_name\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let list_response_event_type_out = svix.event_type().list(None).await?;"
+                        "source": "let event_type_out = svix.event_type().get(\"event_type_name\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var listResponseEventTypeOut = await svix.EventType.ListAsync()"
+                        "source": "var eventTypeOut = await svix.EventType.GetAsync(\"event_type_name\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix event-type list "
+                        "source": "svix event-type get \"event_type_name\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/event-type/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/event-type/{event_type_name}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             },
-            "post": {
-                "description": "Create new or unarchive existing event type.\n\nUnarchiving an event type will allow endpoints to filter on it and messages to be sent with it.\nEndpoints filtering on the event type before archival will continue to filter on it.\nThis operation does not preserve the description and schemas.",
-                "operationId": "create_event_type_api_v1_event_type__post",
+            "patch": {
+                "description": "Partially update an event type.",
+                "operationId": "patch_event_type",
                 "parameters": [
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The event type's name",
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The event type's name",
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/EventTypeIn"
+                                "$ref": "#/components/schemas/EventTypePatch"
                             }
                         }
                     },
                     "required": true
                 },
                 "responses": {
-                    "201": {
+                    "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
@@ -13304,7 +14833,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -13372,97 +14901,35 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Create Event Type",
+                "summary": "Patch Event Type",
                 "tags": [
                     "Event Type"
-                ],
-                "x-codeSamples": [
-                    {
-                        "label": "JavaScript",
-                        "lang": "JavaScript",
-                        "source": "const eventTypeOut = await svix.eventType.create({\n    description: \"A user has signed up\",\n    schemas: {\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    archived: false,\n    featureFlag: \"cool-new-feature\",\n    name: \"user.signup\"\n});"
-                    },
-                    {
-                        "label": "TypeScript",
-                        "lang": "JavaScript",
-                        "source": "const eventTypeOut = await svix.eventType.create({\n    description: \"A user has signed up\",\n    schemas: {\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    archived: false,\n    featureFlag: \"cool-new-feature\",\n    name: \"user.signup\"\n});"
-                    },
-                    {
-                        "label": "Python",
-                        "lang": "Python",
-                        "source": "event_type_out = svix.event_type.create(EventTypeIn(\n    description=\"A user has signed up\",\n    schemas={'1': {'title': 'Invoice Paid Event', 'description': 'An invoice was paid by a user', 'type': 'object', 'properties': {'invoiceId': {'description': 'The invoice id', 'type': 'string'}, 'userId': {'description': 'The user id', 'type': 'string'}}, 'required': ['invoiceId', 'userId']}},\n    archived=False,\n    feature_flag=\"cool-new-feature\",\n    name=\"user.signup\"\n))"
-                    },
-                    {
-                        "label": "Python (Async)",
-                        "lang": "Python",
-                        "source": "event_type_out = await svix.event_type.create(EventTypeIn(\n    description=\"A user has signed up\",\n    schemas={'1': {'title': 'Invoice Paid Event', 'description': 'An invoice was paid by a user', 'type': 'object', 'properties': {'invoiceId': {'description': 'The invoice id', 'type': 'string'}, 'userId': {'description': 'The user id', 'type': 'string'}}, 'required': ['invoiceId', 'userId']}},\n    archived=False,\n    feature_flag=\"cool-new-feature\",\n    name=\"user.signup\"\n))"
-                    },
-                    {
-                        "label": "Go",
-                        "lang": "Go",
-                        "source": "eventTypeOut, err := svixClient.EventType.Create(&svix.EventTypeIn{\n    Description: \"A user has signed up\",\n    Schemas: map[string]interface{}{\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    Archived: False,\n    FeatureFlag: \"cool-new-feature\",\n    Name: \"user.signup\"\n})"
-                    },
-                    {
-                        "label": "Kotlin",
-                        "lang": "Kotlin",
-                        "source": "val eventTypeOut = svix.eventType.create(EventTypeIn()\n    .description(\"A user has signed up\"),\n    .schemas(\"\"\"{\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    }\"\"\"),\n    .archived(False),\n    .featureFlag(\"cool-new-feature\"),\n    .name(\"user.signup\")\n)"
-                    },
-                    {
-                        "label": "Java",
-                        "lang": "Java",
-                        "source": "EventTypeOut eventTypeOut = svix.getEventType().create(new EventTypeIn()\n    .description(\"A user has signed up\"),\n    .schemas(\"{\" +\n        \"\\\"1\\\": {\" +\n                \"\\\"title\\\": \\\"Invoice Paid Event\\\",\" +\n                \"\\\"description\\\": \\\"An invoice was paid by a user\\\",\" +\n                \"\\\"type\\\": \\\"object\\\",\" +\n                \"\\\"properties\\\": {\" +\n                        \"\\\"invoiceId\\\": {\" +\n                                \"\\\"description\\\": \\\"The invoice id\\\",\" +\n                                \"\\\"type\\\": \\\"string\\\"\" +\n                        \"},\" +\n                        \"\\\"userId\\\": {\" +\n                                \"\\\"description\\\": \\\"The user id\\\",\" +\n                                \"\\\"type\\\": \\\"string\\\"\" +\n                        \"}\" +\n                \"},\" +\n                \"\\\"required\\\": [\" +\n                        \"\\\"invoiceId\\\",\" +\n                        \"\\\"userId\\\"\" +\n                \"]\" +\n        \"}\" +\n    \"}\"),\n    .archived(False),\n    .featureFlag(\"cool-new-feature\"),\n    .name(\"user.signup\")\n)"
-                    },
-                    {
-                        "label": "Ruby",
-                        "lang": "Ruby",
-                        "source": "event_type_out = svix.event_type.create(Svix::EventTypeIn.new({\n    \"description\": \"A user has signed up\",\n    \"schemas\": {\n        \"1\": {\n            \"title\": \"Invoice Paid Event\",\n            \"description\": \"An invoice was paid by a user\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"invoiceId\": {\n                    \"description\": \"The invoice id\",\n                    \"type\": \"string\"\n                },\n                \"userId\": {\n                    \"description\": \"The user id\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"invoiceId\",\n                \"userId\"\n            ]\n        }\n    },\n    \"archived\": false,\n    \"feature_flag\": \"cool-new-feature\",\n    \"name\": \"user.signup\"\n}))"
-                    },
-                    {
-                        "label": "Rust",
-                        "lang": "Rust",
-                        "source": "let event_type_out = svix.event_type().create(EventTypeIn {\n    description: \"A user has signed up\".to_string(),\n    schemas: Some(json!({\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    })),\n    archived: Some(False),\n    feature_flag: Some(\"cool-new-feature\".to_string()),\n    name: \"user.signup\".to_string()\n}, None).await?;"
-                    },
-                    {
-                        "label": "C#",
-                        "lang": "C#",
-                        "source": "var eventTypeOut = await svix.EventType.CreateAsync(new EventTypeIn{\n    description: \"A user has signed up\",\n    schemas: new {\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    archived: false,\n    featureFlag: \"cool-new-feature\",\n    name: \"user.signup\"\n})"
-                    },
-                    {
-                        "label": "CLI",
-                        "lang": "Shell",
-                        "source": "svix event-type create '{\n    \"description\": \"A user has signed up\",\n    \"schemas\": {\n        \"1\": {\n            \"title\": \"Invoice Paid Event\",\n            \"description\": \"An invoice was paid by a user\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"invoiceId\": {\n                    \"description\": \"The invoice id\",\n                    \"type\": \"string\"\n                },\n                \"userId\": {\n                    \"description\": \"The user id\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"invoiceId\",\n                \"userId\"\n            ]\n        }\n    },\n    \"archived\": false,\n    \"featureFlag\": \"cool-new-feature\",\n    \"name\": \"user.signup\"\n}'"
-                    },
-                    {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/event-type/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"description\": \"A user has signed up\",\n    \"schemas\": {\n        \"1\": {\n            \"title\": \"Invoice Paid Event\",\n            \"description\": \"An invoice was paid by a user\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"invoiceId\": {\n                    \"description\": \"The invoice id\",\n                    \"type\": \"string\"\n                },\n                \"userId\": {\n                    \"description\": \"The user id\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"invoiceId\",\n                \"userId\"\n            ]\n        }\n    },\n    \"archived\": false,\n    \"featureFlag\": \"cool-new-feature\",\n    \"name\": \"user.signup\"\n}'"
-                    }
                 ]
-            }
-        },
-        "/api/v1/event-type/schema/generate-example/": {
-            "post": {
-                "description": "Generates a fake example from the given JSONSchema",
-                "operationId": "generate_schema_example_api_v1_event_type_schema_generate_example__post",
+            },
+            "put": {
+                "description": "Update an event type.",
+                "operationId": "v1.event-type.update",
                 "parameters": [
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The event type's name",
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The event type's name",
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "requestBody": {
                     "content": {
                         "application/json": {
                             "schema": {
-                                "$ref": "#/components/schemas/EventTypeSchemaIn"
+                                "$ref": "#/components/schemas/EventTypeUpdate"
                             }
                         }
                     },
@@ -13473,11 +14940,21 @@
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EventTypeExampleOut"
+                                    "$ref": "#/components/schemas/EventTypeOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -13540,7 +15017,12 @@
                         "description": "Too Many Requests"
                     }
                 },
-                "summary": "Generate Schema Example",
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Update Event Type",
                 "tags": [
                     "Event Type"
                 ],
@@ -13548,109 +15030,73 @@
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const eventTypeExampleOut = await svix.eventType.generate({\n    schema: {\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n                \"invoiceId\": {\n                        \"description\": \"The invoice id\",\n                        \"type\": \"string\"\n                },\n                \"userId\": {\n                        \"description\": \"The user id\",\n                        \"type\": \"string\"\n                }\n        },\n        \"required\": [\n                \"invoiceId\",\n                \"userId\"\n        ]\n    }\n});"
+                        "source": "const eventTypeOut = await svix.eventType.update(\"event_type_name\", {\n    description: \"A user has signed up\",\n    archived: false,\n    schemas: {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    featureFlag: \"cool-new-feature\"\n});"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const eventTypeExampleOut = await svix.eventType.generate({\n    schema: {\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n                \"invoiceId\": {\n                        \"description\": \"The invoice id\",\n                        \"type\": \"string\"\n                },\n                \"userId\": {\n                        \"description\": \"The user id\",\n                        \"type\": \"string\"\n                }\n        },\n        \"required\": [\n                \"invoiceId\",\n                \"userId\"\n        ]\n    }\n});"
+                        "source": "const eventTypeOut = await svix.eventType.update(\"event_type_name\", {\n    description: \"A user has signed up\",\n    archived: false,\n    schemas: {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    featureFlag: \"cool-new-feature\"\n});"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "event_type_example_out = svix.event_type.generate(EventTypeSchemaIn(\n    schema={'title': 'Invoice Paid Event', 'description': 'An invoice was paid by a user', 'type': 'object', 'properties': {'invoiceId': {'description': 'The invoice id', 'type': 'string'}, 'userId': {'description': 'The user id', 'type': 'string'}}, 'required': ['invoiceId', 'userId']}\n))"
+                        "source": "event_type_out = svix.event_type.update(\"event_type_name\", EventTypeUpdate(\n    description=\"A user has signed up\",\n    archived=False,\n    schemas={\"1\": {\"description\": \"An invoice was paid by a user\", \"properties\": {\"invoiceId\": {\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": {\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": [\"invoiceId\", \"userId\"], \"title\": \"Invoice Paid Event\", \"type\": \"object\"}},\n    feature_flag=\"cool-new-feature\"\n))"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "event_type_example_out = await svix.event_type.generate(EventTypeSchemaIn(\n    schema={'title': 'Invoice Paid Event', 'description': 'An invoice was paid by a user', 'type': 'object', 'properties': {'invoiceId': {'description': 'The invoice id', 'type': 'string'}, 'userId': {'description': 'The user id', 'type': 'string'}}, 'required': ['invoiceId', 'userId']}\n))"
+                        "source": "event_type_out = await svix.event_type.update(\"event_type_name\", EventTypeUpdate(\n    description=\"A user has signed up\",\n    archived=False,\n    schemas={\"1\": {\"description\": \"An invoice was paid by a user\", \"properties\": {\"invoiceId\": {\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": {\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": [\"invoiceId\", \"userId\"], \"title\": \"Invoice Paid Event\", \"type\": \"object\"}},\n    feature_flag=\"cool-new-feature\"\n))"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "eventTypeExampleOut, err := svixClient.EventType.Generate(&svix.EventTypeSchemaIn{\n    Schema: map[string]interface{}{\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n                \"invoiceId\": {\n                        \"description\": \"The invoice id\",\n                        \"type\": \"string\"\n                },\n                \"userId\": {\n                        \"description\": \"The user id\",\n                        \"type\": \"string\"\n                }\n        },\n        \"required\": [\n                \"invoiceId\",\n                \"userId\"\n        ]\n    }\n})"
+                        "source": "eventTypeOut, err := svixClient.EventType.Update(ctx, \"event_type_name\", &EventTypeUpdate{\n    Description: \"A user has signed up\",\n    Archived: false,\n    Schemas: map[interface{}]interface{}{\"1\": map[string]interface{}{\"description\": \"An invoice was paid by a user\", \"properties\": map[interface{}]interface{}{\"invoiceId\": map[string]interface{}{\"description\": \"The invoice id\", \"type\": \"string\"}, \"userId\": map[string]interface{}{\"description\": \"The user id\", \"type\": \"string\"}}, \"required\": []string{\"invoiceId\", \"userId\"}, \"title\": \"Invoice Paid Event\", \"type\": \"object\"}},\n    FeatureFlag: \"cool-new-feature\",\n})"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val eventTypeExampleOut = svix.eventType.generate(EventTypeSchemaIn()\n    .schema(\"\"\"{\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n                \"invoiceId\": {\n                        \"description\": \"The invoice id\",\n                        \"type\": \"string\"\n                },\n                \"userId\": {\n                        \"description\": \"The user id\",\n                        \"type\": \"string\"\n                }\n        },\n        \"required\": [\n                \"invoiceId\",\n                \"userId\"\n        ]\n    }\"\"\")\n)"
+                        "source": "val eventTypeOut = svix.eventType.update(\"event_type_name\", EventTypeUpdate()\n    .description(\"A user has signed up\")\n    .archived(false)\n    .schemas(\"\"\"{\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}}\"\"\")\n    .featureFlag(\"cool-new-feature\")\n)"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EventTypeExampleOut eventTypeExampleOut = svix.getEventType().generate(new EventTypeSchemaIn()\n    .schema(\"{\" +\n        \"\\\"title\\\": \\\"Invoice Paid Event\\\",\" +\n        \"\\\"description\\\": \\\"An invoice was paid by a user\\\",\" +\n        \"\\\"type\\\": \\\"object\\\",\" +\n        \"\\\"properties\\\": {\" +\n                \"\\\"invoiceId\\\": {\" +\n                        \"\\\"description\\\": \\\"The invoice id\\\",\" +\n                        \"\\\"type\\\": \\\"string\\\"\" +\n                \"},\" +\n                \"\\\"userId\\\": {\" +\n                        \"\\\"description\\\": \\\"The user id\\\",\" +\n                        \"\\\"type\\\": \\\"string\\\"\" +\n                \"}\" +\n        \"},\" +\n        \"\\\"required\\\": [\" +\n                \"\\\"invoiceId\\\",\" +\n                \"\\\"userId\\\"\" +\n        \"]\" +\n    \"}\")\n)"
+                        "source": "EventTypeOut eventTypeOut = svix.getEventType().update(\"event_type_name\", new EventTypeUpdate()\n    .description(\"A user has signed up\")\n    .archived(false)\n    .schemas(\"{\\\"1\\\":{\\\"description\\\":\\\"An invoice was paid by a user\\\",\\\"properties\\\":{\\\"invoiceId\\\":{\\\"description\\\":\\\"The invoice id\\\",\\\"type\\\":\\\"string\\\"},\\\"userId\\\":{\\\"description\\\":\\\"The user id\\\",\\\"type\\\":\\\"string\\\"}},\\\"required\\\":[\\\"invoiceId\\\",\\\"userId\\\"],\\\"title\\\":\\\"Invoice Paid Event\\\",\\\"type\\\":\\\"object\\\"}}\")\n    .featureFlag(\"cool-new-feature\")\n)"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "event_type_example_out = svix.event_type.generate(Svix::EventTypeSchemaIn.new({\n    \"schema\": {\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n            \"invoiceId\": {\n                \"description\": \"The invoice id\",\n                \"type\": \"string\"\n            },\n            \"userId\": {\n                \"description\": \"The user id\",\n                \"type\": \"string\"\n            }\n        },\n        \"required\": [\n            \"invoiceId\",\n            \"userId\"\n        ]\n    }\n}))"
+                        "source": "event_type_out = svix.event_type.update(\"event_type_name\", Svix::EventTypeUpdate.new({\n    \"description\": \"A user has signed up\",\n    \"archived\": false,\n    \"schemas\": {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    \"feature_flag\": \"cool-new-feature\"\n}))"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let event_type_example_out = svix.event_type().generate(EventTypeSchemaIn {\n    schema: json!({\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n                \"invoiceId\": {\n                        \"description\": \"The invoice id\",\n                        \"type\": \"string\"\n                },\n                \"userId\": {\n                        \"description\": \"The user id\",\n                        \"type\": \"string\"\n                }\n        },\n        \"required\": [\n                \"invoiceId\",\n                \"userId\"\n        ]\n    })\n}).await?;"
+                        "source": "let event_type_out = svix.event_type().update(\"event_type_name\", EventTypeUpdate {\n    description: \"A user has signed up\".to_string(),\n    archived: Some(false),\n    schemas: Some(json!({\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}})),\n    feature_flag: Some(\"cool-new-feature\".to_string()),\n}).await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var eventTypeExampleOut = await svix.EventType.GenerateAsync(new EventTypeSchemaIn{\n    schema: new {\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n                \"invoiceId\": {\n                        \"description\": \"The invoice id\",\n                        \"type\": \"string\"\n                },\n                \"userId\": {\n                        \"description\": \"The user id\",\n                        \"type\": \"string\"\n                }\n        },\n        \"required\": [\n                \"invoiceId\",\n                \"userId\"\n        ]\n    }\n})"
+                        "source": "var eventTypeOut = await svix.EventType.UpdateAsync(\"event_type_name\", new EventTypeUpdate{\n    description: \"A user has signed up\",\n    archived: false,\n    schemas: new {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    featureFlag: \"cool-new-feature\"\n})"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix event-type generate '{\n    \"schema\": {\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n            \"invoiceId\": {\n                \"description\": \"The invoice id\",\n                \"type\": \"string\"\n            },\n            \"userId\": {\n                \"description\": \"The user id\",\n                \"type\": \"string\"\n            }\n        },\n        \"required\": [\n            \"invoiceId\",\n            \"userId\"\n        ]\n    }\n}'"
+                        "source": "svix event-type update \"event_type_name\" '{\n    \"description\": \"A user has signed up\",\n    \"archived\": false,\n    \"schemas\": {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n    \"featureFlag\": \"cool-new-feature\"\n}'"
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'POST' \\\n  'https://api.svix.com/api/v1/event-type/schema/generate-example/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"schema\": {\n        \"title\": \"Invoice Paid Event\",\n        \"description\": \"An invoice was paid by a user\",\n        \"type\": \"object\",\n        \"properties\": {\n            \"invoiceId\": {\n                \"description\": \"The invoice id\",\n                \"type\": \"string\"\n            },\n            \"userId\": {\n                \"description\": \"The user id\",\n                \"type\": \"string\"\n            }\n        },\n        \"required\": [\n            \"invoiceId\",\n            \"userId\"\n        ]\n    }\n}'"
+                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/event-type/{event_type_name}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n        \"description\": \"A user has signed up\",\n        \"archived\": false,\n        \"schemas\": {\"1\":{\"description\":\"An invoice was paid by a user\",\"properties\":{\"invoiceId\":{\"description\":\"The invoice id\",\"type\":\"string\"},\"userId\":{\"description\":\"The user id\",\"type\":\"string\"}},\"required\":[\"invoiceId\",\"userId\"],\"title\":\"Invoice Paid Event\",\"type\":\"object\"}},\n        \"featureFlag\": \"cool-new-feature\"\n    }'"
                     }
                 ]
             }
         },
-        "/api/v1/event-type/{event_type_name}/": {
-            "delete": {
-                "description": "Archive an event type.\n\nEndpoints already configured to filter on an event type will continue to do so after archival.\nHowever, new messages can not be sent with it and endpoints can not filter on it.\nAn event type can be unarchived with the\n[create operation](#operation/create_event_type_api_v1_event_type__post).\n\nIf `expunge=true` is set then the event type is deleted instead of archived.\nThis can only be used in development environments.",
-                "operationId": "delete_event_type_api_v1_event_type__event_type_name___delete",
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "event_type_name",
-                        "required": true,
-                        "schema": {
-                            "example": "user.signup",
-                            "maxLength": 256,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Event Type Name",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "in": "query",
-                        "name": "expunge",
-                        "required": false,
-                        "schema": {
-                            "default": false,
-                            "title": "Expunge",
-                            "type": "boolean"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
-                            "type": "string"
-                        }
-                    }
-                ],
+        "/api/v1/health/": {
+            "get": {
+                "description": "Verify the API server is up and running.",
+                "operationId": "v1.health.get",
                 "responses": {
                     "204": {
-                        "description": "Successful Response"
+                        "description": "no content"
                     },
                     "401": {
                         "content": {
@@ -13713,117 +15159,109 @@
                         "description": "Too Many Requests"
                     }
                 },
-                "security": [
-                    {
-                        "HTTPBearer": []
-                    }
-                ],
-                "summary": "Archive Event Type",
+                "summary": "Health",
                 "tags": [
-                    "Event Type"
+                    "Health"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "await svix.eventType.delete('event_type_name');"
+                        "source": "await svix.health.get();"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "await svix.eventType.delete('event_type_name');"
+                        "source": "await svix.health.get();"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "svix.event_type.delete('event_type_name')"
+                        "source": "svix.health.get()"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "await svix.event_type.delete('event_type_name')"
+                        "source": "await svix.health.get()"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "err := svixClient.EventType.Delete(\"event_type_name\")"
+                        "source": "err := svixClient.Health.Get(ctx)"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "svix.eventType.delete('event_type_name')"
+                        "source": "svix.health.get()"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "svix.getEventType().delete('event_type_name')"
+                        "source": "svix.getHealth().get()"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "svix.event_type.delete('event_type_name')"
+                        "source": "svix.health.get()"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "svix.event_type().delete(\"event_type_name\").await?;"
+                        "source": "svix.health().get().await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "await svix.EventType.DeleteAsync(\"event_type_name\")"
+                        "source": "await svix.Health.GetAsync()"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix event-type delete 'event_type_name'"
+                        "source": "svix health get "
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'DELETE' \\\n  'https://api.svix.com/api/v1/event-type/{event_type_name}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/health/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
-            },
-            "get": {
-                "description": "Get an event type.",
-                "operationId": "get_event_type_api_v1_event_type__event_type_name___get",
+            }
+        },
+        "/api/v1/msg/broadcast/": {
+            "post": {
+                "description": "Creates a background task to send the same message to each application in your organization",
+                "operationId": "create_broadcast_message",
                 "parameters": [
-                    {
-                        "in": "path",
-                        "name": "event_type_name",
-                        "required": true,
-                        "schema": {
-                            "example": "user.signup",
-                            "maxLength": 256,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Event Type Name",
-                            "type": "string"
-                        }
-                    },
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/MessageBroadcastIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
-                    "200": {
+                    "202": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EventTypeOut"
+                                    "$ref": "#/components/schemas/MessageBroadcastOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -13891,132 +15329,63 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Event Type",
+                "summary": "Create Broadcast Message",
                 "tags": [
-                    "Event Type"
-                ],
-                "x-codeSamples": [
-                    {
-                        "label": "JavaScript",
-                        "lang": "JavaScript",
-                        "source": "const eventTypeOut = await svix.eventType.get('event_type_name');"
-                    },
-                    {
-                        "label": "TypeScript",
-                        "lang": "JavaScript",
-                        "source": "const eventTypeOut = await svix.eventType.get('event_type_name');"
-                    },
-                    {
-                        "label": "Python",
-                        "lang": "Python",
-                        "source": "event_type_out = svix.event_type.get('event_type_name')"
-                    },
-                    {
-                        "label": "Python (Async)",
-                        "lang": "Python",
-                        "source": "event_type_out = await svix.event_type.get('event_type_name')"
-                    },
-                    {
-                        "label": "Go",
-                        "lang": "Go",
-                        "source": "eventTypeOut, err := svixClient.EventType.Get(\"event_type_name\")"
-                    },
-                    {
-                        "label": "Kotlin",
-                        "lang": "Kotlin",
-                        "source": "val eventTypeOut = svix.eventType.get('event_type_name')"
-                    },
-                    {
-                        "label": "Java",
-                        "lang": "Java",
-                        "source": "EventTypeOut eventTypeOut = svix.getEventType().get('event_type_name')"
-                    },
-                    {
-                        "label": "Ruby",
-                        "lang": "Ruby",
-                        "source": "event_type_out = svix.event_type.get('event_type_name')"
-                    },
-                    {
-                        "label": "Rust",
-                        "lang": "Rust",
-                        "source": "let event_type_out = svix.event_type().get(\"event_type_name\").await?;"
-                    },
+                    "Broadcast"
+                ]
+            }
+        },
+        "/api/v1/stats/app/{app_id}/attempt/": {
+            "get": {
+                "description": "Returns application-level statistics on message attempts",
+                "operationId": "v1.stats.app-attempts",
+                "parameters": [
                     {
-                        "label": "C#",
-                        "lang": "C#",
-                        "source": "var eventTypeOut = await svix.EventType.GetAsync(\"event_type_name\")"
+                        "in": "query",
+                        "name": "startDate",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
-                        "label": "CLI",
-                        "lang": "Shell",
-                        "source": "svix event-type get 'event_type_name'"
+                        "in": "query",
+                        "name": "endDate",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
                     },
                     {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/event-type/{event_type_name}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
-                    }
-                ]
-            },
-            "put": {
-                "description": "Update an event type.",
-                "operationId": "update_event_type_api_v1_event_type__event_type_name___put",
-                "parameters": [
-                    {
+                        "description": "The app's ID or UID",
                         "in": "path",
-                        "name": "event_type_name",
+                        "name": "app_id",
                         "required": true,
                         "schema": {
-                            "example": "user.signup",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
                             "maxLength": 256,
+                            "minLength": 1,
                             "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Event Type Name",
-                            "type": "string"
-                        }
-                    },
-                    {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
-                        "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
-                "requestBody": {
-                    "content": {
-                        "application/json": {
-                            "schema": {
-                                "$ref": "#/components/schemas/EventTypeUpdate"
-                            }
-                        }
-                    },
-                    "required": true
-                },
                 "responses": {
                     "200": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/EventTypeOut"
-                                }
-                            }
-                        },
-                        "description": "Successful Response"
-                    },
-                    "201": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/EventTypeOut"
+                                    "$ref": "#/components/schemas/AttemptStatisticsResponse"
                                 }
                             }
                         },
-                        "description": "Created"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -14084,172 +15453,128 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Update Event Type",
+                "summary": "Get App Attempt Stats",
                 "tags": [
-                    "Event Type"
+                    "Statistics"
                 ],
                 "x-codeSamples": [
                     {
                         "label": "JavaScript",
                         "lang": "JavaScript",
-                        "source": "const eventTypeOut = await svix.eventType.update('event_type_name', {\n    description: \"A user has signed up\",\n    schemas: {\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    archived: false,\n    featureFlag: \"cool-new-feature\"\n});"
+                        "source": "const attemptStatisticsResponse = await svix.stats.appAttempts(\"app_id\");"
                     },
                     {
                         "label": "TypeScript",
                         "lang": "JavaScript",
-                        "source": "const eventTypeOut = await svix.eventType.update('event_type_name', {\n    description: \"A user has signed up\",\n    schemas: {\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    archived: false,\n    featureFlag: \"cool-new-feature\"\n});"
+                        "source": "const attemptStatisticsResponse = await svix.stats.appAttempts(\"app_id\");"
                     },
                     {
                         "label": "Python",
                         "lang": "Python",
-                        "source": "event_type_out = svix.event_type.update('event_type_name', EventTypeUpdate(\n    description=\"A user has signed up\",\n    schemas={'1': {'title': 'Invoice Paid Event', 'description': 'An invoice was paid by a user', 'type': 'object', 'properties': {'invoiceId': {'description': 'The invoice id', 'type': 'string'}, 'userId': {'description': 'The user id', 'type': 'string'}}, 'required': ['invoiceId', 'userId']}},\n    archived=False,\n    feature_flag=\"cool-new-feature\"\n))"
+                        "source": "attempt_statistics_response = svix.stats.app_attempts(\"app_id\")"
                     },
                     {
                         "label": "Python (Async)",
                         "lang": "Python",
-                        "source": "event_type_out = await svix.event_type.update('event_type_name', EventTypeUpdate(\n    description=\"A user has signed up\",\n    schemas={'1': {'title': 'Invoice Paid Event', 'description': 'An invoice was paid by a user', 'type': 'object', 'properties': {'invoiceId': {'description': 'The invoice id', 'type': 'string'}, 'userId': {'description': 'The user id', 'type': 'string'}}, 'required': ['invoiceId', 'userId']}},\n    archived=False,\n    feature_flag=\"cool-new-feature\"\n))"
+                        "source": "attempt_statistics_response = await svix.stats.app_attempts(\"app_id\")"
                     },
                     {
                         "label": "Go",
                         "lang": "Go",
-                        "source": "eventTypeOut, err := svixClient.EventType.Update(\"event_type_name\", &svix.EventTypeUpdate{\n    Description: \"A user has signed up\",\n    Schemas: map[string]interface{}{\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    Archived: False,\n    FeatureFlag: \"cool-new-feature\"\n})"
+                        "source": "attemptStatisticsResponse, err := svixClient.Stats.AppAttempts(ctx, \"app_id\")"
                     },
                     {
                         "label": "Kotlin",
                         "lang": "Kotlin",
-                        "source": "val eventTypeOut = svix.eventType.update('event_type_name', EventTypeUpdate()\n    .description(\"A user has signed up\"),\n    .schemas(\"\"\"{\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    }\"\"\"),\n    .archived(False),\n    .featureFlag(\"cool-new-feature\")\n)"
+                        "source": "val attemptStatisticsResponse = svix.stats.appAttempts(\"app_id\")"
                     },
                     {
                         "label": "Java",
                         "lang": "Java",
-                        "source": "EventTypeOut eventTypeOut = svix.getEventType().update('event_type_name', new EventTypeUpdate()\n    .description(\"A user has signed up\"),\n    .schemas(\"{\" +\n        \"\\\"1\\\": {\" +\n                \"\\\"title\\\": \\\"Invoice Paid Event\\\",\" +\n                \"\\\"description\\\": \\\"An invoice was paid by a user\\\",\" +\n                \"\\\"type\\\": \\\"object\\\",\" +\n                \"\\\"properties\\\": {\" +\n                        \"\\\"invoiceId\\\": {\" +\n                                \"\\\"description\\\": \\\"The invoice id\\\",\" +\n                                \"\\\"type\\\": \\\"string\\\"\" +\n                        \"},\" +\n                        \"\\\"userId\\\": {\" +\n                                \"\\\"description\\\": \\\"The user id\\\",\" +\n                                \"\\\"type\\\": \\\"string\\\"\" +\n                        \"}\" +\n                \"},\" +\n                \"\\\"required\\\": [\" +\n                        \"\\\"invoiceId\\\",\" +\n                        \"\\\"userId\\\"\" +\n                \"]\" +\n        \"}\" +\n    \"}\"),\n    .archived(False),\n    .featureFlag(\"cool-new-feature\")\n)"
+                        "source": "AttemptStatisticsResponse attemptStatisticsResponse = svix.getStats().appAttempts(\"app_id\")"
                     },
                     {
                         "label": "Ruby",
                         "lang": "Ruby",
-                        "source": "event_type_out = svix.event_type.update('event_type_name', Svix::EventTypeUpdate.new({\n    \"description\": \"A user has signed up\",\n    \"schemas\": {\n        \"1\": {\n            \"title\": \"Invoice Paid Event\",\n            \"description\": \"An invoice was paid by a user\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"invoiceId\": {\n                    \"description\": \"The invoice id\",\n                    \"type\": \"string\"\n                },\n                \"userId\": {\n                    \"description\": \"The user id\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"invoiceId\",\n                \"userId\"\n            ]\n        }\n    },\n    \"archived\": false,\n    \"feature_flag\": \"cool-new-feature\"\n}))"
+                        "source": "attempt_statistics_response = svix.stats.app_attempts(\"app_id\")"
                     },
                     {
                         "label": "Rust",
                         "lang": "Rust",
-                        "source": "let event_type_out = svix.event_type().update(\"event_type_name\", EventTypeUpdate {\n    description: \"A user has signed up\".to_string(),\n    schemas: Some(json!({\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    })),\n    archived: Some(False),\n    feature_flag: Some(\"cool-new-feature\".to_string())\n}, None).await?;"
+                        "source": "let attempt_statistics_response = svix.stats().app_attempts(\"app_id\").await?;"
                     },
                     {
                         "label": "C#",
                         "lang": "C#",
-                        "source": "var eventTypeOut = await svix.EventType.UpdateAsync(\"event_type_name\", new EventTypeUpdate{\n    description: \"A user has signed up\",\n    schemas: new {\n        \"1\": {\n                \"title\": \"Invoice Paid Event\",\n                \"description\": \"An invoice was paid by a user\",\n                \"type\": \"object\",\n                \"properties\": {\n                        \"invoiceId\": {\n                                \"description\": \"The invoice id\",\n                                \"type\": \"string\"\n                        },\n                        \"userId\": {\n                                \"description\": \"The user id\",\n                                \"type\": \"string\"\n                        }\n                },\n                \"required\": [\n                        \"invoiceId\",\n                        \"userId\"\n                ]\n        }\n    },\n    archived: false,\n    featureFlag: \"cool-new-feature\"\n})"
+                        "source": "var attemptStatisticsResponse = await svix.Stats.AppAttemptsAsync(\"app_id\")"
                     },
                     {
                         "label": "CLI",
                         "lang": "Shell",
-                        "source": "svix event-type update 'event_type_name' '{\n    \"description\": \"A user has signed up\",\n    \"schemas\": {\n        \"1\": {\n            \"title\": \"Invoice Paid Event\",\n            \"description\": \"An invoice was paid by a user\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"invoiceId\": {\n                    \"description\": \"The invoice id\",\n                    \"type\": \"string\"\n                },\n                \"userId\": {\n                    \"description\": \"The user id\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"invoiceId\",\n                \"userId\"\n            ]\n        }\n    },\n    \"archived\": false,\n    \"featureFlag\": \"cool-new-feature\"\n}'"
+                        "source": "svix stats app-attempts \"app_id\""
                     },
                     {
                         "label": "cURL",
                         "lang": "Shell",
-                        "source": "curl -X 'PUT' \\\n  'https://api.svix.com/api/v1/event-type/{event_type_name}/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"description\": \"A user has signed up\",\n    \"schemas\": {\n        \"1\": {\n            \"title\": \"Invoice Paid Event\",\n            \"description\": \"An invoice was paid by a user\",\n            \"type\": \"object\",\n            \"properties\": {\n                \"invoiceId\": {\n                    \"description\": \"The invoice id\",\n                    \"type\": \"string\"\n                },\n                \"userId\": {\n                    \"description\": \"The user id\",\n                    \"type\": \"string\"\n                }\n            },\n            \"required\": [\n                \"invoiceId\",\n                \"userId\"\n            ]\n        }\n    },\n    \"archived\": false,\n    \"featureFlag\": \"cool-new-feature\"\n}'"
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/stats/app/{app_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
                     }
                 ]
             }
         },
-        "/api/v1/health/": {
+        "/api/v1/stats/app/{app_id}/ep/{endpoint_id}/attempt/": {
             "get": {
-                "description": "Verify the API server is up and running.",
-                "operationId": "health_api_v1_health__get",
+                "description": "Returns endpoint-level statistics on message attempts",
+                "operationId": "v1.stats.endpoint-attempts",
                 "parameters": [
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "in": "query",
+                        "name": "startDate",
                         "schema": {
-                            "description": "The request's idempotency key",
+                            "format": "date-time",
                             "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
-                    }
-                ],
-                "responses": {
-                    "204": {
-                        "description": "Successful Response"
-                    },
-                    "422": {
-                        "content": {
-                            "application/json": {
-                                "schema": {
-                                    "$ref": "#/components/schemas/HTTPValidationError"
-                                }
-                            }
                         },
-                        "description": "Validation Error"
-                    }
-                },
-                "summary": "Health",
-                "tags": [
-                    "Health"
-                ],
-                "x-codeSamples": [
-                    {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/health/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
-                    }
-                ]
-            }
-        },
-        "/api/v1/stats/app/{app_id}/attempt/": {
-            "get": {
-                "description": "Returns application-level statistics on message attempts",
-                "operationId": "get_app_attempt_stats_api_v1_stats_app__app_id__attempt__get",
-                "parameters": [
-                    {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
+                        "style": "form"
                     },
                     {
                         "in": "query",
-                        "name": "startDate",
-                        "required": false,
+                        "name": "endDate",
                         "schema": {
                             "format": "date-time",
                             "nullable": true,
-                            "title": "Startdate",
                             "type": "string"
-                        }
+                        },
+                        "style": "form"
                     },
                     {
-                        "in": "query",
-                        "name": "endDate",
-                        "required": false,
+                        "description": "The app's ID or UID",
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
                         "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "Enddate",
+                            "description": "The app's ID or UID",
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     },
                     {
-                        "description": "The request's idempotency key",
-                        "in": "header",
-                        "name": "idempotency-key",
-                        "required": false,
+                        "description": "The ep's ID or UID",
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
+                            "description": "The ep's ID or UID",
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
                 "responses": {
@@ -14261,7 +15586,7 @@
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -14329,97 +15654,109 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get App Attempt Stats",
+                "summary": "Get Ep Stats",
                 "tags": [
                     "Statistics"
                 ],
                 "x-codeSamples": [
                     {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/stats/app/{app_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
-                    }
-                ]
-            }
-        },
-        "/api/v1/stats/app/{app_id}/ep/{endpoint_id}/attempt/": {
-            "get": {
-                "description": "Returns endpoint-level statistics on message attempts",
-                "operationId": "get_ep_stats_api_v1_stats_app__app_id__ep__endpoint_id__attempt__get",
-                "parameters": [
+                        "label": "JavaScript",
+                        "lang": "JavaScript",
+                        "source": "const attemptStatisticsResponse = await svix.stats.endpointAttempts(\"app_id\", \"endpoint_id\");"
+                    },
                     {
-                        "in": "path",
-                        "name": "endpoint_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The endpoint's ID or UID",
-                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "Endpoint Id",
-                            "type": "string"
-                        }
+                        "label": "TypeScript",
+                        "lang": "JavaScript",
+                        "source": "const attemptStatisticsResponse = await svix.stats.endpointAttempts(\"app_id\", \"endpoint_id\");"
                     },
                     {
-                        "in": "path",
-                        "name": "app_id",
-                        "required": true,
-                        "schema": {
-                            "description": "The application's ID or UID",
-                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
-                            "maxLength": 256,
-                            "minLength": 1,
-                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
-                            "title": "App Id",
-                            "type": "string"
-                        }
+                        "label": "Python",
+                        "lang": "Python",
+                        "source": "attempt_statistics_response = svix.stats.endpoint_attempts(\"app_id\", \"endpoint_id\")"
                     },
                     {
-                        "in": "query",
-                        "name": "startDate",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "Startdate",
-                            "type": "string"
-                        }
+                        "label": "Python (Async)",
+                        "lang": "Python",
+                        "source": "attempt_statistics_response = await svix.stats.endpoint_attempts(\"app_id\", \"endpoint_id\")"
                     },
                     {
-                        "in": "query",
-                        "name": "endDate",
-                        "required": false,
-                        "schema": {
-                            "format": "date-time",
-                            "nullable": true,
-                            "title": "Enddate",
-                            "type": "string"
-                        }
+                        "label": "Go",
+                        "lang": "Go",
+                        "source": "attemptStatisticsResponse, err := svixClient.Stats.EndpointAttempts(ctx, \"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Kotlin",
+                        "lang": "Kotlin",
+                        "source": "val attemptStatisticsResponse = svix.stats.endpointAttempts(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Java",
+                        "lang": "Java",
+                        "source": "AttemptStatisticsResponse attemptStatisticsResponse = svix.getStats().endpointAttempts(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Ruby",
+                        "lang": "Ruby",
+                        "source": "attempt_statistics_response = svix.stats.endpoint_attempts(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "Rust",
+                        "lang": "Rust",
+                        "source": "let attempt_statistics_response = svix.stats().endpoint_attempts(\"app_id\", \"endpoint_id\").await?;"
+                    },
+                    {
+                        "label": "C#",
+                        "lang": "C#",
+                        "source": "var attemptStatisticsResponse = await svix.Stats.EndpointAttemptsAsync(\"app_id\", \"endpoint_id\")"
+                    },
+                    {
+                        "label": "CLI",
+                        "lang": "Shell",
+                        "source": "svix stats endpoint-attempts \"app_id\" \"endpoint_id\""
                     },
+                    {
+                        "label": "cURL",
+                        "lang": "Shell",
+                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/stats/app/{app_id}/ep/{endpoint_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'Accept: application/json' \\\n  -H 'Content-Type: application/json'"
+                    }
+                ]
+            }
+        },
+        "/api/v1/stats/usage/app/": {
+            "post": {
+                "description": "Creates a background task to calculate the message destinations for all applications in the environment.",
+                "operationId": "calculate_aggregate_app_stats",
+                "parameters": [
                     {
                         "description": "The request's idempotency key",
                         "in": "header",
                         "name": "idempotency-key",
-                        "required": false,
                         "schema": {
-                            "description": "The request's idempotency key",
-                            "nullable": true,
-                            "title": "Idempotency-Key",
                             "type": "string"
-                        }
+                        },
+                        "style": "simple"
                     }
                 ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/AppUsageStatsIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
                 "responses": {
-                    "200": {
+                    "202": {
                         "content": {
                             "application/json": {
                                 "schema": {
-                                    "$ref": "#/components/schemas/AttemptStatisticsResponse"
+                                    "$ref": "#/components/schemas/AppUsageStatsOut"
                                 }
                             }
                         },
-                        "description": "Successful Response"
+                        "description": ""
                     },
                     "401": {
                         "content": {
@@ -14487,16 +15824,9 @@
                         "HTTPBearer": []
                     }
                 ],
-                "summary": "Get Ep Stats",
+                "summary": "Calculate Aggregate App Stats",
                 "tags": [
                     "Statistics"
-                ],
-                "x-codeSamples": [
-                    {
-                        "label": "cURL",
-                        "lang": "Shell",
-                        "source": "curl -X 'GET' \\\n  'https://api.svix.com/api/v1/stats/app/{app_id}/ep/{endpoint_id}/attempt/' \\\n  -H 'Authorization: Bearer AUTH_TOKEN' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json'"
-                    }
                 ]
             }
         }
@@ -14519,7 +15849,7 @@
             "name": "Endpoint"
         },
         {
-            "description": "Integrations are services your users connect an application to. An integration can manage the application and it's endpoints.",
+            "description": "Integrations are services your users connect an application to. An integration can manage the application and its endpoints.",
             "name": "Integration"
         },
         {
@@ -14537,6 +15867,10 @@
         {
             "description": "The webhooks the Svix service sends to notify you of events.",
             "name": "Webhooks"
+        },
+        {
+            "description": "The background tasks that have been executed for your environment.",
+            "name": "Background Tasks"
         }
     ],
     "x-tagGroups": [
@@ -14544,7 +15878,8 @@
             "name": "General",
             "tags": [
                 "Application",
-                "Event Type"
+                "Event Type",
+                "Background Tasks"
             ]
         },
         {
@@ -14716,4 +16051,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/package.json b/package.json
index c48be223d..2d4a3d318 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
     "generate": "bash ./regen_openapi.sh"
   },
   "devDependencies": {
-    "@openapitools/openapi-generator-cli": "^2.4.18",
+    "@openapitools/openapi-generator-cli": "^2.6.0",
     "axios": "^0.26.1",
     "openapi-to-postmanv2": "^3.1.0",
     "semver": "^7.3.5"
diff --git a/python/requirements-dev.txt b/python/requirements-dev.txt
index b77ef55c5..8697f0fee 100644
--- a/python/requirements-dev.txt
+++ b/python/requirements-dev.txt
@@ -1,13 +1,11 @@
 #
-# This file is autogenerated by pip-compile with python 3.10
-# To update, run:
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
 #
 #    pip-compile --output-file=requirements-dev.txt requirements.in/development.txt
 #
 anyio==3.5.0
     # via httpcore
-appdirs==1.4.4
-    # via black
 attrs==21.4.0
     # via
     #   openapi-python-client
@@ -16,11 +14,13 @@ autoflake==1.4
     # via
     #   -r requirements.in/development.txt
     #   openapi-python-client
-black==21.5b1
+black==23.3.0
     # via
     #   -r requirements.in/development.txt
     #   openapi-python-client
-certifi==2021.10.8
+build==0.10.0
+    # via pip-tools
+certifi==2023.5.7
     # via
     #   httpcore
     #   httpx
@@ -68,18 +68,21 @@ mypy-extensions==0.4.3
     # via
     #   black
     #   mypy
-openapi-python-client==0.11.4
+openapi-python-client==0.14.0
     # via -r requirements.in/development.txt
-packaging==20.9
-    # via pytest
-pathspec==0.8.1
+packaging==23.1
+    # via
+    #   black
+    #   build
+    #   pytest
+pathspec==0.11.1
     # via black
-pep517==0.10.0
-    # via pip-tools
 pep8-naming==0.11.1
     # via -r requirements.in/development.txt
-pip-tools==6.1.0
+pip-tools==6.13.0
     # via -r requirements.in/development.txt
+platformdirs==3.5.1
+    # via black
 pluggy==0.13.1
     # via pytest
 py==1.10.0
@@ -94,16 +97,14 @@ pyflakes==2.3.1
     # via
     #   autoflake
     #   flake8
-pyparsing==2.4.7
-    # via packaging
+pyproject-hooks==1.0.0
+    # via build
 pytest==6.2.4
     # via -r requirements.in/development.txt
 python-dateutil==2.8.2
     # via openapi-python-client
 pyyaml==6.0
     # via openapi-python-client
-regex==2021.4.4
-    # via black
 rfc3986[idna2008]==1.5.0
     # via httpx
 shellingham==1.4.0
@@ -118,18 +119,22 @@ sniffio==1.2.0
     #   httpcore
     #   httpx
 toml==0.10.2
+    # via pytest
+tomli==2.0.0
     # via
     #   black
-    #   pep517
-    #   pytest
-tomli==2.0.0
-    # via mypy
-typer==0.4.0
+    #   build
+    #   mypy
+    #   pyproject-hooks
+typer==0.7.0
     # via openapi-python-client
 typing-extensions==3.10.0.0
     # via
     #   mypy
     #   pydantic
+wheel==0.40.0
+    # via pip-tools
 
 # The following packages are considered to be unsafe in a requirements file:
 # pip
+# setuptools
diff --git a/python/requirements.in/development.txt b/python/requirements.in/development.txt
index 1633806a6..f0efde6bb 100644
--- a/python/requirements.in/development.txt
+++ b/python/requirements.in/development.txt
@@ -5,7 +5,7 @@ flake8
 flake8-print
 pep8-naming
 mypy
-pip-tools
+pip-tools>=6.13.0
 pytest
 httpx>=0.23.0
-openapi-python-client>=0.11.4
+openapi-python-client>=0.14.0
diff --git a/python/svix/__init__.py b/python/svix/__init__.py
index f5c4c2328..733a22db4 100644
--- a/python/svix/__init__.py
+++ b/python/svix/__init__.py
@@ -37,4 +37,4 @@
     "WebhookVerificationError",
 ]
 
-__version__ = "0.81.0"
+__version__ = "1.4.12"
diff --git a/python/svix/api.py b/python/svix/api.py
index 3d0d09640..1e477210e 100644
--- a/python/svix/api.py
+++ b/python/svix/api.py
@@ -5,71 +5,76 @@
 from deprecated import deprecated
 
 from .internal.openapi_client.api.application import (
-    create_application_api_v1_app_post,
-    delete_application_api_v1_app_app_id_delete,
-    get_application_api_v1_app_app_id_get,
-    list_applications_api_v1_app_get,
-    update_application_api_v1_app_app_id_put,
+    v1_application_create,
+    v1_application_delete,
+    v1_application_get,
+    v1_application_list,
+    v1_application_update,
 )
 from .internal.openapi_client.api.authentication import (
-    get_app_portal_access_api_v1_auth_app_portal_access_app_id_post,
-    get_dashboard_access_api_v1_auth_dashboard_access_app_id_post,
-    logout_api_v1_auth_logout_post,
+    v1_authentication_app_portal_access,
+    v1_authentication_dashboard_access,
+    v1_authentication_logout,
 )
+from .internal.openapi_client.api.background_tasks import get_background_task, list_background_tasks
 from .internal.openapi_client.api.endpoint import (
-    create_endpoint_api_v1_app_app_id_endpoint_post,
-    delete_endpoint_api_v1_app_app_id_endpoint_endpoint_id_delete,
-    get_endpoint_api_v1_app_app_id_endpoint_endpoint_id_get,
-    get_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_get,
-    get_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_get,
-    get_endpoint_stats_api_v1_app_app_id_endpoint_endpoint_id_stats_get,
-    get_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_get,
-    list_endpoints_api_v1_app_app_id_endpoint_get,
-    patch_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_patch,
-    recover_failed_webhooks_api_v1_app_app_id_endpoint_endpoint_id_recover_post,
-    replay_missing_webhooks_api_v1_app_app_id_endpoint_endpoint_id_replay_missing_post,
-    rotate_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_rotate_post,
-    set_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_patch,
-    update_endpoint_api_v1_app_app_id_endpoint_endpoint_id_put,
-    update_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_put,
+    v1_endpoint_create,
+    v1_endpoint_delete,
+    v1_endpoint_get,
+    v1_endpoint_get_headers,
+    v1_endpoint_get_secret,
+    v1_endpoint_get_stats,
+    v1_endpoint_list,
+    v1_endpoint_patch_headers,
+    v1_endpoint_recover,
+    v1_endpoint_replay,
+    v1_endpoint_rotate_secret,
+    v1_endpoint_send_example,
+    v1_endpoint_transformation_get,
+    v1_endpoint_transformation_partial_update,
+    v1_endpoint_update,
+    v1_endpoint_update_headers,
 )
 from .internal.openapi_client.api.event_type import (
-    create_event_type_api_v1_event_type_post,
-    delete_event_type_api_v1_event_type_event_type_name_delete,
-    get_event_type_api_v1_event_type_event_type_name_get,
-    list_event_types_api_v1_event_type_get,
-    update_event_type_api_v1_event_type_event_type_name_put,
+    v1_event_type_create,
+    v1_event_type_delete,
+    v1_event_type_get,
+    v1_event_type_list,
+    v1_event_type_update,
 )
 from .internal.openapi_client.api.integration import (
-    create_integration_api_v1_app_app_id_integration_post,
-    delete_integration_api_v1_app_app_id_integration_integ_id_delete,
-    get_integration_api_v1_app_app_id_integration_integ_id_get,
-    get_integration_key_api_v1_app_app_id_integration_integ_id_key_get,
-    list_integrations_api_v1_app_app_id_integration_get,
-    rotate_integration_key_api_v1_app_app_id_integration_integ_id_key_rotate_post,
-    update_integration_api_v1_app_app_id_integration_integ_id_put,
+    v1_integration_create,
+    v1_integration_delete,
+    v1_integration_get,
+    v1_integration_get_key,
+    v1_integration_list,
+    v1_integration_rotate_key,
+    v1_integration_update,
 )
 from .internal.openapi_client.api.message import (
-    create_message_api_v1_app_app_id_msg_post,
-    expunge_message_payload_api_v1_app_app_id_msg_msg_id_content_delete,
-    get_message_api_v1_app_app_id_msg_msg_id_get,
-    list_messages_api_v1_app_app_id_msg_get,
+    v1_message_create,
+    v1_message_expunge_content,
+    v1_message_get,
+    v1_message_list,
 )
 from .internal.openapi_client.api.message_attempt import (
-    expunge_attempt_content_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_content_delete,
-    get_attempt_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_get,
-    list_attempted_destinations_api_v1_app_app_id_msg_msg_id_endpoint_get,
-    list_attempted_messages_api_v1_app_app_id_endpoint_endpoint_id_msg_get,
-    list_attempts_by_endpoint_api_v1_app_app_id_attempt_endpoint_endpoint_id_get,
-    list_attempts_by_msg_api_v1_app_app_id_attempt_msg_msg_id_get,
-    list_attempts_for_endpoint_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_attempt_get,
-    resend_webhook_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_resend_post,
+    v1_message_attempt_expunge_content,
+    v1_message_attempt_get,
+    v1_message_attempt_list_attempted_destinations,
+    v1_message_attempt_list_attempted_messages,
+    v1_message_attempt_list_by_endpoint,
+    v1_message_attempt_list_by_endpoint_deprecated,
+    v1_message_attempt_list_by_msg,
+    v1_message_attempt_resend,
 )
 from .internal.openapi_client.client import AuthenticatedClient
 from .internal.openapi_client.models.app_portal_access_in import AppPortalAccessIn
 from .internal.openapi_client.models.app_portal_access_out import AppPortalAccessOut
 from .internal.openapi_client.models.application_in import ApplicationIn
 from .internal.openapi_client.models.application_out import ApplicationOut
+from .internal.openapi_client.models.background_task_out import BackgroundTaskOut
+from .internal.openapi_client.models.background_task_status import BackgroundTaskStatus
+from .internal.openapi_client.models.background_task_type import BackgroundTaskType
 from .internal.openapi_client.models.dashboard_access_out import DashboardAccessOut
 from .internal.openapi_client.models.endpoint_headers_in import EndpointHeadersIn
 from .internal.openapi_client.models.endpoint_headers_out import EndpointHeadersOut
@@ -83,6 +88,7 @@
 from .internal.openapi_client.models.endpoint_transformation_in import EndpointTransformationIn
 from .internal.openapi_client.models.endpoint_transformation_out import EndpointTransformationOut
 from .internal.openapi_client.models.endpoint_update import EndpointUpdate
+from .internal.openapi_client.models.event_example_in import EventExampleIn
 from .internal.openapi_client.models.event_type_in import EventTypeIn
 from .internal.openapi_client.models.event_type_out import EventTypeOut
 from .internal.openapi_client.models.event_type_update import EventTypeUpdate
@@ -91,6 +97,7 @@
 from .internal.openapi_client.models.integration_out import IntegrationOut
 from .internal.openapi_client.models.integration_update import IntegrationUpdate
 from .internal.openapi_client.models.list_response_application_out import ListResponseApplicationOut
+from .internal.openapi_client.models.list_response_background_task_out import ListResponseBackgroundTaskOut
 from .internal.openapi_client.models.list_response_endpoint_message_out import ListResponseEndpointMessageOut
 from .internal.openapi_client.models.list_response_endpoint_out import ListResponseEndpointOut
 from .internal.openapi_client.models.list_response_event_type_out import ListResponseEventTypeOut
@@ -164,11 +171,22 @@ class EndpointListOptions(ListOptions):
     order: t.Optional[Ordering] = None
 
 
+@dataclass
+class EndpointStatsOptions:
+    since: t.Optional[datetime] = None
+    until: t.Optional[datetime] = None
+
+
 @dataclass
 class IntegrationListOptions(ListOptions):
     pass
 
 
+class BackgroundTaskListOptions(ListOptions):
+    status: t.Optional[BackgroundTaskStatus] = None
+    task: t.Optional[BackgroundTaskType] = None
+
+
 @dataclass
 class MessageAttemptListOptions(ListOptions):
     status: t.Optional[MessageStatus] = None
@@ -190,100 +208,88 @@ class AuthenticationAsync(ApiBase):
     async def app_portal_access(
         self, app_id: str, app_portal_access_in: AppPortalAccessIn, options: PostOptions = PostOptions()
     ) -> AppPortalAccessOut:
-        return await get_app_portal_access_api_v1_auth_app_portal_access_app_id_post.asyncio(
+        return await v1_authentication_app_portal_access.asyncio(
             client=self._client, app_id=app_id, json_body=app_portal_access_in, **options.to_dict()
         )
 
     async def dashboard_access(self, app_id: str, options: PostOptions = PostOptions()) -> DashboardAccessOut:
-        return await get_dashboard_access_api_v1_auth_dashboard_access_app_id_post.asyncio(
-            client=self._client, app_id=app_id, **options.to_dict()
-        )
+        return await v1_authentication_dashboard_access.asyncio(client=self._client, app_id=app_id, **options.to_dict())
 
     async def logout(self, options: PostOptions = PostOptions()) -> None:
-        return await logout_api_v1_auth_logout_post.asyncio(client=self._client, **options.to_dict())
+        return await v1_authentication_logout.asyncio(client=self._client, **options.to_dict())
 
 
 class Authentication(ApiBase):
     def app_portal_access(
         self, app_id: str, app_portal_access_in: AppPortalAccessIn, options: PostOptions = PostOptions()
     ) -> AppPortalAccessOut:
-        return get_app_portal_access_api_v1_auth_app_portal_access_app_id_post.sync(
+        return v1_authentication_app_portal_access.sync(
             client=self._client, app_id=app_id, json_body=app_portal_access_in, **options.to_dict()
         )
 
     def dashboard_access(self, app_id: str, options: PostOptions = PostOptions()) -> DashboardAccessOut:
-        return get_dashboard_access_api_v1_auth_dashboard_access_app_id_post.sync(
-            client=self._client, app_id=app_id, **options.to_dict()
-        )
+        return v1_authentication_dashboard_access.sync(client=self._client, app_id=app_id, **options.to_dict())
 
     def logout(self, options: PostOptions = PostOptions()) -> None:
-        return logout_api_v1_auth_logout_post.sync(client=self._client, **options.to_dict())
+        return v1_authentication_logout.sync(client=self._client, **options.to_dict())
 
 
 class ApplicationAsync(ApiBase):
     async def list(self, options: ApplicationListOptions = ApplicationListOptions()) -> ListResponseApplicationOut:
-        return await list_applications_api_v1_app_get.asyncio(client=self._client, **options.to_dict())
+        return await v1_application_list.asyncio(client=self._client, **options.to_dict())
 
     async def create(self, application_in: ApplicationIn, options: PostOptions = PostOptions()) -> ApplicationOut:
-        return await create_application_api_v1_app_post.asyncio(
-            client=self._client, json_body=application_in, **options.to_dict()
-        )
+        return await v1_application_create.asyncio(client=self._client, json_body=application_in, **options.to_dict())
 
     async def get(self, app_id: str) -> ApplicationOut:
-        return await get_application_api_v1_app_app_id_get.asyncio(client=self._client, app_id=app_id)
+        return await v1_application_get.asyncio(client=self._client, app_id=app_id)
 
     async def get_or_create(
         self, application_in: ApplicationIn, options: PostOptions = PostOptions()
     ) -> ApplicationOut:
-        return await create_application_api_v1_app_post.asyncio(
+        return await v1_application_create.asyncio(
             client=self._client, json_body=application_in, get_if_exists=True, **options.to_dict()
         )
 
     async def update(self, app_id: str, application_in: ApplicationIn) -> ApplicationOut:
-        return await update_application_api_v1_app_app_id_put.asyncio(
-            client=self._client, app_id=app_id, json_body=application_in
-        )
+        return await v1_application_update.asyncio(client=self._client, app_id=app_id, json_body=application_in)
 
     async def delete(self, app_id: str) -> None:
-        return await delete_application_api_v1_app_app_id_delete.asyncio(client=self._client, app_id=app_id)
+        return await v1_application_delete.asyncio(client=self._client, app_id=app_id)
 
 
 class Application(ApiBase):
     def list(self, options: ApplicationListOptions = ApplicationListOptions()) -> ListResponseApplicationOut:
-        return list_applications_api_v1_app_get.sync(client=self._client, **options.to_dict())
+        return v1_application_list.sync(client=self._client, **options.to_dict())
 
     def create(self, application_in: ApplicationIn, options: PostOptions = PostOptions()) -> ApplicationOut:
-        return create_application_api_v1_app_post.sync(
-            client=self._client, json_body=application_in, **options.to_dict()
-        )
+        return v1_application_create.sync(client=self._client, json_body=application_in, **options.to_dict())
 
     def get(self, app_id: str) -> ApplicationOut:
-        return get_application_api_v1_app_app_id_get.sync(client=self._client, app_id=app_id)
+        return v1_application_get.sync(client=self._client, app_id=app_id)
 
     def get_or_create(self, application_in: ApplicationIn, options: PostOptions = PostOptions()) -> ApplicationOut:
-        return create_application_api_v1_app_post.sync(
+        return v1_application_create.sync(
             client=self._client, json_body=application_in, get_if_exists=True, **options.to_dict()
         )
 
     def update(self, app_id: str, application_in: ApplicationIn) -> ApplicationOut:
-        return update_application_api_v1_app_app_id_put.sync(
-            client=self._client, app_id=app_id, json_body=application_in
-        )
+        return v1_application_update.sync(client=self._client, app_id=app_id, json_body=application_in)
 
     def delete(self, app_id: str) -> None:
-        return delete_application_api_v1_app_app_id_delete.sync(client=self._client, app_id=app_id)
+        return v1_application_delete.sync(client=self._client, app_id=app_id)
 
 
 class EndpointAsync(ApiBase):
     async def list(self, app_id: str, options: EndpointListOptions = EndpointListOptions()) -> ListResponseEndpointOut:
-        return await list_endpoints_api_v1_app_app_id_endpoint_get.asyncio(
+        return await v1_endpoint_list.asyncio(
             client=self._client,
             app_id=app_id,
             **options.to_dict(),
         )
 
     async def create(self, app_id: str, endpoint_in: EndpointIn, options: PostOptions = PostOptions()) -> EndpointOut:
-        return await create_endpoint_api_v1_app_app_id_endpoint_post.asyncio(
+        return await v1_endpoint_create.asyncio(
             client=self._client,
             app_id=app_id,
             json_body=endpoint_in,
@@ -291,12 +297,10 @@ async def create(self, app_id: str, endpoint_in: EndpointIn, options: PostOption
         )
 
     async def get(self, app_id: str, endpoint_id: str) -> EndpointOut:
-        return await get_endpoint_api_v1_app_app_id_endpoint_endpoint_id_get.asyncio(
-            client=self._client, app_id=app_id, endpoint_id=endpoint_id
-        )
+        return await v1_endpoint_get.asyncio(client=self._client, app_id=app_id, endpoint_id=endpoint_id)
 
     async def update(self, app_id: str, endpoint_id: str, endpoint_update: EndpointUpdate) -> EndpointOut:
-        return await update_endpoint_api_v1_app_app_id_endpoint_endpoint_id_put.asyncio(
+        return await v1_endpoint_update.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -304,14 +308,14 @@ async def update(self, app_id: str, endpoint_id: str, endpoint_update: EndpointU
         )
 
     async def delete(self, app_id: str, endpoint_id: str) -> None:
-        return await delete_endpoint_api_v1_app_app_id_endpoint_endpoint_id_delete.asyncio(
+        return await v1_endpoint_delete.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
         )
 
     async def get_secret(self, app_id: str, endpoint_id: str) -> EndpointSecretOut:
-        return await get_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_get.asyncio(
+        return await v1_endpoint_get_secret.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -324,7 +328,7 @@ async def rotate_secret(
         endpoint_secret_rotate_in: EndpointSecretRotateIn,
         options: PostOptions = PostOptions(),
     ) -> None:
-        return await rotate_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_rotate_post.asyncio(
+        return await v1_endpoint_rotate_secret.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -335,7 +339,7 @@ async def rotate_secret(
     async def recover(
         self, app_id: str, endpoint_id: str, recover_in: RecoverIn, options: PostOptions = PostOptions()
     ) -> RecoverOut:
-        return await recover_failed_webhooks_api_v1_app_app_id_endpoint_endpoint_id_recover_post.asyncio(
+        return await v1_endpoint_recover.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -344,14 +348,14 @@ async def recover(
         )
 
     async def get_headers(self, app_id: str, endpoint_id: str) -> EndpointHeadersOut:
-        return await get_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_get.asyncio(
+        return await v1_endpoint_get_headers.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
         )
 
     async def update_headers(self, app_id: str, endpoint_id: str, endpoint_headers_in: EndpointHeadersIn) -> None:
-        return await update_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_put.asyncio(
+        return await v1_endpoint_update_headers.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -359,7 +363,7 @@ async def update_headers(self, app_id: str, endpoint_id: str, endpoint_headers_i
         )
 
     async def patch_headers(self, app_id: str, endpoint_id: str, endpoint_headers_in: EndpointHeadersPatchIn) -> None:
-        return await patch_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_patch.asyncio(
+        return await v1_endpoint_patch_headers.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -369,36 +373,45 @@ async def patch_headers(self, app_id: str, endpoint_id: str, endpoint_headers_in
     async def replay_missing(
         self, app_id: str, endpoint_id: str, replay_in: ReplayIn, options: PostOptions = PostOptions()
     ) -> ReplayOut:
-        return await replay_missing_webhooks_api_v1_app_app_id_endpoint_endpoint_id_replay_missing_post.asyncio(
+        return await v1_endpoint_replay.asyncio(
             client=self._client, app_id=app_id, endpoint_id=endpoint_id, json_body=replay_in, **options.to_dict()
         )
 
     async def transformations_get(self, app_id: str, endpoint_id: str) -> EndpointTransformationOut:
-        return await get_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_get.asyncio(
-            client=self._client, app_id=app_id, endpoint_id=endpoint_id
-        )
+        return await v1_endpoint_transformation_get.asyncio(client=self._client, app_id=app_id, endpoint_id=endpoint_id)
 
     async def transformation_partial_update(
         self, app_id: str, endpoint_id: str, endpoint_transformation_in: EndpointTransformationIn
     ) -> None:
-        await set_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_patch.asyncio(
+        await v1_endpoint_transformation_partial_update.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
             json_body=endpoint_transformation_in,
         )
 
+    async def send_example(
+        self, app_id: str, endpoint_id: str, event_example_in: EventExampleIn, options: PostOptions = PostOptions()
+    ) -> MessageOut:
+        return await v1_endpoint_send_example.asyncio(
+            client=self._client,
+            app_id=app_id,
+            endpoint_id=endpoint_id,
+            json_body=event_example_in,
+            **options.to_dict(),
+        )
+
 
 class Endpoint(ApiBase):
     def list(self, app_id: str, options: EndpointListOptions = EndpointListOptions()) -> ListResponseEndpointOut:
-        return list_endpoints_api_v1_app_app_id_endpoint_get.sync(
+        return v1_endpoint_list.sync(
             client=self._client,
             app_id=app_id,
             **options.to_dict(),
         )
 
     def create(self, app_id: str, endpoint_in: EndpointIn, options: PostOptions = PostOptions()) -> EndpointOut:
-        return create_endpoint_api_v1_app_app_id_endpoint_post.sync(
+        return v1_endpoint_create.sync(
             client=self._client,
             app_id=app_id,
             json_body=endpoint_in,
@@ -406,12 +419,10 @@ def create(self, app_id: str, endpoint_in: EndpointIn, options: PostOptions = Po
         )
 
     def get(self, app_id: str, endpoint_id: str) -> EndpointOut:
-        return get_endpoint_api_v1_app_app_id_endpoint_endpoint_id_get.sync(
-            client=self._client, app_id=app_id, endpoint_id=endpoint_id
-        )
+        return v1_endpoint_get.sync(client=self._client, app_id=app_id, endpoint_id=endpoint_id)
 
     def update(self, app_id: str, endpoint_id: str, endpoint_update: EndpointUpdate) -> EndpointOut:
-        return update_endpoint_api_v1_app_app_id_endpoint_endpoint_id_put.sync(
+        return v1_endpoint_update.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -419,14 +430,14 @@ def update(self, app_id: str, endpoint_id: str, endpoint_update: EndpointUpdate)
         )
 
     def delete(self, app_id: str, endpoint_id: str) -> None:
-        return delete_endpoint_api_v1_app_app_id_endpoint_endpoint_id_delete.sync(
+        return v1_endpoint_delete.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
         )
 
     def get_secret(self, app_id: str, endpoint_id: str) -> EndpointSecretOut:
-        return get_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_get.sync(
+        return v1_endpoint_get_secret.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -439,7 +450,7 @@ def rotate_secret(
         endpoint_secret_rotate_in: EndpointSecretRotateIn,
         options: PostOptions = PostOptions(),
     ) -> None:
-        return rotate_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_rotate_post.sync(
+        return v1_endpoint_rotate_secret.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -450,7 +461,7 @@ def rotate_secret(
     def recover(
         self, app_id: str, endpoint_id: str, recover_in: RecoverIn, options: PostOptions = PostOptions()
     ) -> RecoverOut:
-        return recover_failed_webhooks_api_v1_app_app_id_endpoint_endpoint_id_recover_post.sync(
+        return v1_endpoint_recover.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -459,14 +470,14 @@ def recover(
         )
 
     def get_headers(self, app_id: str, endpoint_id: str) -> EndpointHeadersOut:
-        return get_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_get.sync(
+        return v1_endpoint_get_headers.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
         )
 
     def update_headers(self, app_id: str, endpoint_id: str, endpoint_headers_in: EndpointHeadersIn) -> None:
-        return update_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_put.sync(
+        return v1_endpoint_update_headers.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -474,72 +485,85 @@ def update_headers(self, app_id: str, endpoint_id: str, endpoint_headers_in: End
         )
 
     def patch_headers(self, app_id: str, endpoint_id: str, endpoint_headers_in: EndpointHeadersPatchIn) -> None:
-        return patch_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_patch.sync(
+        return v1_endpoint_patch_headers.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
             json_body=endpoint_headers_in,
         )
 
-    def get_stats(self, app_id: str, endpoint_id: str) -> EndpointStats:
-        return get_endpoint_stats_api_v1_app_app_id_endpoint_endpoint_id_stats_get.sync(
+    def get_stats(
+        self, app_id: str, endpoint_id: str, options: EndpointStatsOptions = EndpointStatsOptions()
+    ) -> EndpointStats:
+        return v1_endpoint_get_stats.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
+            since=options.since,
+            until=options.until,
         )
 
     def replay_missing(
         self, app_id: str, endpoint_id: str, replay_in: ReplayIn, options: PostOptions = PostOptions()
     ) -> ReplayOut:
-        return replay_missing_webhooks_api_v1_app_app_id_endpoint_endpoint_id_replay_missing_post.sync(
+        return v1_endpoint_replay.sync(
             client=self._client, app_id=app_id, endpoint_id=endpoint_id, json_body=replay_in, **options.to_dict()
         )
 
     def transformations_get(self, app_id: str, endpoint_id: str) -> EndpointTransformationOut:
-        return get_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_get.sync(
-            client=self._client, app_id=app_id, endpoint_id=endpoint_id
-        )
+        return v1_endpoint_transformation_get.sync(client=self._client, app_id=app_id, endpoint_id=endpoint_id)
 
     def transformation_partial_update(
         self, app_id: str, endpoint_id: str, endpoint_transformation_in: EndpointTransformationIn
     ) -> None:
-        set_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_patch.sync(
+        v1_endpoint_transformation_partial_update.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
             json_body=endpoint_transformation_in,
         )
 
+    def send_example(
+        self, app_id: str, endpoint_id: str, event_example_in: EventExampleIn, options: PostOptions = PostOptions()
+    ) -> MessageOut:
+        return v1_endpoint_send_example.sync(
+            client=self._client,
+            app_id=app_id,
+            endpoint_id=endpoint_id,
+            json_body=event_example_in,
+            **options.to_dict(),
+        )
+
 
 class EventTypeAsync(ApiBase):
     async def list(self, options: EventTypeListOptions = EventTypeListOptions()) -> ListResponseEventTypeOut:
-        return await list_event_types_api_v1_event_type_get.asyncio(
+        return await v1_event_type_list.asyncio(
             client=self._client,
             **options.to_dict(),
         )
 
     async def create(self, event_type_in: EventTypeIn, options: PostOptions = PostOptions()) -> EventTypeOut:
-        return await create_event_type_api_v1_event_type_post.asyncio(
+        return await v1_event_type_create.asyncio(
             client=self._client,
             json_body=event_type_in,
             **options.to_dict(),
         )
 
     async def get(self, event_type_name: str) -> EventTypeOut:
-        return await get_event_type_api_v1_event_type_event_type_name_get.asyncio(
+        return await v1_event_type_get.asyncio(
             client=self._client,
             event_type_name=event_type_name,
         )
 
     async def update(self, event_type_name: str, event_type_update: EventTypeUpdate) -> EventTypeOut:
-        return await update_event_type_api_v1_event_type_event_type_name_put.asyncio(
+        return await v1_event_type_update.asyncio(
             client=self._client,
             event_type_name=event_type_name,
             json_body=event_type_update,
         )
 
     async def delete(self, event_type_name: str) -> None:
-        return await delete_event_type_api_v1_event_type_event_type_name_delete.asyncio(
+        return await v1_event_type_delete.asyncio(
             client=self._client,
             event_type_name=event_type_name,
         )
@@ -547,33 +571,33 @@ async def delete(self, event_type_name: str) -> None:
 
 class EventType(ApiBase):
     def list(self, options: EventTypeListOptions = EventTypeListOptions()) -> ListResponseEventTypeOut:
-        return list_event_types_api_v1_event_type_get.sync(
+        return v1_event_type_list.sync(
             client=self._client,
             **options.to_dict(),
         )
 
     def create(self, event_type_in: EventTypeIn, options: PostOptions = PostOptions()) -> EventTypeOut:
-        return create_event_type_api_v1_event_type_post.sync(
+        return v1_event_type_create.sync(
             client=self._client,
             json_body=event_type_in,
             **options.to_dict(),
         )
 
     def get(self, event_type_name: str) -> EventTypeOut:
-        return get_event_type_api_v1_event_type_event_type_name_get.sync(
+        return v1_event_type_get.sync(
             client=self._client,
             event_type_name=event_type_name,
         )
 
     def update(self, event_type_name: str, event_type_update: EventTypeUpdate) -> EventTypeOut:
-        return update_event_type_api_v1_event_type_event_type_name_put.sync(
+        return v1_event_type_update.sync(
             client=self._client,
             event_type_name=event_type_name,
             json_body=event_type_update,
         )
 
     def delete(self, event_type_name: str) -> None:
-        return delete_event_type_api_v1_event_type_event_type_name_delete.sync(
+        return v1_event_type_delete.sync(
             client=self._client,
             event_type_name=event_type_name,
         )
@@ -583,7 +607,7 @@ class IntegrationAsync(ApiBase):
     async def list(
         self, app_id: str, options: IntegrationListOptions = IntegrationListOptions()
     ) -> ListResponseIntegrationOut:
-        return await list_integrations_api_v1_app_app_id_integration_get.asyncio(
+        return await v1_integration_list.asyncio(
             client=self._client,
             app_id=app_id,
             **options.to_dict(),
@@ -592,7 +616,7 @@ async def list(
     async def create(
         self, app_id: str, integ_in: IntegrationIn, options: PostOptions = PostOptions()
     ) -> IntegrationOut:
-        return await create_integration_api_v1_app_app_id_integration_post.asyncio(
+        return await v1_integration_create.asyncio(
             client=self._client,
             app_id=app_id,
             json_body=integ_in,
@@ -600,14 +624,14 @@ async def create(
         )
 
     async def get(self, app_id: str, integ_id: str) -> IntegrationOut:
-        return await get_integration_api_v1_app_app_id_integration_integ_id_get.asyncio(
+        return await v1_integration_get.asyncio(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
         )
 
     async def update(self, app_id: str, integ_id: str, integ_update: IntegrationUpdate) -> IntegrationOut:
-        return await update_integration_api_v1_app_app_id_integration_integ_id_put.asyncio(
+        return await v1_integration_update.asyncio(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
@@ -615,21 +639,21 @@ async def update(self, app_id: str, integ_id: str, integ_update: IntegrationUpda
         )
 
     async def delete(self, app_id: str, integ_id: str) -> None:
-        return await delete_integration_api_v1_app_app_id_integration_integ_id_delete.asyncio(
+        return await v1_integration_delete.asyncio(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
         )
 
     async def get_key(self, app_id: str, integ_id: str) -> IntegrationKeyOut:
-        return await get_integration_key_api_v1_app_app_id_integration_integ_id_key_get.asyncio(
+        return await v1_integration_get_key.asyncio(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
         )
 
     async def rotate_key(self, app_id: str, integ_id: str, options: PostOptions = PostOptions()) -> IntegrationKeyOut:
-        return await rotate_integration_key_api_v1_app_app_id_integration_integ_id_key_rotate_post.asyncio(
+        return await v1_integration_rotate_key.asyncio(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
@@ -641,14 +665,14 @@ class Integration(ApiBase):
     def list(
         self, app_id: str, options: IntegrationListOptions = IntegrationListOptions()
     ) -> ListResponseIntegrationOut:
-        return list_integrations_api_v1_app_app_id_integration_get.sync(
+        return v1_integration_list.sync(
             client=self._client,
             app_id=app_id,
             **options.to_dict(),
         )
 
     def create(self, app_id: str, integ_in: IntegrationIn, options: PostOptions = PostOptions()) -> IntegrationOut:
-        return create_integration_api_v1_app_app_id_integration_post.sync(
+        return v1_integration_create.sync(
             client=self._client,
             app_id=app_id,
             json_body=integ_in,
@@ -656,14 +680,14 @@ def create(self, app_id: str, integ_in: IntegrationIn, options: PostOptions = Po
         )
 
     def get(self, app_id: str, integ_id: str) -> IntegrationOut:
-        return get_integration_api_v1_app_app_id_integration_integ_id_get.sync(
+        return v1_integration_get.sync(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
         )
 
     def update(self, app_id: str, integ_id: str, integ_update: IntegrationUpdate) -> IntegrationOut:
-        return update_integration_api_v1_app_app_id_integration_integ_id_put.sync(
+        return v1_integration_update.sync(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
@@ -671,21 +695,21 @@ def update(self, app_id: str, integ_id: str, integ_update: IntegrationUpdate) ->
         )
 
     def delete(self, app_id: str, integ_id: str) -> None:
-        return delete_integration_api_v1_app_app_id_integration_integ_id_delete.sync(
+        return v1_integration_delete.sync(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
         )
 
     def get_key(self, app_id: str, integ_id: str) -> IntegrationKeyOut:
-        return get_integration_key_api_v1_app_app_id_integration_integ_id_key_get.sync(
+        return v1_integration_get_key.sync(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
         )
 
     def rotate_key(self, app_id: str, integ_id: str, options: PostOptions = PostOptions()) -> IntegrationKeyOut:
-        return rotate_integration_key_api_v1_app_app_id_integration_integ_id_key_rotate_post.sync(
+        return v1_integration_rotate_key.sync(
             client=self._client,
             app_id=app_id,
             integ_id=integ_id,
@@ -695,14 +719,14 @@ def rotate_key(self, app_id: str, integ_id: str, options: PostOptions = PostOpti
 
 class MessageAsync(ApiBase):
     async def list(self, app_id: str, options: MessageListOptions = MessageListOptions()) -> ListResponseMessageOut:
-        return await list_messages_api_v1_app_app_id_msg_get.asyncio(
+        return await v1_message_list.asyncio(
             client=self._client,
             app_id=app_id,
             **options.to_dict(),
         )
 
     async def create(self, app_id: str, message_in: MessageIn, options: PostOptions = PostOptions()) -> MessageOut:
-        ret = await create_message_api_v1_app_app_id_msg_post.asyncio(
+        ret = await v1_message_create.asyncio(
             client=self._client,
             app_id=app_id,
             json_body=message_in,
@@ -713,14 +737,14 @@ async def create(self, app_id: str, message_in: MessageIn, options: PostOptions
         return ret
 
     async def get(self, app_id: str, msg_id: str) -> MessageOut:
-        return await get_message_api_v1_app_app_id_msg_msg_id_get.asyncio(
+        return await v1_message_get.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
         )
 
     async def expunge_content(self, app_id: str, msg_id: str) -> None:
-        return await expunge_message_payload_api_v1_app_app_id_msg_msg_id_content_delete.asyncio(
+        return await v1_message_expunge_content.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -729,14 +753,14 @@ async def expunge_content(self, app_id: str, msg_id: str) -> None:
 
 class Message(ApiBase):
     def list(self, app_id: str, options: MessageListOptions = MessageListOptions()) -> ListResponseMessageOut:
-        return list_messages_api_v1_app_app_id_msg_get.sync(
+        return v1_message_list.sync(
             client=self._client,
             app_id=app_id,
             **options.to_dict(),
         )
 
     def create(self, app_id: str, message_in: MessageIn, options: PostOptions = PostOptions()) -> MessageOut:
-        ret = create_message_api_v1_app_app_id_msg_post.sync(
+        ret = v1_message_create.sync(
             client=self._client,
             app_id=app_id,
             json_body=message_in,
@@ -747,14 +771,14 @@ def create(self, app_id: str, message_in: MessageIn, options: PostOptions = Post
         return ret
 
     def get(self, app_id: str, msg_id: str) -> MessageOut:
-        return get_message_api_v1_app_app_id_msg_msg_id_get.sync(
+        return v1_message_get.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
         )
 
     def expunge_content(self, app_id: str, msg_id: str) -> None:
-        return expunge_message_payload_api_v1_app_app_id_msg_msg_id_content_delete.sync(
+        return v1_message_expunge_content.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -765,19 +789,19 @@ class MessageAttemptAsync(ApiBase):
     async def list_by_msg(
         self, app_id: str, msg_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseMessageAttemptOut:
-        return await list_attempts_by_msg_api_v1_app_app_id_attempt_msg_msg_id_get.asyncio(
+        return await v1_message_attempt_list_by_msg.asyncio(
             client=self._client, app_id=app_id, msg_id=msg_id, **options.to_dict()
         )
 
     async def list_by_endpoint(
         self, app_id: str, endpoint_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseMessageAttemptOut:
-        return await list_attempts_by_endpoint_api_v1_app_app_id_attempt_endpoint_endpoint_id_get.asyncio(
+        return await v1_message_attempt_list_by_endpoint.asyncio(
             client=self._client, app_id=app_id, endpoint_id=endpoint_id, **options.to_dict()
         )
 
     async def get(self, app_id: str, msg_id: str, attempt_id: str) -> MessageAttemptOut:
-        return await get_attempt_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_get.asyncio(
+        return await v1_message_attempt_get.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -785,7 +809,7 @@ async def get(self, app_id: str, msg_id: str, attempt_id: str) -> MessageAttempt
         )
 
     async def resend(self, app_id: str, msg_id: str, endpoint_id: str, options: PostOptions = PostOptions()) -> None:
-        return await resend_webhook_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_resend_post.asyncio(
+        return await v1_message_attempt_resend.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -796,7 +820,7 @@ async def resend(self, app_id: str, msg_id: str, endpoint_id: str, options: Post
     async def list_attempted_messages(
         self, app_id: str, endpoint_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseEndpointMessageOut:
-        return await list_attempted_messages_api_v1_app_app_id_endpoint_endpoint_id_msg_get.asyncio(
+        return await v1_message_attempt_list_attempted_messages.asyncio(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -806,7 +830,7 @@ async def list_attempted_messages(
     async def list_attempted_destinations(
         self, app_id: str, msg_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseMessageEndpointOut:
-        return await list_attempted_destinations_api_v1_app_app_id_msg_msg_id_endpoint_get.asyncio(
+        return await v1_message_attempt_list_attempted_destinations.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -820,7 +844,7 @@ async def list_attempts_for_endpoint(
         endpoint_id: str,
         options: MessageAttemptListOptions = MessageAttemptListOptions(),
     ) -> ListResponseMessageAttemptEndpointOut:
-        return await list_attempts_for_endpoint_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_attempt_get.asyncio(
+        return await v1_message_attempt_list_by_endpoint_deprecated.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -834,7 +858,7 @@ async def expunge_content(
         msg_id: str,
         attempt_id: str,
     ) -> None:
-        return await expunge_attempt_content_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_content_delete.asyncio(
+        return await v1_message_attempt_expunge_content.asyncio(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -852,19 +876,19 @@ def list(
     def list_by_msg(
         self, app_id: str, msg_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseMessageAttemptOut:
-        return list_attempts_by_msg_api_v1_app_app_id_attempt_msg_msg_id_get.sync(
+        return v1_message_attempt_list_by_msg.sync(
             client=self._client, app_id=app_id, msg_id=msg_id, **options.to_dict()
         )
 
     def list_by_endpoint(
         self, app_id: str, endpoint_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseMessageAttemptOut:
-        return list_attempts_by_endpoint_api_v1_app_app_id_attempt_endpoint_endpoint_id_get.sync(
+        return v1_message_attempt_list_by_endpoint.sync(
             client=self._client, app_id=app_id, endpoint_id=endpoint_id, **options.to_dict()
         )
 
     def get(self, app_id: str, msg_id: str, attempt_id: str) -> MessageAttemptOut:
-        return get_attempt_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_get.sync(
+        return v1_message_attempt_get.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -872,7 +896,7 @@ def get(self, app_id: str, msg_id: str, attempt_id: str) -> MessageAttemptOut:
         )
 
     def resend(self, app_id: str, msg_id: str, endpoint_id: str, options: PostOptions = PostOptions()) -> None:
-        return resend_webhook_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_resend_post.sync(
+        return v1_message_attempt_resend.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -883,7 +907,7 @@ def resend(self, app_id: str, msg_id: str, endpoint_id: str, options: PostOption
     def list_attempted_messages(
         self, app_id: str, endpoint_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseEndpointMessageOut:
-        return list_attempted_messages_api_v1_app_app_id_endpoint_endpoint_id_msg_get.sync(
+        return v1_message_attempt_list_attempted_messages.sync(
             client=self._client,
             app_id=app_id,
             endpoint_id=endpoint_id,
@@ -893,7 +917,7 @@ def list_attempted_messages(
     def list_attempted_destinations(
         self, app_id: str, msg_id: str, options: MessageAttemptListOptions = MessageAttemptListOptions()
     ) -> ListResponseMessageEndpointOut:
-        return list_attempted_destinations_api_v1_app_app_id_msg_msg_id_endpoint_get.sync(
+        return v1_message_attempt_list_attempted_destinations.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -907,7 +931,7 @@ def list_attempts_for_endpoint(
         endpoint_id: str,
         options: MessageAttemptListOptions = MessageAttemptListOptions(),
     ) -> ListResponseMessageAttemptEndpointOut:
-        return list_attempts_for_endpoint_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_attempt_get.sync(
+        return v1_message_attempt_list_by_endpoint_deprecated.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -921,7 +945,7 @@ def expunge_content(
         msg_id: str,
         attempt_id: str,
     ) -> None:
-        return expunge_attempt_content_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_content_delete.sync(
+        return v1_message_attempt_expunge_content.sync(
             client=self._client,
             app_id=app_id,
             msg_id=msg_id,
@@ -929,6 +953,24 @@ def expunge_content(
         )
 
 
+class BackgroundTaskAsync(ApiBase):
+    async def list(
+        self, options: BackgroundTaskListOptions = BackgroundTaskListOptions()
+    ) -> ListResponseBackgroundTaskOut:
+        return await list_background_tasks.asyncio(client=self._client, **options.to_dict())
+
+    async def get(self, task_id: str) -> BackgroundTaskOut:
+        return await get_background_task.asyncio(client=self._client, task_id=task_id)
+
+
+class BackgroundTask(ApiBase):
+    def list(self, options: BackgroundTaskListOptions = BackgroundTaskListOptions()) -> ListResponseBackgroundTaskOut:
+        return list_background_tasks.sync(client=self._client, **options.to_dict())
+
+    def get(self, task_id: str) -> BackgroundTaskOut:
+        return get_background_task.sync(client=self._client, task_id=task_id)
+
+
 class ClientBase:
     _client: AuthenticatedClient
 
diff --git a/python/templates/endpoint_module.py.jinja b/python/templates/endpoint_module.py.jinja
index 18c484e4b..8657f8670 100644
--- a/python/templates/endpoint_module.py.jinja
+++ b/python/templates/endpoint_module.py.jinja
@@ -1,3 +1,4 @@
+from http import HTTPStatus
 from typing import Any, Dict, List, Optional, Union, cast
 from time import sleep
 import random
diff --git a/python/templates/model.py.jinja b/python/templates/model.py.jinja
index cdc674c52..20256133a 100644
--- a/python/templates/model.py.jinja
+++ b/python/templates/model.py.jinja
@@ -4,7 +4,7 @@ from typing import Any, Dict
 
 {{ class_name }} = Dict[str, Any]
 {% else %}
-from typing import Any, Dict, Type, TypeVar, Tuple, Optional, BinaryIO, TextIO
+from typing import Any, Dict, Type, TypeVar, Tuple, Optional, BinaryIO, TextIO, TYPE_CHECKING
 
 {% if model.additional_properties %}
 from typing import List
@@ -22,6 +22,12 @@ from ..types import UNSET, Unset
 {{ relative }}
 {% endfor %}
 
+{% for lazy_import in model.lazy_imports %}
+{% if loop.first %}
+if TYPE_CHECKING:
+{% endif %}
+  {{ lazy_import }}
+{% endfor %}
 
 {% if model.additional_properties %}
 {% set additional_property_type = 'Any' if model.additional_properties == True else model.additional_properties.get_type_string() %}
diff --git a/regen_openapi.sh b/regen_openapi.sh
index 1160cecda..229bd856a 100755
--- a/regen_openapi.sh
+++ b/regen_openapi.sh
@@ -6,7 +6,7 @@ if [ -n "$1" ]; then
     curl "$1" | python -m json.tool > openapi.json
 fi
 
-yarn openapi-generator-cli generate -i openapi.json -g typescript -o javascript/src/openapi -c javascript/openapi-generator-config.json -t javascript/templates
+yarn openapi-generator-cli generate -i openapi.json -g typescript -o javascript/src/openapi -c javascript/openapi-generator-config.json -t javascript/templates --type-mappings=set=Array
 
 yarn openapi-generator-cli generate -i openapi.json -g go -o go/internal/openapi -c go/openapi-generator-config.json -t go/templates
 
diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock
index 58fb3accd..2a4a6dd4c 100644
--- a/ruby/Gemfile.lock
+++ b/ruby/Gemfile.lock
@@ -1,7 +1,7 @@
 PATH
   remote: .
   specs:
-    svix (0.81.0)
+    svix (1.4.12)
       typhoeus (~> 1.0, >= 1.0.1)
 
 GEM
diff --git a/ruby/lib/svix.rb b/ruby/lib/svix.rb
index 9c0a9335a..57e59eb07 100644
--- a/ruby/lib/svix.rb
+++ b/ruby/lib/svix.rb
@@ -37,6 +37,7 @@
 require "svix/models/endpoint_update"
 require "svix/models/endpoint_updated_event_data"
 require "svix/models/endpoint_updated_event"
+require "svix/models/event_example_in"
 require "svix/models/event_type_in"
 require "svix/models/event_type_out"
 require "svix/models/event_type_update"
@@ -69,7 +70,6 @@
 require "svix/models/message_status"
 require "svix/models/recover_in"
 require "svix/models/validation_error"
-require "svix/models/webhook_types"
 require "svix/models/status_code_class"
 
 # Core
diff --git a/ruby/lib/svix/application_api.rb b/ruby/lib/svix/application_api.rb
index f8b007af0..b5f75b7da 100644
--- a/ruby/lib/svix/application_api.rb
+++ b/ruby/lib/svix/application_api.rb
@@ -1,31 +1,31 @@
 # frozen_string_literal: true
 
 module Svix
-    class ApplicationAPI
-        def initialize(api_client)
-            @api = ApplicationApi.new(api_client)
-        end
+  class ApplicationAPI
+    def initialize(api_client)
+      @api = ApplicationApi.new(api_client)
+    end
 
-        def list(options = {})
-            return @api.list_applications_api_v1_app_get(options)
-        end
+    def list(options = {})
+      return @api.v1_application_list(options)
+    end
 
-        def create(application_in, options = {})
-            return @api.create_application_api_v1_app_post(application_in, options)
-        end
-        def get_or_create(application_in, options = {})
-            return @api.create_application_api_v1_app_post(application_in, {**options, get_if_exists: true})
-        end
-        def get(app_id)
-            return @api.get_application_api_v1_app_app_id_get(app_id)
-        end
+    def create(application_in, options = {})
+      return @api.v1_application_create(application_in, options)
+    end
+    def get_or_create(application_in, options = {})
+      return @api.v1_application_create(application_in, {**options, get_if_exists: true})
+    end
+    def get(app_id)
+      return @api.v1_application_get(app_id)
+    end
 
-        def update(app_id, application_in)
-            return @api.update_application_api_v1_app_app_id_put(app_id, application_in)
-        end
+    def update(app_id, application_in)
+      return @api.v1_application_update(app_id, application_in)
+    end
 
-        def delete(app_id)
-            return @api.delete_application_api_v1_app_app_id_delete(app_id)
-        end
+    def delete(app_id)
+      return @api.v1_application_delete(app_id)
     end
+  end
 end
diff --git a/ruby/lib/svix/authentication_api.rb b/ruby/lib/svix/authentication_api.rb
index da2effb42..a0fc4d95c 100644
--- a/ruby/lib/svix/authentication_api.rb
+++ b/ruby/lib/svix/authentication_api.rb
@@ -7,15 +7,15 @@ def initialize(api_client)
     end
 
     def app_portal_access(app_id, app_portal_access_in, options = {})
-      return @api.get_app_portal_access_access_api_v1_auth_dashboard_access_app_id_post(app_id, app_portal_access_in, options)
+      return @api.v1_authentication_app_portal_access(app_id, app_portal_access_in, options)
     end
 
     def dashboard_access(app_id, options = {})
-      return @api.get_dashboard_access_api_v1_auth_dashboard_access_app_id_post(app_id, options)
+      return @api.v1_authentication_dashboard_access(app_id, options)
     end
 
     def logout(options = {})
-      return @api.logout_api_v1_auth_logout_post(options)
+      return @api.v1_authentication_logout(options)
     end
   end
 end
diff --git a/ruby/lib/svix/background_tasks_api.rb b/ruby/lib/svix/background_tasks_api.rb
new file mode 100644
index 000000000..9731f3ec0
--- /dev/null
+++ b/ruby/lib/svix/background_tasks_api.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+module Svix
+  class BackgroundTasksAPI
+    def initialize(api_client)
+      @api = BackgroundTasksApi.new(api_client)
+    end
+
+    def list(options = {})
+      return @api.list_background_tasks(options)
+    end
+
+    def get(task_id, options = {})
+      return @api.get_background_task(task_id, options)
+    end
+  end
+end
diff --git a/ruby/lib/svix/endpoint_api.rb b/ruby/lib/svix/endpoint_api.rb
index 9cb4414fb..11c4e7595 100644
--- a/ruby/lib/svix/endpoint_api.rb
+++ b/ruby/lib/svix/endpoint_api.rb
@@ -7,66 +7,70 @@ def initialize(api_client)
     end
 
     def list(app_id, options = {})
-      return @api.list_endpoints_api_v1_app_app_id_endpoint_get(app_id, options)
+      return @api.v1_endpoint_list(app_id, options)
     end
 
     def create(app_id, endpoint_in, options = {})
-      return @api.create_endpoint_api_v1_app_app_id_endpoint_post(app_id, endpoint_in, options)
+      return @api.v1_endpoint_create(app_id, endpoint_in, options)
     end
 
     def get(app_id, endpoint_id)
-      return @api.get_endpoint_api_v1_app_app_id_endpoint_endpoint_id_get(endpoint_id, app_id)
+      return @api.v1_endpoint_get(app_id, endpoint_id)
     end
 
     def update(app_id, endpoint_id, endpoint_update)
-      return @api.update_endpoint_api_v1_app_app_id_endpoint_endpoint_id_put(endpoint_id, app_id, endpoint_update)
+      return @api.v1_endpoint_update(app_id, endpoint_id, endpoint_update)
     end
 
     def delete(app_id, endpoint_id)
-      return @api.delete_endpoint_api_v1_app_app_id_endpoint_endpoint_id_delete(endpoint_id, app_id)
+      return @api.v1_endpoint_delete(app_id, endpoint_id)
     end
 
     def get_secret(app_id, endpoint_id)
-      return @api.get_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_get(endpoint_id, app_id)
+      return @api.v1_endpoint_get_secret(app_id, endpoint_id)
     end
 
     def rotate_secret(app_id, endpoint_id, endpoint_secret_rotate_in, options = {})
-      return @api.rotate_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_rotate_post(endpoint_id, app_id, endpoint_secret_rotate_in, options)
+      return @api.v1_endpoint_rotate_secret(app_id, endpoint_id, endpoint_secret_rotate_in, options)
     end
 
     def recover(app_id, endpoint_id, recover_in, options = {})
-      @api.recover_failed_webhooks_api_v1_app_app_id_endpoint_endpoint_id_recover_post(app_id, endpoint_id, recover_in, options)
+      @api.v1_endpoint_recover(app_id, endpoint_id, recover_in, options)
       nil
     end
 
     def get_headers(app_id, endpoint_id)
-      return @api.get_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_get(endpoint_id app_id)
+      return @api.v1_endpoint_get_headers(app_id, endpoint_id)
     end
 
     def update_headers(app_id, endpoint_id, endpoint_headers_in)
-      return @api.update_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_put(app_id, endpoint_id, endpoint_headers_in)
+      return @api.v1_endpoint_update_headers(app_id, endpoint_id, endpoint_headers_in)
     end
 
     def patch_headers(app_id, endpoint_id, endpoint_headers_in)
-      return @api.patch_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_patch(app_id, endpoint_id, endpoint_headers_in)
+      return @api.v1_endpoint_patch_headers(app_id, endpoint_id, endpoint_headers_in)
     end
 
-    def get_stats(app_id, endpoint_id)
-      return @api.get_endpoint_stats_api_v1_app_app_id_endpoint_endpoint_id_stats_get(endpoint_id app_id)
+    def get_stats(app_id, endpoint_id, options = {})
+      return @api.v1_endpoint_get_stats(app_id, endpoint_id, options)
     end
 
     def replay_missing(app_id, endpoint_id, replay_in, options = {})
-      @api.replay_missing_webhooks_api_v1_app_app_id_endpoint_endpoint_id_replay_missing_post(app_id, endpoint_id, replay_in, options)
+      @api.v1_endpoint_replay(app_id, endpoint_id, replay_in, options)
       nil
     end
 
     def transformation_get(app_id, endpoint_id, options = {})
-      return @api.get_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_get(endpoint_id, app_id, options)
+      return @api.v1_endpoint_transformation_get(app_id, endpoint_id, options)
     end
 
     def transformation_partial_update(app_id, endpoint_id, endpoint_transformation_in, options = {})
-      @api.set_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_patch(app_id, endpoint_id, endpoint_transformation_in, options)
+      @api.v1_endpoint_transformation_partial_update(app_id, endpoint_id, endpoint_transformation_in, options)
       nil
     end
+
+    def send_example(app_id, endpoint_id, event_example_in, options = {})
+      @api.v1_endpoint_send_example(app_id, endpoint_id, event_example_in, options)
+    end
   end
 end
diff --git a/ruby/lib/svix/event_type_api.rb b/ruby/lib/svix/event_type_api.rb
index f028227aa..8f47c6c6a 100644
--- a/ruby/lib/svix/event_type_api.rb
+++ b/ruby/lib/svix/event_type_api.rb
@@ -1,29 +1,29 @@
 # frozen_string_literal: true
 
 module Svix
-    class EventTypeAPI
-        def initialize(api_client)
-            @api = EventTypeApi.new(api_client)
-        end
+  class EventTypeAPI
+    def initialize(api_client)
+      @api = EventTypeApi.new(api_client)
+    end
 
-        def list(options = {})
-            return @api.list_event_types_api_v1_event_type_get(options)
-        end
+    def list(options = {})
+      return @api.v1_event_type_list(options)
+    end
 
-        def create(event_type_in, options = {})
-            return @api.create_event_type_api_v1_event_type_post(event_type_in, options)
-        end
+    def create(event_type_in, options = {})
+      return @api.v1_event_type_create(event_type_in, options)
+    end
 
-        def get(event_type_name)
-            return @api.get_event_type_api_v1_event_type_event_type_name_get(event_type_name)
-        end
+    def get(event_type_name)
+      return @api.v1_event_type_get(event_type_name)
+    end
 
-        def update(event_type_name, event_type_update)
-            return @api.update_event_type_api_v1_event_type_event_type_name_put(event_type_name, event_type_update)
-        end
+    def update(event_type_name, event_type_update)
+      return @api.v1_event_type_update(event_type_name, event_type_update)
+    end
 
-        def delete(event_type_name)
-            return @api.delete_event_type_api_v1_event_type_event_type_name_delete(event_type_name)
-        end
+    def delete(event_type_name)
+      return @api.v1_event_type_delete(event_type_name)
     end
+  end
 end
diff --git a/ruby/lib/svix/integration_api.rb b/ruby/lib/svix/integration_api.rb
index 8a6824cb3..98626b935 100644
--- a/ruby/lib/svix/integration_api.rb
+++ b/ruby/lib/svix/integration_api.rb
@@ -1,38 +1,38 @@
 # frozen_string_literal: true
 
 module Svix
-    class IntegrationAPI
-        def initialize(api_client)
-            @api = IntegrationApi.new(api_client)
-        end
-
-        def list(app_id, options = {})
-            return @api.list_integrations_api_v1_app_app_id_integration_get(app_id, options)
-        end
+  class IntegrationAPI
+    def initialize(api_client)
+      @api = IntegrationApi.new(api_client)
+    end
 
-        def create(app_id, integ_in, options = {})
-            return @api.create_integration_api_v1_app_app_id_integration_post(app_id, integ_in, options)
-        end
+    def list(app_id, options = {})
+      return @api.v1_integration_list(app_id, options)
+    end
 
-        def get(app_id, integ_id)
-            return @api.get_integration_api_v1_app_app_id_integration_integ_id_get(integ_id, app_id)
-        end
+    def create(app_id, integ_in, options = {})
+      return @api.v1_integration_create(app_id, integ_in, options)
+    end
 
-        def update(app_id, integ_id, integ_update)
-            return @api.update_integration_api_v1_app_app_id_integration_integ_id_put(integ_id, app_id, integ_update)
-        end
+    def get(app_id, integ_id)
+      return @api.v1_integration_get(app_id, integ_id)
+    end
 
-        def delete(app_id, integ_id)
-            return @api.delete_integration_api_v1_app_app_id_integration_integ_id_delete(integ_id, app_id)
-        end
+    def update(app_id, integ_id, integ_update)
+      return @api.v1_integration_update(app_id, integ_id, integ_update)
+    end
 
-        def get_key(app_id, integ_id)
-            return @api.get_integration_key_api_v1_app_app_id_integration_integ_id_key_get(integ_id, app_id)
-        end
+    def delete(app_id, integ_id)
+      return @api.v1_integration_delete(app_id, integ_id)
+    end
 
-        def rotate_key(app_id, integ_id, options = {})
-            return @api.rotate_integration_key_api_v1_app_app_id_integration_integ_id_key_rotate_post(integ_id, app_id, options)
-        end
+    def get_key(app_id, integ_id)
+      return @api.v1_integration_get_key(app_id, integ_id)
+    end
 
+    def rotate_key(app_id, integ_id, options = {})
+      return @api.v1_integration_rotate_key(app_id, integ_id, options)
     end
+
+  end
 end
diff --git a/ruby/lib/svix/internal.rb b/ruby/lib/svix/internal.rb
index 4f5513fb1..570ec068b 100644
--- a/ruby/lib/svix/internal.rb
+++ b/ruby/lib/svix/internal.rb
@@ -1,17 +1,16 @@
 # frozen_string_literal: true
 
 module Svix
-    private_constant :ApiClient
-    private_constant :Configuration
-    private_constant :ApplicationApi
-    private_constant :AuthenticationApi
-    private_constant :EndpointApi
-    private_constant :HealthApi
-    private_constant :IntegrationApi
-    private_constant :MessageApi
-    private_constant :MessageAttemptApi
-    private_constant :WebhookTypes
-    private_constant :HttpErrorOut
-    private_constant :HTTPValidationError
-    private_constant :ValidationError
+  private_constant :ApiClient
+  private_constant :Configuration
+  private_constant :ApplicationApi
+  private_constant :AuthenticationApi
+  private_constant :EndpointApi
+  private_constant :HealthApi
+  private_constant :IntegrationApi
+  private_constant :MessageApi
+  private_constant :MessageAttemptApi
+  private_constant :HttpErrorOut
+  private_constant :HTTPValidationError
+  private_constant :ValidationError
 end
diff --git a/ruby/lib/svix/message_api.rb b/ruby/lib/svix/message_api.rb
index c9d629901..395914ac8 100644
--- a/ruby/lib/svix/message_api.rb
+++ b/ruby/lib/svix/message_api.rb
@@ -7,19 +7,19 @@ def initialize(api_client)
     end
 
     def list(app_id, options = {})
-      return @api.list_messages_api_v1_app_app_id_msg_get(app_id, options)
+      return @api.v1_message_list(app_id, options)
     end
 
     def create(app_id, message_in, options = {})
-      return @api.create_message_api_v1_app_app_id_msg_post(app_id, message_in, options)
+      return @api.v1_message_create(app_id, message_in, options)
     end
 
     def get(app_id, msg_id)
-      return @api.get_message_api_v1_app_app_id_msg_msg_id_get(msg_id, app_id)
+      return @api.v1_message_get(app_id, msg_id)
     end
 
     def expunge_content(app_id, msg_id)
-      return @api.expunge_message_payload_api_v1_app_app_id_msg_msg_id_content_delete(msg_id, app_id)
+      return @api.v1_message_expunge_content(app_id, msg_id)
     end
   end
 end
diff --git a/ruby/lib/svix/message_attempt_api.rb b/ruby/lib/svix/message_attempt_api.rb
index 775d5e4c2..ec9d6234c 100644
--- a/ruby/lib/svix/message_attempt_api.rb
+++ b/ruby/lib/svix/message_attempt_api.rb
@@ -13,35 +13,35 @@ def list(app_id, msg_id, options = {})
     end
 
     def list_by_msg(app_id, msg_id, options = {})
-      return @api.list_attempts_by_msg_api_v1_app_app_id_attempt_msg_msg_id_get(app_id, msg_id, options)
+      return @api.v1_message_attempt_list_by_msg(app_id, msg_id, options)
     end
 
     def list_by_endpoint(app_id, endpoint_id, options = {})
-      return @api.list_attempts_by_endpoint_api_v1_app_app_id_attempt_endpoint_endpoint_id_get(app_id, endpoint_id, options)
+      return @api.v1_message_attempt_list_by_endpoint(app_id, endpoint_id, options)
     end
 
     def get(app_id, msg_id, attempt_id)
-      return @api.get_attempt_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_get(attempt_id, msg_id, app_id)
+      return @api.v1_message_attempt_get(app_id, msg_id, attempt_id)
     end
 
     def resend(app_id, msg_id, endpoint_id, options = {})
-      return @api.resend_webhook_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_resend_post(endpoint_id, msg_id, app_id, options)
+      return @api.v1_message_attempt_resend(app_id, msg_id, endpoint_id, options)
     end
 
     def list_attempted_messages(app_id, endpoint_id, options = {})
-      return @api.list_attempted_messages_api_v1_app_app_id_endpoint_endpoint_id_msg_get(endpoint_id, app_id, options)
+      return @api.v1_message_attempt_list_attempted_messages(app_id, endpoint_id, options)
     end
 
     def list_attempted_destinations(app_id, msg_id, options = {})
-      return @api.list_attempted_destinations_api_v1_app_app_id_msg_msg_id_endpoint_get(msg_id, app_id, options)
+      return @api.v1_message_attempt_list_attempted_destinations(app_id, msg_id, options)
     end
 
     def list_attempts_for_endpoint(app_id, endpoint_id, msg_id, options = {})
-      return @api.list_attempts_for_endpoint_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_attempt_get(msg_id, app_id, endpoint_id, options)
+      return @api.v1_message_attempt_list_by_endpoint_deprecated(app_id, msg_id, endpoint_id, options)
     end
 
     def expunge_content(app_id, msg_id, attempt_id)
-      return @api.expunge_attempt_content_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_content_delete(attempt_id, msg_id, app_id)
+      return @api.v1_message_attempt_expunge_content(app_id, msg_id, attempt_id)
     end
   end
 end
diff --git a/ruby/lib/svix/version.rb b/ruby/lib/svix/version.rb
index 672d3ef09..f17c4db01 100644
--- a/ruby/lib/svix/version.rb
+++ b/ruby/lib/svix/version.rb
@@ -1,5 +1,5 @@
 # frozen_string_literal: true
 
 module Svix
-  VERSION = "0.81.0"
+  VERSION = "1.4.12"
 end
diff --git a/rust/Cargo.toml b/rust/Cargo.toml
index 91e666d78..9ae14c9e9 100644
--- a/rust/Cargo.toml
+++ b/rust/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "svix"
-version = "0.81.0"
+version = "1.4.12"
 authors = ["Svix Inc. <oss@svix.com>"]
 edition = "2021"
 description="Rust library for interacting with the Svix API and verifying webhook signatures."
@@ -25,5 +25,8 @@ serde = "^1.0"
 serde_derive = "^1.0"
 serde_json = "^1.0"
 url = "^2.2"
-reqwest = { version = "^0.11", features = ["json", "multipart", "default-tls"], default-features = false }
+reqwest = { version = "^0.11", features = ["json", "multipart"], default-features = false }
 
+[features]
+default = ["reqwest/default-tls"]
+rustls-tls = ["reqwest/rustls-tls"]
diff --git a/rust/README.md b/rust/README.md
index ac46eb868..b93073529 100644
--- a/rust/README.md
+++ b/rust/README.md
@@ -44,3 +44,15 @@ You can find general usage documentation at <https://docs.svix.com>.  For comple
 
 ## Usage
 Please refer to [the documentation](https://docs.svix.com/) or [the API reference](https://api.svix.com/docs) for more usage instructions.
+
+# Optional Cargo Features
+
+## TLS
+
+By default reqwest uses rust-native-tls, which will use the operating system TLS framework if available, meaning Windows and macOS. On Linux, it will use OpenSSL 1.1.
+
+[rustls-tls](https://github.com/rustls/rustls) can also be choosen, eg.:
+```
+svix = { version = "N", features = ["rustls-tls"], default-features = false  }
+```
+
diff --git a/rust/src/api.rs b/rust/src/api.rs
index b5aa40427..95f3d6acd 100644
--- a/rust/src/api.rs
+++ b/rust/src/api.rs
@@ -1,7 +1,7 @@
 use crate::apis::configuration::Configuration;
 use crate::apis::{
-    application_api, authentication_api, endpoint_api, event_type_api, integration_api,
-    message_api, message_attempt_api,
+    application_api, authentication_api, background_tasks_api, endpoint_api, event_type_api,
+    integration_api, message_api, message_attempt_api,
 };
 use crate::error::Result;
 pub use crate::models::*;
@@ -88,16 +88,14 @@ impl<'a> Authentication<'a> {
         options: Option<PostOptions>,
     ) -> Result<DashboardAccessOut> {
         let options = options.unwrap_or_default();
-        Ok(
-            authentication_api::get_dashboard_access_api_v1_auth_dashboard_access_app_id_post(
-                self.cfg,
-                authentication_api::GetDashboardAccessApiV1AuthDashboardAccessAppIdPostParams {
-                    app_id,
-                    idempotency_key: options.idempotency_key,
-                },
-            )
-            .await?,
+        Ok(authentication_api::v1_authentication_dashboard_access(
+            self.cfg,
+            authentication_api::V1AuthenticationDashboardAccessParams {
+                app_id,
+                idempotency_key: options.idempotency_key,
+            },
         )
+        .await?)
     }
 
     pub async fn app_portal_access(
@@ -107,24 +105,22 @@ impl<'a> Authentication<'a> {
         options: Option<PostOptions>,
     ) -> Result<AppPortalAccessOut> {
         let options = options.unwrap_or_default();
-        Ok(
-            authentication_api::get_app_portal_access_api_v1_auth_app_portal_access_app_id_post(
-                self.cfg,
-                authentication_api::GetAppPortalAccessApiV1AuthAppPortalAccessAppIdPostParams {
-                    app_id,
-                    app_portal_access_in,
-                    idempotency_key: options.idempotency_key,
-                },
-            )
-            .await?,
+        Ok(authentication_api::v1_authentication_app_portal_access(
+            self.cfg,
+            authentication_api::V1AuthenticationAppPortalAccessParams {
+                app_id,
+                app_portal_access_in,
+                idempotency_key: options.idempotency_key,
+            },
         )
+        .await?)
     }
 
     pub async fn logout(&self, options: Option<PostOptions>) -> Result<()> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(authentication_api::logout_api_v1_auth_logout_post(
+        Ok(authentication_api::v1_authentication_logout(
             self.cfg,
-            authentication_api::LogoutApiV1AuthLogoutPostParams { idempotency_key },
+            authentication_api::V1AuthenticationLogoutParams { idempotency_key },
         )
         .await?)
     }
@@ -161,13 +157,12 @@ impl<'a> Application<'a> {
             limit,
             order,
         } = options.unwrap_or_default();
-        Ok(application_api::list_applications_api_v1_app_get(
+        Ok(application_api::v1_application_list(
             self.cfg,
-            application_api::ListApplicationsApiV1AppGetParams {
+            application_api::V1ApplicationListParams {
                 iterator,
                 limit,
                 order,
-                idempotency_key: None,
             },
         )
         .await?)
@@ -179,9 +174,9 @@ impl<'a> Application<'a> {
         options: Option<PostOptions>,
     ) -> Result<ApplicationOut> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(application_api::create_application_api_v1_app_post(
+        Ok(application_api::v1_application_create(
             self.cfg,
-            application_api::CreateApplicationApiV1AppPostParams {
+            application_api::V1ApplicationCreateParams {
                 application_in,
                 idempotency_key,
                 get_if_exists: None,
@@ -196,9 +191,9 @@ impl<'a> Application<'a> {
         options: Option<PostOptions>,
     ) -> Result<ApplicationOut> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(application_api::create_application_api_v1_app_post(
+        Ok(application_api::v1_application_create(
             self.cfg,
-            application_api::CreateApplicationApiV1AppPostParams {
+            application_api::V1ApplicationCreateParams {
                 application_in,
                 idempotency_key,
                 get_if_exists: Some(true),
@@ -208,12 +203,9 @@ impl<'a> Application<'a> {
     }
 
     pub async fn get(&self, app_id: String) -> Result<ApplicationOut> {
-        Ok(application_api::get_application_api_v1_app_app_id_get(
+        Ok(application_api::v1_application_get(
             self.cfg,
-            application_api::GetApplicationApiV1AppAppIdGetParams {
-                app_id,
-                idempotency_key: None,
-            },
+            application_api::V1ApplicationGetParams { app_id },
         )
         .await?)
     }
@@ -222,31 +214,24 @@ impl<'a> Application<'a> {
         &self,
         app_id: String,
         application_in: ApplicationIn,
-        options: Option<PostOptions>,
+        _: Option<PostOptions>,
     ) -> Result<ApplicationOut> {
-        let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(application_api::update_application_api_v1_app_app_id_put(
+        Ok(application_api::v1_application_update(
             self.cfg,
-            application_api::UpdateApplicationApiV1AppAppIdPutParams {
+            application_api::V1ApplicationUpdateParams {
                 app_id,
                 application_in,
-                idempotency_key,
             },
         )
         .await?)
     }
 
     pub async fn delete(&self, app_id: String) -> Result<()> {
-        Ok(
-            application_api::delete_application_api_v1_app_app_id_delete(
-                self.cfg,
-                application_api::DeleteApplicationApiV1AppAppIdDeleteParams {
-                    app_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(application_api::v1_application_delete(
+            self.cfg,
+            application_api::V1ApplicationDeleteParams { app_id },
         )
+        .await?)
     }
 }
 
@@ -261,6 +246,12 @@ pub struct Endpoint<'a> {
     cfg: &'a Configuration,
 }
 
+#[derive(Default)]
+pub struct EndpointStatsOptions {
+    pub since: Option<String>,
+    pub until: Option<String>,
+}
+
 impl<'a> Endpoint<'a> {
     fn new(cfg: &'a Configuration) -> Self {
         Self { cfg }
@@ -276,14 +267,13 @@ impl<'a> Endpoint<'a> {
             limit,
             order,
         } = options.unwrap_or_default();
-        Ok(endpoint_api::list_endpoints_api_v1_app_app_id_endpoint_get(
+        Ok(endpoint_api::v1_endpoint_list(
             self.cfg,
-            endpoint_api::ListEndpointsApiV1AppAppIdEndpointGetParams {
+            endpoint_api::V1EndpointListParams {
                 app_id,
                 order,
                 iterator,
                 limit,
-                idempotency_key: None,
             },
         )
         .await?)
@@ -296,31 +286,26 @@ impl<'a> Endpoint<'a> {
         options: Option<PostOptions>,
     ) -> Result<EndpointOut> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(
-            endpoint_api::create_endpoint_api_v1_app_app_id_endpoint_post(
-                self.cfg,
-                endpoint_api::CreateEndpointApiV1AppAppIdEndpointPostParams {
-                    app_id,
-                    endpoint_in,
-                    idempotency_key,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_create(
+            self.cfg,
+            endpoint_api::V1EndpointCreateParams {
+                app_id,
+                endpoint_in,
+                idempotency_key,
+            },
         )
+        .await?)
     }
 
     pub async fn get(&self, app_id: String, endpoint_id: String) -> Result<EndpointOut> {
-        Ok(
-            endpoint_api::get_endpoint_api_v1_app_app_id_endpoint_endpoint_id_get(
-                self.cfg,
-                endpoint_api::GetEndpointApiV1AppAppIdEndpointEndpointIdGetParams {
-                    app_id,
-                    endpoint_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_get(
+            self.cfg,
+            endpoint_api::V1EndpointGetParams {
+                app_id,
+                endpoint_id,
+            },
         )
+        .await?)
     }
 
     pub async fn update(
@@ -328,35 +313,28 @@ impl<'a> Endpoint<'a> {
         app_id: String,
         endpoint_id: String,
         endpoint_update: EndpointUpdate,
-        options: Option<PostOptions>,
+        _: Option<PostOptions>,
     ) -> Result<EndpointOut> {
-        let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(
-            endpoint_api::update_endpoint_api_v1_app_app_id_endpoint_endpoint_id_put(
-                self.cfg,
-                endpoint_api::UpdateEndpointApiV1AppAppIdEndpointEndpointIdPutParams {
-                    app_id,
-                    endpoint_id,
-                    endpoint_update,
-                    idempotency_key,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_update(
+            self.cfg,
+            endpoint_api::V1EndpointUpdateParams {
+                app_id,
+                endpoint_id,
+                endpoint_update,
+            },
         )
+        .await?)
     }
 
     pub async fn delete(&self, app_id: String, endpoint_id: String) -> Result<()> {
-        Ok(
-            endpoint_api::delete_endpoint_api_v1_app_app_id_endpoint_endpoint_id_delete(
-                self.cfg,
-                endpoint_api::DeleteEndpointApiV1AppAppIdEndpointEndpointIdDeleteParams {
-                    app_id,
-                    endpoint_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_delete(
+            self.cfg,
+            endpoint_api::V1EndpointDeleteParams {
+                app_id,
+                endpoint_id,
+            },
         )
+        .await?)
     }
 
     pub async fn get_secret(
@@ -364,17 +342,14 @@ impl<'a> Endpoint<'a> {
         app_id: String,
         endpoint_id: String,
     ) -> Result<EndpointSecretOut> {
-        Ok(
-            endpoint_api::get_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_get(
-                self.cfg,
-                endpoint_api::GetEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretGetParams {
-                    app_id,
-                    endpoint_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_get_secret(
+            self.cfg,
+            endpoint_api::V1EndpointGetSecretParams {
+                app_id,
+                endpoint_id,
+            },
         )
+        .await?)
     }
 
     pub async fn rotate_secret(
@@ -383,18 +358,16 @@ impl<'a> Endpoint<'a> {
         endpoint_id: String,
         endpoint_secret_rotate_in: EndpointSecretRotateIn,
     ) -> Result<()> {
-        Ok(
-            endpoint_api::rotate_endpoint_secret_api_v1_app_app_id_endpoint_endpoint_id_secret_rotate_post(
-                self.cfg,
-                endpoint_api::RotateEndpointSecretApiV1AppAppIdEndpointEndpointIdSecretRotatePostParams {
-                    app_id,
-                    endpoint_id,
-                    endpoint_secret_rotate_in,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_rotate_secret(
+            self.cfg,
+            endpoint_api::V1EndpointRotateSecretParams {
+                app_id,
+                endpoint_id,
+                endpoint_secret_rotate_in,
+                idempotency_key: None,
+            },
         )
+        .await?)
     }
 
     pub async fn recover(
@@ -403,9 +376,9 @@ impl<'a> Endpoint<'a> {
         endpoint_id: String,
         recover_in: RecoverIn,
     ) -> Result<()> {
-        endpoint_api::recover_failed_webhooks_api_v1_app_app_id_endpoint_endpoint_id_recover_post(
+        endpoint_api::v1_endpoint_recover(
             self.cfg,
-            endpoint_api::RecoverFailedWebhooksApiV1AppAppIdEndpointEndpointIdRecoverPostParams {
+            endpoint_api::V1EndpointRecoverParams {
                 app_id,
                 endpoint_id,
                 recover_in,
@@ -421,17 +394,14 @@ impl<'a> Endpoint<'a> {
         app_id: String,
         endpoint_id: String,
     ) -> Result<EndpointHeadersOut> {
-        Ok(
-            endpoint_api::get_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_get(
-                self.cfg,
-                endpoint_api::GetEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersGetParams {
-                    app_id,
-                    endpoint_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_get_headers(
+            self.cfg,
+            endpoint_api::V1EndpointGetHeadersParams {
+                app_id,
+                endpoint_id,
+            },
         )
+        .await?)
     }
 
     pub async fn update_headers(
@@ -440,18 +410,15 @@ impl<'a> Endpoint<'a> {
         endpoint_id: String,
         endpoint_headers_in: EndpointHeadersIn,
     ) -> Result<()> {
-        Ok(
-            endpoint_api::update_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_put(
-                self.cfg,
-                endpoint_api::UpdateEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPutParams {
-                    app_id,
-                    endpoint_id,
-                    endpoint_headers_in,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_update_headers(
+            self.cfg,
+            endpoint_api::V1EndpointUpdateHeadersParams {
+                app_id,
+                endpoint_id,
+                endpoint_headers_in,
+            },
         )
+        .await?)
     }
 
     pub async fn patch_headers(
@@ -460,32 +427,34 @@ impl<'a> Endpoint<'a> {
         endpoint_id: String,
         endpoint_headers_patch_in: EndpointHeadersPatchIn,
     ) -> Result<()> {
-        Ok(
-            endpoint_api::patch_endpoint_headers_api_v1_app_app_id_endpoint_endpoint_id_headers_patch(
-                self.cfg,
-                endpoint_api::PatchEndpointHeadersApiV1AppAppIdEndpointEndpointIdHeadersPatchParams {
-                    app_id,
-                    endpoint_id,
-                    endpoint_headers_patch_in,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(endpoint_api::v1_endpoint_patch_headers(
+            self.cfg,
+            endpoint_api::V1EndpointPatchHeadersParams {
+                app_id,
+                endpoint_id,
+                endpoint_headers_patch_in,
+            },
         )
+        .await?)
     }
 
-    pub async fn get_stats(&self, app_id: String, endpoint_id: String) -> Result<EndpointStats> {
-        Ok(
-            endpoint_api::get_endpoint_stats_api_v1_app_app_id_endpoint_endpoint_id_stats_get(
-                self.cfg,
-                endpoint_api::GetEndpointStatsApiV1AppAppIdEndpointEndpointIdStatsGetParams {
-                    app_id,
-                    endpoint_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+    pub async fn get_stats(
+        &self,
+        app_id: String,
+        endpoint_id: String,
+        options: Option<EndpointStatsOptions>,
+    ) -> Result<EndpointStats> {
+        let EndpointStatsOptions { since, until } = options.unwrap_or_default();
+        Ok(endpoint_api::v1_endpoint_get_stats(
+            self.cfg,
+            endpoint_api::V1EndpointGetStatsParams {
+                app_id,
+                endpoint_id,
+                since,
+                until,
+            },
         )
+        .await?)
     }
 
     pub async fn replay_missing(
@@ -496,9 +465,9 @@ impl<'a> Endpoint<'a> {
         options: Option<PostOptions>,
     ) -> Result<()> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        endpoint_api::replay_missing_webhooks_api_v1_app_app_id_endpoint_endpoint_id_replay_missing_post(
+        endpoint_api::v1_endpoint_replay(
             self.cfg,
-            endpoint_api::ReplayMissingWebhooksApiV1AppAppIdEndpointEndpointIdReplayMissingPostParams{
+            endpoint_api::V1EndpointReplayParams {
                 app_id,
                 endpoint_id,
                 replay_in,
@@ -514,13 +483,12 @@ impl<'a> Endpoint<'a> {
         app_id: String,
         endpoint_id: String,
     ) -> Result<EndpointTransformationOut> {
-        Ok(endpoint_api::get_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_get(
+        Ok(endpoint_api::v1_endpoint_transformation_get(
             self.cfg,
-            endpoint_api::GetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationGetParams {
+            endpoint_api::V1EndpointTransformationGetParams {
                 app_id,
                 endpoint_id,
-                idempotency_key: None,
-            }
+            },
         )
         .await?)
     }
@@ -531,14 +499,37 @@ impl<'a> Endpoint<'a> {
         endpoint_id: String,
         endpoint_transformation_in: EndpointTransformationIn,
     ) -> Result<()> {
-        endpoint_api::set_endpoint_transformation_api_v1_app_app_id_endpoint_endpoint_id_transformation_patch(self.cfg, endpoint_api::SetEndpointTransformationApiV1AppAppIdEndpointEndpointIdTransformationPatchParams {
-            app_id,
-            endpoint_id,
-            endpoint_transformation_in,
-            idempotency_key: None,
-        }).await?;
+        endpoint_api::v1_endpoint_transformation_partial_update(
+            self.cfg,
+            endpoint_api::V1EndpointTransformationPartialUpdateParams {
+                app_id,
+                endpoint_id,
+                endpoint_transformation_in,
+            },
+        )
+        .await?;
         Ok(())
     }
+
+    pub async fn send_example(
+        &self,
+        app_id: String,
+        endpoint_id: String,
+        event_example_in: EventExampleIn,
+        options: Option<PostOptions>,
+    ) -> Result<MessageOut> {
+        let PostOptions { idempotency_key } = options.unwrap_or_default();
+        Ok(endpoint_api::v1_endpoint_send_example(
+            self.cfg,
+            endpoint_api::V1EndpointSendExampleParams {
+                app_id,
+                endpoint_id,
+                event_example_in,
+                idempotency_key,
+            },
+        )
+        .await?)
+    }
 }
 
 pub type IntegrationListOptions = ListOptions;
@@ -558,18 +549,15 @@ impl<'a> Integration<'a> {
         options: Option<IntegrationListOptions>,
     ) -> Result<ListResponseIntegrationOut> {
         let IntegrationListOptions { iterator, limit } = options.unwrap_or_default();
-        Ok(
-            integration_api::list_integrations_api_v1_app_app_id_integration_get(
-                self.cfg,
-                integration_api::ListIntegrationsApiV1AppAppIdIntegrationGetParams {
-                    app_id,
-                    iterator,
-                    limit,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_list(
+            self.cfg,
+            integration_api::V1IntegrationListParams {
+                app_id,
+                iterator,
+                limit,
+            },
         )
+        .await?)
     }
 
     pub async fn create(
@@ -579,31 +567,23 @@ impl<'a> Integration<'a> {
         options: Option<PostOptions>,
     ) -> Result<IntegrationOut> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(
-            integration_api::create_integration_api_v1_app_app_id_integration_post(
-                self.cfg,
-                integration_api::CreateIntegrationApiV1AppAppIdIntegrationPostParams {
-                    app_id,
-                    integration_in,
-                    idempotency_key,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_create(
+            self.cfg,
+            integration_api::V1IntegrationCreateParams {
+                app_id,
+                integration_in,
+                idempotency_key,
+            },
         )
+        .await?)
     }
 
     pub async fn get(&self, app_id: String, integ_id: String) -> Result<IntegrationOut> {
-        Ok(
-            integration_api::get_integration_api_v1_app_app_id_integration_integ_id_get(
-                self.cfg,
-                integration_api::GetIntegrationApiV1AppAppIdIntegrationIntegIdGetParams {
-                    app_id,
-                    integ_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_get(
+            self.cfg,
+            integration_api::V1IntegrationGetParams { app_id, integ_id },
         )
+        .await?)
     }
 
     pub async fn update(
@@ -611,63 +591,45 @@ impl<'a> Integration<'a> {
         app_id: String,
         integ_id: String,
         integration_update: IntegrationUpdate,
-        options: Option<PostOptions>,
+        _: Option<PostOptions>,
     ) -> Result<IntegrationOut> {
-        let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(
-            integration_api::update_integration_api_v1_app_app_id_integration_integ_id_put(
-                self.cfg,
-                integration_api::UpdateIntegrationApiV1AppAppIdIntegrationIntegIdPutParams {
-                    app_id,
-                    integ_id,
-                    integration_update,
-                    idempotency_key,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_update(
+            self.cfg,
+            integration_api::V1IntegrationUpdateParams {
+                app_id,
+                integ_id,
+                integration_update,
+            },
         )
+        .await?)
     }
 
     pub async fn delete(&self, app_id: String, integ_id: String) -> Result<()> {
-        Ok(
-            integration_api::delete_integration_api_v1_app_app_id_integration_integ_id_delete(
-                self.cfg,
-                integration_api::DeleteIntegrationApiV1AppAppIdIntegrationIntegIdDeleteParams {
-                    app_id,
-                    integ_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_delete(
+            self.cfg,
+            integration_api::V1IntegrationDeleteParams { app_id, integ_id },
         )
+        .await?)
     }
 
     pub async fn get_key(&self, app_id: String, integ_id: String) -> Result<IntegrationKeyOut> {
-        Ok(
-            integration_api::get_integration_key_api_v1_app_app_id_integration_integ_id_key_get(
-                self.cfg,
-                integration_api::GetIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyGetParams {
-                    app_id,
-                    integ_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_get_key(
+            self.cfg,
+            integration_api::V1IntegrationGetKeyParams { app_id, integ_id },
         )
+        .await?)
     }
 
     pub async fn rotate_key(&self, app_id: String, integ_id: String) -> Result<IntegrationKeyOut> {
-        Ok(
-            integration_api::rotate_integration_key_api_v1_app_app_id_integration_integ_id_key_rotate_post(
-                self.cfg,
-                integration_api::RotateIntegrationKeyApiV1AppAppIdIntegrationIntegIdKeyRotatePostParams {
-                    app_id,
-                    integ_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(integration_api::v1_integration_rotate_key(
+            self.cfg,
+            integration_api::V1IntegrationRotateKeyParams {
+                app_id,
+                integ_id,
+                idempotency_key: None,
+            },
         )
+        .await?)
     }
 }
 
@@ -698,14 +660,14 @@ impl<'a> EventType<'a> {
             with_content,
             include_archived,
         } = options.unwrap_or_default();
-        Ok(event_type_api::list_event_types_api_v1_event_type_get(
+        Ok(event_type_api::v1_event_type_list(
             self.cfg,
-            event_type_api::ListEventTypesApiV1EventTypeGetParams {
+            event_type_api::V1EventTypeListParams {
                 iterator,
                 limit,
                 with_content,
                 include_archived,
-                idempotency_key: None,
+                order: None,
             },
         )
         .await?)
@@ -717,9 +679,9 @@ impl<'a> EventType<'a> {
         options: Option<PostOptions>,
     ) -> Result<EventTypeOut> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(event_type_api::create_event_type_api_v1_event_type_post(
+        Ok(event_type_api::v1_event_type_create(
             self.cfg,
-            event_type_api::CreateEventTypeApiV1EventTypePostParams {
+            event_type_api::V1EventTypeCreateParams {
                 event_type_in,
                 idempotency_key,
             },
@@ -728,50 +690,38 @@ impl<'a> EventType<'a> {
     }
 
     pub async fn get(&self, event_type_name: String) -> Result<EventTypeOut> {
-        Ok(
-            event_type_api::get_event_type_api_v1_event_type_event_type_name_get(
-                self.cfg,
-                event_type_api::GetEventTypeApiV1EventTypeEventTypeNameGetParams {
-                    event_type_name,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(event_type_api::v1_event_type_get(
+            self.cfg,
+            event_type_api::V1EventTypeGetParams { event_type_name },
         )
+        .await?)
     }
 
     pub async fn update(
         &self,
         event_type_name: String,
         event_type_update: EventTypeUpdate,
-        options: Option<PostOptions>,
+        _: Option<PostOptions>,
     ) -> Result<EventTypeOut> {
-        let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(
-            event_type_api::update_event_type_api_v1_event_type_event_type_name_put(
-                self.cfg,
-                event_type_api::UpdateEventTypeApiV1EventTypeEventTypeNamePutParams {
-                    event_type_name,
-                    event_type_update,
-                    idempotency_key,
-                },
-            )
-            .await?,
+        Ok(event_type_api::v1_event_type_update(
+            self.cfg,
+            event_type_api::V1EventTypeUpdateParams {
+                event_type_name,
+                event_type_update,
+            },
         )
+        .await?)
     }
 
     pub async fn delete(&self, event_type_name: String) -> Result<()> {
-        Ok(
-            event_type_api::delete_event_type_api_v1_event_type_event_type_name_delete(
-                self.cfg,
-                event_type_api::DeleteEventTypeApiV1EventTypeEventTypeNameDeleteParams {
-                    event_type_name,
-                    expunge: None,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(event_type_api::v1_event_type_delete(
+            self.cfg,
+            event_type_api::V1EventTypeDeleteParams {
+                event_type_name,
+                expunge: None,
+            },
         )
+        .await?)
     }
 }
 
@@ -786,6 +736,7 @@ pub struct MessageListOptions {
     /// RFC3339 date string
     pub after: Option<String>,
     pub channel: Option<String>,
+    pub with_content: Option<bool>,
 }
 
 pub struct Message<'a> {
@@ -809,10 +760,11 @@ impl<'a> Message<'a> {
             before,
             after,
             channel,
+            with_content,
         } = options.unwrap_or_default();
-        Ok(message_api::list_messages_api_v1_app_app_id_msg_get(
+        Ok(message_api::v1_message_list(
             self.cfg,
-            message_api::ListMessagesApiV1AppAppIdMsgGetParams {
+            message_api::V1MessageListParams {
                 app_id,
                 iterator,
                 limit,
@@ -820,7 +772,7 @@ impl<'a> Message<'a> {
                 before,
                 after,
                 channel,
-                idempotency_key: None,
+                with_content,
             },
         )
         .await?)
@@ -833,9 +785,9 @@ impl<'a> Message<'a> {
         options: Option<PostOptions>,
     ) -> Result<MessageOut> {
         let PostOptions { idempotency_key } = options.unwrap_or_default();
-        Ok(message_api::create_message_api_v1_app_app_id_msg_post(
+        Ok(message_api::v1_message_create(
             self.cfg,
-            message_api::CreateMessageApiV1AppAppIdMsgPostParams {
+            message_api::V1MessageCreateParams {
                 app_id,
                 message_in,
                 idempotency_key,
@@ -846,29 +798,23 @@ impl<'a> Message<'a> {
     }
 
     pub async fn get(&self, app_id: String, msg_id: String) -> Result<MessageOut> {
-        Ok(message_api::get_message_api_v1_app_app_id_msg_msg_id_get(
+        Ok(message_api::v1_message_get(
             self.cfg,
-            message_api::GetMessageApiV1AppAppIdMsgMsgIdGetParams {
+            message_api::V1MessageGetParams {
                 app_id,
                 msg_id,
-                idempotency_key: None,
+                with_content: None,
             },
         )
         .await?)
     }
 
     pub async fn expunge_content(&self, app_id: String, msg_id: String) -> Result<()> {
-        Ok(
-            message_api::expunge_message_payload_api_v1_app_app_id_msg_msg_id_content_delete(
-                self.cfg,
-                message_api::ExpungeMessagePayloadApiV1AppAppIdMsgMsgIdContentDeleteParams {
-                    msg_id,
-                    app_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(message_api::v1_message_expunge_content(
+            self.cfg,
+            message_api::V1MessageExpungeContentParams { msg_id, app_id },
         )
+        .await?)
     }
 }
 
@@ -885,6 +831,8 @@ pub struct MessageAttemptListOptions {
     pub channel: Option<String>,
     pub status: Option<MessageStatus>,
     pub status_code_class: Option<StatusCodeClass>,
+    pub with_content: Option<bool>,
+    pub endpoint_id: Option<String>,
 }
 
 pub struct MessageAttempt<'a> {
@@ -911,27 +859,26 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class,
+            endpoint_id,
+            with_content: _,
         } = options.unwrap_or_default();
-        Ok(
-            message_attempt_api::list_attempts_by_msg_api_v1_app_app_id_attempt_msg_msg_id_get(
-                self.cfg,
-                message_attempt_api::ListAttemptsByMsgApiV1AppAppIdAttemptMsgMsgIdGetParams {
-                    app_id,
-                    msg_id,
-                    iterator,
-                    limit,
-                    event_types,
-                    before,
-                    after,
-                    channel,
-                    status,
-                    status_code_class,
-                    endpoint_id: None,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(message_attempt_api::v1_message_attempt_list_by_msg(
+            self.cfg,
+            message_attempt_api::V1MessageAttemptListByMsgParams {
+                app_id,
+                msg_id,
+                iterator,
+                limit,
+                event_types,
+                before,
+                after,
+                channel,
+                status,
+                status_code_class,
+                endpoint_id,
+            },
         )
+        .await?)
     }
 
     pub async fn list_by_endpoint(
@@ -949,26 +896,25 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class,
+            endpoint_id: _,
+            with_content: _,
         } = options.unwrap_or_default();
-        Ok(
-            message_attempt_api::list_attempts_by_endpoint_api_v1_app_app_id_attempt_endpoint_endpoint_id_get(
-                self.cfg,
-                message_attempt_api::ListAttemptsByEndpointApiV1AppAppIdAttemptEndpointEndpointIdGetParams {
-                    app_id,
-                    endpoint_id,
-                    iterator,
-                    limit,
-                    event_types,
-                    before,
-                    after,
-                    channel,
-                    status,
-                    status_code_class,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(message_attempt_api::v1_message_attempt_list_by_endpoint(
+            self.cfg,
+            message_attempt_api::V1MessageAttemptListByEndpointParams {
+                app_id,
+                endpoint_id,
+                iterator,
+                limit,
+                event_types,
+                before,
+                after,
+                channel,
+                status,
+                status_code_class,
+            },
         )
+        .await?)
     }
 
     pub async fn list_attempted_messages(
@@ -986,11 +932,13 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class: _,
+            with_content,
+            endpoint_id: _,
         } = options.unwrap_or_default();
         Ok(
-            message_attempt_api::list_attempted_messages_api_v1_app_app_id_endpoint_endpoint_id_msg_get(
+            message_attempt_api::v1_message_attempt_list_attempted_messages(
                 self.cfg,
-                message_attempt_api::ListAttemptedMessagesApiV1AppAppIdEndpointEndpointIdMsgGetParams {
+                message_attempt_api::V1MessageAttemptListAttemptedMessagesParams {
                     app_id,
                     endpoint_id,
                     iterator,
@@ -999,7 +947,7 @@ impl<'a> MessageAttempt<'a> {
                     after,
                     channel,
                     status,
-                    idempotency_key: None,
+                    with_content,
                 },
             )
             .await?,
@@ -1014,14 +962,13 @@ impl<'a> MessageAttempt<'a> {
     ) -> Result<ListResponseMessageEndpointOut> {
         let ListOptions { iterator, limit } = options.unwrap_or_default();
         Ok(
-            message_attempt_api::list_attempted_destinations_api_v1_app_app_id_msg_msg_id_endpoint_get(
+            message_attempt_api::v1_message_attempt_list_attempted_destinations(
                 self.cfg,
-                message_attempt_api::ListAttemptedDestinationsApiV1AppAppIdMsgMsgIdEndpointGetParams {
+                message_attempt_api::V1MessageAttemptListAttemptedDestinationsParams {
                     app_id,
                     msg_id,
                     iterator,
                     limit,
-                    idempotency_key: None,
                 },
             )
             .await?,
@@ -1044,24 +991,27 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class: _,
+            endpoint_id: _,
+            with_content: _,
         } = options.unwrap_or_default();
-        Ok(message_attempt_api::list_attempts_for_endpoint_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_attempt_get(
-            self.cfg,
-            message_attempt_api::ListAttemptsForEndpointApiV1AppAppIdMsgMsgIdEndpointEndpointIdAttemptGetParams{
-                app_id,
-                endpoint_id,
-                msg_id,
-                iterator,
-                limit,
-                event_types,
-                before,
-                after,
-                channel,
-                status,
-                idempotency_key: None,
-            },
+        Ok(
+            message_attempt_api::v1_message_attempt_list_by_endpoint_deprecated(
+                self.cfg,
+                message_attempt_api::V1MessageAttemptListByEndpointDeprecatedParams {
+                    app_id,
+                    endpoint_id,
+                    msg_id,
+                    iterator,
+                    limit,
+                    event_types,
+                    before,
+                    after,
+                    channel,
+                    status,
+                },
+            )
+            .await?,
         )
-        .await?)
     }
 
     pub async fn get(
@@ -1070,33 +1020,28 @@ impl<'a> MessageAttempt<'a> {
         msg_id: String,
         attempt_id: String,
     ) -> Result<MessageAttemptOut> {
-        Ok(
-            message_attempt_api::get_attempt_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_get(
-                self.cfg,
-                message_attempt_api::GetAttemptApiV1AppAppIdMsgMsgIdAttemptAttemptIdGetParams {
-                    app_id,
-                    msg_id,
-                    attempt_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(message_attempt_api::v1_message_attempt_get(
+            self.cfg,
+            message_attempt_api::V1MessageAttemptGetParams {
+                app_id,
+                msg_id,
+                attempt_id,
+            },
         )
+        .await?)
     }
 
     pub async fn resend(&self, app_id: String, msg_id: String, endpoint_id: String) -> Result<()> {
-        Ok(
-            message_attempt_api::resend_webhook_api_v1_app_app_id_msg_msg_id_endpoint_endpoint_id_resend_post(
-                self.cfg,
-                message_attempt_api::ResendWebhookApiV1AppAppIdMsgMsgIdEndpointEndpointIdResendPostParams {
-                    app_id,
-                    msg_id,
-                    endpoint_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?,
+        Ok(message_attempt_api::v1_message_attempt_resend(
+            self.cfg,
+            message_attempt_api::V1MessageAttemptResendParams {
+                app_id,
+                msg_id,
+                endpoint_id,
+                idempotency_key: None,
+            },
         )
+        .await?)
     }
 
     pub async fn expunge_content(
@@ -1105,17 +1050,61 @@ impl<'a> MessageAttempt<'a> {
         msg_id: String,
         attempt_id: String,
     ) -> Result<()> {
-        Ok(
-            message_attempt_api::expunge_attempt_content_api_v1_app_app_id_msg_msg_id_attempt_attempt_id_content_delete(
-                self.cfg,
-                message_attempt_api::ExpungeAttemptContentApiV1AppAppIdMsgMsgIdAttemptAttemptIdContentDeleteParams {
-                    app_id,
-                    msg_id,
-                    attempt_id,
-                    idempotency_key: None,
-                },
-            )
-            .await?
+        Ok(message_attempt_api::v1_message_attempt_expunge_content(
+            self.cfg,
+            message_attempt_api::V1MessageAttemptExpungeContentParams {
+                app_id,
+                msg_id,
+                attempt_id,
+            },
         )
+        .await?)
+    }
+}
+
+#[derive(Default)]
+pub struct BackgroundTaskListOptions {
+    pub iterator: Option<String>,
+    pub limit: Option<i32>,
+    pub order: Option<Ordering>,
+    pub status: Option<BackgroundTaskStatus>,
+    pub task: Option<BackgroundTaskType>,
+}
+
+pub struct BackgroundTask<'a> {
+    cfg: &'a Configuration,
+}
+
+impl<'a> BackgroundTask<'a> {
+    pub async fn list(
+        &self,
+        options: Option<BackgroundTaskListOptions>,
+    ) -> Result<ListResponseBackgroundTaskOut> {
+        let BackgroundTaskListOptions {
+            iterator,
+            limit,
+            order,
+            status,
+            task,
+        } = options.unwrap_or_default();
+        Ok(background_tasks_api::list_background_tasks(
+            self.cfg,
+            background_tasks_api::ListBackgroundTasksParams {
+                status,
+                task,
+                limit,
+                iterator,
+                order,
+            },
+        )
+        .await?)
+    }
+
+    pub async fn get(&self, task_id: String) -> Result<BackgroundTaskOut> {
+        Ok(background_tasks_api::get_background_task(
+            self.cfg,
+            background_tasks_api::GetBackgroundTaskParams { task_id },
+        )
+        .await?)
     }
 }
diff --git a/rust/src/error.rs b/rust/src/error.rs
index 714183e60..e045b73cf 100644
--- a/rust/src/error.rs
+++ b/rust/src/error.rs
@@ -30,7 +30,7 @@ impl fmt::Display for Error {
         match self {
             Error::Generic(s) => s.fmt(f),
             Error::Http(e) => format!("Http error (status={}) {:?}", e.status, e.payload).fmt(f),
-            Error::Validation(e) => format!("Varidation error {:?}", e.payload).fmt(f),
+            Error::Validation(e) => format!("Validation error {:?}", e.payload).fmt(f),
         }
     }
 }
diff --git a/server/Cargo.lock b/server/Cargo.lock
index 7de59c3ac..3b9433e75 100644
--- a/server/Cargo.lock
+++ b/server/Cargo.lock
@@ -52,9 +52,8 @@ dependencies = [
 
 [[package]]
 name = "aide"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "befdff0b4683a0824fc8719ce639a252d9d62cd89c8d0004c39e2417128c1eb8"
+version = "0.10.0"
+source = "git+https://github.com/svix/aide?rev=e6e9af3#e6e9af320757130074ca9cd537d342b5496d527d"
 dependencies = [
  "aide-macros",
  "axum",
@@ -65,6 +64,7 @@ dependencies = [
  "schemars",
  "serde",
  "serde_json",
+ "serde_qs",
  "thiserror",
  "tower-layer",
  "tower-service",
@@ -74,13 +74,12 @@ dependencies = [
 [[package]]
 name = "aide-macros"
 version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ae9102630967c9c07c40a3383cd1e6b043bdd203793731ad39eac7f7dce0d4c"
+source = "git+https://github.com/svix/aide?rev=e6e9af3#e6e9af320757130074ca9cd537d342b5496d527d"
 dependencies = [
  "darling",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -89,6 +88,54 @@ version = "0.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd"
 
+[[package]]
+name = "amq-protocol"
+version = "7.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acc7cad07d1b4533fcb46f0819a6126fa201fd0385469aba75e405424f3fe009"
+dependencies = [
+ "amq-protocol-tcp",
+ "amq-protocol-types",
+ "amq-protocol-uri",
+ "cookie-factory",
+ "nom",
+ "serde",
+]
+
+[[package]]
+name = "amq-protocol-tcp"
+version = "7.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d8b20aba8c35a0b885e1e978eff456ced925730a4e012e63e4ff89a1deb602b"
+dependencies = [
+ "amq-protocol-uri",
+ "tcp-stream",
+ "tracing",
+]
+
+[[package]]
+name = "amq-protocol-types"
+version = "7.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e245e0e9083b6a6db5f8c10013074cb382266eb9e2a37204d19c651b8d3b8114"
+dependencies = [
+ "cookie-factory",
+ "nom",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "amq-protocol-uri"
+version = "7.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56987108bf48d2eb500cae8896cd9291564eedd8744776ecc5c3338a8b2ca5f8"
+dependencies = [
+ "amq-protocol-types",
+ "percent-encoding",
+ "url",
+]
+
 [[package]]
 name = "android_system_properties"
 version = "0.1.5"
@@ -100,9 +147,101 @@ dependencies = [
 
 [[package]]
 name = "anyhow"
-version = "1.0.69"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
+
+[[package]]
+name = "async-channel"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800"
+checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb"
+dependencies = [
+ "async-lock",
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "slab",
+]
+
+[[package]]
+name = "async-global-executor"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
+dependencies = [
+ "async-channel",
+ "async-executor",
+ "async-io",
+ "async-lock",
+ "blocking",
+ "futures-lite",
+ "once_cell",
+]
+
+[[package]]
+name = "async-global-executor-trait"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33dd14c5a15affd2abcff50d84efd4009ada28a860f01c14f9d654f3e81b3f75"
+dependencies = [
+ "async-global-executor",
+ "async-trait",
+ "executor-trait",
+]
+
+[[package]]
+name = "async-io"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
+dependencies = [
+ "async-lock",
+ "autocfg 1.1.0",
+ "cfg-if",
+ "concurrent-queue",
+ "futures-lite",
+ "log",
+ "parking",
+ "polling",
+ "rustix 0.37.7",
+ "slab",
+ "socket2",
+ "waker-fn",
+]
+
+[[package]]
+name = "async-lock"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "async-reactor-trait"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6012d170ad00de56c9ee354aef2e358359deb1ec504254e0e5a3774771de0e"
+dependencies = [
+ "async-io",
+ "async-trait",
+ "futures-core",
+ "reactor-trait",
+]
 
 [[package]]
 name = "async-stream"
@@ -123,18 +262,24 @@ checksum = "e4655ae1a7b0cdf149156f780c5bf3f1352bc53cbd9e0a361a7ef7b22947e965"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
+[[package]]
+name = "async-task"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
+
 [[package]]
 name = "async-trait"
-version = "0.1.66"
+version = "0.1.67"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b84f9ebcc6c1f5b8cb160f6990096a5c127f423fcb6e1ccc46c370cbdfb75dfc"
+checksum = "86ea188f25f0255d8f92797797c97ebf5631fa88178beb1a46fdf5622c9a00e4"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
@@ -155,6 +300,12 @@ dependencies = [
  "autocfg 1.1.0",
 ]
 
+[[package]]
+name = "atomic-waker"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
+
 [[package]]
 name = "autocfg"
 version = "0.1.8"
@@ -199,7 +350,7 @@ dependencies = [
  "sync_wrapper",
  "tokio",
  "tower",
- "tower-http",
+ "tower-http 0.3.5",
  "tower-layer",
  "tower-service",
 ]
@@ -231,7 +382,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -266,26 +417,26 @@ checksum = "e6b4d9b1225d28d360ec6a231d65af1fd99a2a095154c8040689617290569c5c"
 
 [[package]]
 name = "bb8"
-version = "0.7.1"
+version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e9f4fa9768efd269499d8fba693260cfc670891cf6de3adc935588447a77cc8"
+checksum = "1627eccf3aa91405435ba240be23513eeca466b5dc33866422672264de061582"
 dependencies = [
  "async-trait",
  "futures-channel",
  "futures-util",
- "parking_lot 0.11.2",
+ "parking_lot 0.12.1",
  "tokio",
 ]
 
 [[package]]
 name = "bb8-redis"
-version = "0.10.1"
+version = "0.13.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c440295545cb69b3cec992ae8844fbb1de1c84f2f90248438af287e14bb09bde"
+checksum = "cd456361ba8e4e7f5fe58e1697ce078a149c85ebce13bf9c6b483d3f566fc9c3"
 dependencies = [
  "async-trait",
  "bb8",
- "redis",
+ "redis 0.23.0",
 ]
 
 [[package]]
@@ -329,13 +480,37 @@ dependencies = [
 
 [[package]]
 name = "block-buffer"
-version = "0.10.3"
+version = "0.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
 dependencies = [
  "generic-array",
 ]
 
+[[package]]
+name = "block-padding"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "blocking"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
+dependencies = [
+ "async-channel",
+ "async-lock",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+ "log",
+]
+
 [[package]]
 name = "bumpalo"
 version = "3.12.0"
@@ -360,6 +535,15 @@ version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
 
+[[package]]
+name = "cbc"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6"
+dependencies = [
+ "cipher 0.4.4",
+]
+
 [[package]]
 name = "cc"
 version = "1.0.79"
@@ -379,7 +563,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5c80e5460aa66fe3b91d40bcbdab953a597b60053e34d684ac6903f863b680a6"
 dependencies = [
  "cfg-if",
- "cipher",
+ "cipher 0.3.0",
  "cpufeatures",
  "zeroize",
 ]
@@ -392,16 +576,16 @@ checksum = "a18446b09be63d457bbec447509e85f662f32952b035ce892290396bc0b0cff5"
 dependencies = [
  "aead",
  "chacha20",
- "cipher",
+ "cipher 0.3.0",
  "poly1305",
  "zeroize",
 ]
 
 [[package]]
 name = "chrono"
-version = "0.4.23"
+version = "0.4.24"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
+checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
 dependencies = [
  "iana-time-zone",
  "js-sys",
@@ -422,11 +606,21 @@ dependencies = [
  "generic-array",
 ]
 
+[[package]]
+name = "cipher"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad"
+dependencies = [
+ "crypto-common",
+ "inout",
+]
+
 [[package]]
 name = "clap"
-version = "4.1.8"
+version = "4.1.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5"
+checksum = "3c911b090850d79fc64fe9ea01e28e465f65e821e08813ced95bced72f7a8a9b"
 dependencies = [
  "bitflags",
  "clap_derive",
@@ -439,22 +633,21 @@ dependencies = [
 
 [[package]]
 name = "clap_derive"
-version = "4.1.8"
+version = "4.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44bec8e5c9d09e439c4335b1af0abaab56dcf3b94999a936e1bb47b9134288f0"
+checksum = "9a932373bab67b984c790ddf2c9ca295d8e3af3b7ef92de5a5bacdccdee4b09b"
 dependencies = [
  "heck 0.4.1",
- "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.3.2"
+version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "350b9cf31731f9957399229e9b2adc51eeabdfbe9d71d9a0552275fd12710d09"
+checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
 dependencies = [
  "os_str_bytes",
 ]
@@ -495,6 +688,15 @@ dependencies = [
  "tokio-util 0.7.7",
 ]
 
+[[package]]
+name = "concurrent-queue"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
+dependencies = [
+ "crossbeam-utils",
+]
+
 [[package]]
 name = "const-oid"
 version = "0.6.2"
@@ -507,6 +709,12 @@ version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3"
 
+[[package]]
+name = "cookie-factory"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396de984970346b0d9e93d1415082923c679e5ae5c3ee3dcbd104f5610af126b"
+
 [[package]]
 name = "core-foundation"
 version = "0.9.3"
@@ -555,9 +763,9 @@ checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff"
 
 [[package]]
 name = "crossbeam-channel"
-version = "0.5.7"
+version = "0.5.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf2b3e8478797446514c91ef04bafcb59faba183e621ad488df88983cc14128c"
+checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
 dependencies = [
  "cfg-if",
  "crossbeam-utils",
@@ -633,9 +841,9 @@ checksum = "f3b7eb4404b8195a9abb6356f4ac07d8ba267045c8d6d220ac4dc992e6cc75df"
 
 [[package]]
 name = "cxx"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a140f260e6f3f79013b8bfc65e7ce630c9ab4388c6a89c71e07226f49487b72"
+checksum = "a9c00419335c41018365ddf7e4d5f1c12ee3659ddcf3e01974650ba1de73d038"
 dependencies = [
  "cc",
  "cxxbridge-flags",
@@ -645,9 +853,9 @@ dependencies = [
 
 [[package]]
 name = "cxx-build"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da6383f459341ea689374bf0a42979739dc421874f112ff26f829b8040b8e613"
+checksum = "fb8307ad413a98fff033c8545ecf133e3257747b3bae935e7602aab8aa92d4ca"
 dependencies = [
  "cc",
  "codespan-reporting",
@@ -655,31 +863,31 @@ dependencies = [
  "proc-macro2",
  "quote",
  "scratch",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
 name = "cxxbridge-flags"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90201c1a650e95ccff1c8c0bb5a343213bdd317c6e600a93075bca2eff54ec97"
+checksum = "edc52e2eb08915cb12596d29d55f0b5384f00d697a646dbd269b6ecb0fbd9d31"
 
 [[package]]
 name = "cxxbridge-macro"
-version = "1.0.92"
+version = "1.0.93"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56"
+checksum = "631569015d0d8d54e6c241733f944042623ab6df7bc3be7466874b05fcdb1c5f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
 name = "darling"
-version = "0.14.3"
+version = "0.14.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c0808e1bd8671fb44a113a14e13497557533369847788fa2ae912b6ebfce9fa8"
+checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
 dependencies = [
  "darling_core",
  "darling_macro",
@@ -687,27 +895,27 @@ dependencies = [
 
 [[package]]
 name = "darling_core"
-version = "0.14.3"
+version = "0.14.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "001d80444f28e193f30c2f293455da62dcf9a6b29918a4253152ae2b1de592cb"
+checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
 dependencies = [
  "fnv",
  "ident_case",
  "proc-macro2",
  "quote",
  "strsim",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "darling_macro"
-version = "0.14.3"
+version = "0.14.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b36230598a2d5de7ec1c6f51f72d8a99a9208daff41de2084d06e3fd3ea56685"
+checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
 dependencies = [
  "darling_core",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -736,6 +944,15 @@ dependencies = [
  "pem-rfc7468 0.3.1",
 ]
 
+[[package]]
+name = "des"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdd80ce8ce993de27e9f063a444a4d53ce8e8db4c1f00cc03af5ad5a9867a1e"
+dependencies = [
+ "cipher 0.4.4",
+]
+
 [[package]]
 name = "digest"
 version = "0.9.0"
@@ -751,7 +968,7 @@ version = "0.10.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f"
 dependencies = [
- "block-buffer 0.10.3",
+ "block-buffer 0.10.4",
  "crypto-common",
  "subtle",
 ]
@@ -776,6 +993,12 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "doc-comment"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+
 [[package]]
 name = "dotenv"
 version = "0.15.0"
@@ -784,9 +1007,9 @@ checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
 
 [[package]]
 name = "dotenvy"
-version = "0.15.6"
+version = "0.15.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0"
+checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b"
 
 [[package]]
 name = "dyn-clone"
@@ -859,7 +1082,7 @@ dependencies = [
  "heck 0.4.1",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -871,7 +1094,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -885,6 +1108,17 @@ dependencies = [
  "winapi",
 ]
 
+[[package]]
+name = "errno"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
 [[package]]
 name = "errno-dragonfly"
 version = "0.1.2"
@@ -901,6 +1135,15 @@ version = "2.5.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
 
+[[package]]
+name = "executor-trait"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a1052dd43212a7777ec6a69b117da52f5e52f07aec47d00c1a2b33b85d06b08"
+dependencies = [
+ "async-trait",
+]
+
 [[package]]
 name = "fancy-regex"
 version = "0.10.0"
@@ -952,6 +1195,18 @@ version = "0.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
 
+[[package]]
+name = "flume"
+version = "0.10.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "pin-project",
+ "spin 0.9.8",
+]
+
 [[package]]
 name = "fnv"
 version = "1.0.7"
@@ -994,9 +1249,9 @@ dependencies = [
 
 [[package]]
 name = "futures"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "13e2792b0ff0340399d58445b88fd9770e3489eff258a4cbc1523418f12abf84"
+checksum = "531ac96c6ff5fd7c62263c5e3c67a603af4fcaee2e1a0ae5565ba3a11e69e549"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1009,9 +1264,9 @@ dependencies = [
 
 [[package]]
 name = "futures-channel"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5"
+checksum = "164713a5a0dcc3e7b4b1ed7d3b433cabc18025386f9339346e8daf15963cf7ac"
 dependencies = [
  "futures-core",
  "futures-sink",
@@ -1019,15 +1274,15 @@ dependencies = [
 
 [[package]]
 name = "futures-core"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608"
+checksum = "86d7a0c1aa76363dac491de0ee99faf6941128376f1cf96f07db7603b7de69dd"
 
 [[package]]
 name = "futures-executor"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e"
+checksum = "1997dd9df74cdac935c76252744c1ed5794fac083242ea4fe77ef3ed60ba0f83"
 dependencies = [
  "futures-core",
  "futures-task",
@@ -1047,38 +1302,53 @@ dependencies = [
 
 [[package]]
 name = "futures-io"
-version = "0.3.26"
+version = "0.3.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91"
+
+[[package]]
+name = "futures-lite"
+version = "1.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531"
+checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite",
+ "waker-fn",
+]
 
 [[package]]
 name = "futures-macro"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70"
+checksum = "3eb14ed937631bd8b8b8977f2c198443447a8355b6e3ca599f38c975e5a963b6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "futures-sink"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364"
+checksum = "ec93083a4aecafb2a80a885c9de1f0ccae9dbd32c2bb54b0c3a65690e0b8d2f2"
 
 [[package]]
 name = "futures-task"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366"
+checksum = "fd65540d33b37b16542a0438c12e6aeead10d4ac5d05bd3f805b8f35ab592879"
 
 [[package]]
 name = "futures-util"
-version = "0.3.26"
+version = "0.3.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1"
+checksum = "3ef6b17e481503ec85211fed8f39d1970f128935ca1f814cd32ac4a6842e84ab"
 dependencies = [
  "futures-channel",
  "futures-core",
@@ -1126,9 +1396,9 @@ dependencies = [
 
 [[package]]
 name = "h2"
-version = "0.3.16"
+version = "0.3.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d"
+checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21"
 dependencies = [
  "bytes",
  "fnv",
@@ -1396,16 +1666,16 @@ dependencies = [
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.53"
+version = "0.1.54"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765"
+checksum = "0c17cc76786e99f8d2f055c11159e7f0091c42474dcc3189fbab96072e873e6d"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
  "iana-time-zone-haiku",
  "js-sys",
  "wasm-bindgen",
- "winapi",
+ "windows",
 ]
 
 [[package]]
@@ -1468,6 +1738,16 @@ version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
 
+[[package]]
+name = "inout"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
+dependencies = [
+ "block-padding",
+ "generic-array",
+]
+
 [[package]]
 name = "instant"
 version = "0.1.12"
@@ -1479,10 +1759,11 @@ dependencies = [
 
 [[package]]
 name = "io-lifetimes"
-version = "1.0.5"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3"
+checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb"
 dependencies = [
+ "hermit-abi 0.3.1",
  "libc",
  "windows-sys 0.45.0",
 ]
@@ -1510,13 +1791,13 @@ dependencies = [
 
 [[package]]
 name = "is-terminal"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857"
+checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
 dependencies = [
  "hermit-abi 0.3.1",
  "io-lifetimes",
- "rustix",
+ "rustix 0.36.11",
  "windows-sys 0.45.0",
 ]
 
@@ -1618,20 +1899,42 @@ dependencies = [
  "sha2 0.9.9",
 ]
 
+[[package]]
+name = "lapin"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd03ea5831b44775e296239a64851e2fd14a80a363d202ba147009ffc994ff0f"
+dependencies = [
+ "amq-protocol",
+ "async-global-executor-trait",
+ "async-reactor-trait",
+ "async-trait",
+ "executor-trait",
+ "flume",
+ "futures-core",
+ "futures-io",
+ "parking_lot 0.12.1",
+ "pinky-swear",
+ "reactor-trait",
+ "serde",
+ "tracing",
+ "waker-fn",
+]
+
 [[package]]
 name = "lazy_static"
 version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 dependencies = [
- "spin",
+ "spin 0.5.2",
 ]
 
 [[package]]
 name = "libc"
-version = "0.2.139"
+version = "0.2.140"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
+checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
 
 [[package]]
 name = "libm"
@@ -1669,6 +1972,12 @@ version = "0.1.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
 
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f"
+
 [[package]]
 name = "lock_api"
 version = "0.4.9"
@@ -1741,9 +2050,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
 
 [[package]]
 name = "mime"
-version = "0.3.16"
+version = "0.3.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
 
 [[package]]
 name = "mime_guess"
@@ -1946,7 +2255,7 @@ dependencies = [
  "proc-macro-crate",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -1963,9 +2272,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
 
 [[package]]
 name = "openssl"
-version = "0.10.45"
+version = "0.10.48"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b102428fd03bc5edf97f62620f7298614c45cedf287c271e7ed450bbaf83f2e1"
+checksum = "518915b97df115dd36109bfa429a48b8f737bd05508cf9588977b599648926d2"
 dependencies = [
  "bitflags",
  "cfg-if",
@@ -1984,7 +2293,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -1995,9 +2304,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.80"
+version = "0.9.83"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23bbbf7854cd45b83958ebe919f0e8e516793727652e27fda10a8384cfc790b7"
+checksum = "666416d899cf077260dac8698d60a60b435a46d57e82acb1be3d0dad87284e5b"
 dependencies = [
  "autocfg 1.1.0",
  "cc",
@@ -2059,9 +2368,9 @@ dependencies = [
 
 [[package]]
 name = "os_str_bytes"
-version = "6.4.1"
+version = "6.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
+checksum = "ceedf44fb00f2d1984b0bc98102627ce622e083e49a5bacdb3e514fa4238e267"
 
 [[package]]
 name = "ouroboros"
@@ -2083,7 +2392,7 @@ dependencies = [
  "proc-macro-error",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2092,6 +2401,23 @@ version = "0.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
 
+[[package]]
+name = "p12"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4873306de53fe82e7e484df31e1e947d61514b6ea2ed6cd7b45d63006fd9224"
+dependencies = [
+ "cbc",
+ "cipher 0.4.4",
+ "des",
+ "getrandom",
+ "hmac 0.12.1",
+ "lazy_static",
+ "rc2",
+ "sha1 0.10.5",
+ "yasna",
+]
+
 [[package]]
 name = "p256"
 version = "0.10.1"
@@ -2104,6 +2430,12 @@ dependencies = [
  "sha2 0.9.9",
 ]
 
+[[package]]
+name = "parking"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
+
 [[package]]
 name = "parking_lot"
 version = "0.11.2"
@@ -2160,9 +2492,9 @@ checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79"
 
 [[package]]
 name = "pear"
-version = "0.2.3"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702"
+checksum = "0ec95680a7087503575284e5063e14b694b7a9c0b065e5dceec661e0497127e8"
 dependencies = [
  "inlinable_string",
  "pear_codegen",
@@ -2171,14 +2503,14 @@ dependencies = [
 
 [[package]]
 name = "pear_codegen"
-version = "0.2.3"
+version = "0.2.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0"
+checksum = "9661a3a53f93f09f2ea882018e4d7c88f6ff2956d809a276060476fd8c879d3c"
 dependencies = [
  "proc-macro2",
  "proc-macro2-diagnostics",
  "quote",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
@@ -2232,7 +2564,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2247,6 +2579,18 @@ version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
+[[package]]
+name = "pinky-swear"
+version = "6.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d894b67aa7a4bf295db5e85349078c604edaa6fa5c8721e8eca3c7729a27f2ac"
+dependencies = [
+ "doc-comment",
+ "flume",
+ "parking_lot 0.12.1",
+ "tracing",
+]
+
 [[package]]
 name = "pkcs1"
 version = "0.2.4"
@@ -2288,6 +2632,22 @@ version = "0.3.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
 
+[[package]]
+name = "polling"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4be1c66a6add46bff50935c313dae30a5030cf8385c5206e8a95e9e9def974aa"
+dependencies = [
+ "autocfg 1.1.0",
+ "bitflags",
+ "cfg-if",
+ "concurrent-queue",
+ "libc",
+ "log",
+ "pin-project-lite",
+ "windows-sys 0.48.0",
+]
+
 [[package]]
 name = "poly1305"
 version = "0.7.2"
@@ -2324,7 +2684,7 @@ dependencies = [
  "proc-macro-error-attr",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "version_check",
 ]
 
@@ -2341,22 +2701,22 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.51"
+version = "1.0.53"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6"
+checksum = "ba466839c78239c09faf015484e5cc04860f88242cff4d03eb038f04b4699b73"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "proc-macro2-diagnostics"
-version = "0.9.1"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada"
+checksum = "606c4ba35817e2922a308af55ad51bab3645b59eae5c570d4a6cf07e36bd493b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.8",
  "version_check",
  "yansi",
 ]
@@ -2401,7 +2761,7 @@ dependencies = [
  "itertools",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2422,9 +2782,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
 
 [[package]]
 name = "quote"
-version = "1.0.23"
+version = "1.0.26"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
+checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
 dependencies = [
  "proc-macro2",
 ]
@@ -2459,6 +2819,26 @@ dependencies = [
  "getrandom",
 ]
 
+[[package]]
+name = "rc2"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62c64daa8e9438b84aaae55010a93f396f8e60e3911590fcba770d04643fc1dd"
+dependencies = [
+ "cipher 0.4.4",
+]
+
+[[package]]
+name = "reactor-trait"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "438a4293e4d097556730f4711998189416232f009c137389e0f961d2bc0ddc58"
+dependencies = [
+ "async-trait",
+ "futures-core",
+ "futures-io",
+]
+
 [[package]]
 name = "redis"
 version = "0.21.7"
@@ -2470,12 +2850,36 @@ dependencies = [
  "combine",
  "futures-util",
  "itoa",
- "native-tls",
  "percent-encoding",
  "pin-project-lite",
  "ryu",
  "sha1 0.6.1",
  "tokio",
+ "tokio-util 0.7.7",
+ "url",
+]
+
+[[package]]
+name = "redis"
+version = "0.23.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ea8c51b5dc1d8e5fd3350ec8167f464ec0995e79f2e90a075b63371500d557f"
+dependencies = [
+ "async-trait",
+ "bytes",
+ "combine",
+ "crc16",
+ "futures",
+ "futures-util",
+ "itoa",
+ "log",
+ "native-tls",
+ "percent-encoding",
+ "pin-project-lite",
+ "rand",
+ "ryu",
+ "sha1_smol",
+ "tokio",
  "tokio-native-tls",
  "tokio-util 0.7.7",
  "url",
@@ -2491,7 +2895,7 @@ dependencies = [
  "log",
  "pin-project-lite",
  "rand",
- "redis",
+ "redis 0.21.7",
  "tokio",
 ]
 
@@ -2517,9 +2921,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.7.1"
+version = "1.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
+checksum = "cce168fea28d3e05f158bda4576cf0c844d5045bc2cc3620fa0292ed5bb5814c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -2537,15 +2941,15 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.6.28"
+version = "0.6.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 
 [[package]]
 name = "reqwest"
-version = "0.11.14"
+version = "0.11.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9"
+checksum = "0ba30cc2c0cd02af1222ed216ba659cdb2f879dfe3181852fe7c50b1d0005949"
 dependencies = [
  "base64 0.21.0",
  "bytes",
@@ -2612,7 +3016,7 @@ dependencies = [
  "cc",
  "libc",
  "once_cell",
- "spin",
+ "spin 0.5.2",
  "untrusted",
  "web-sys",
  "winapi",
@@ -2640,15 +3044,29 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.36.9"
+version = "0.36.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db4165c9963ab29e422d6c26fbc1d37f15bace6b2810221f9d925023480fcf0e"
+dependencies = [
+ "bitflags",
+ "errno 0.2.8",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys 0.1.4",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "rustix"
+version = "0.37.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc"
+checksum = "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d"
 dependencies = [
  "bitflags",
- "errno",
+ "errno 0.3.1",
  "io-lifetimes",
  "libc",
- "linux-raw-sys",
+ "linux-raw-sys 0.3.1",
  "windows-sys 0.45.0",
 ]
 
@@ -2664,6 +3082,30 @@ dependencies = [
  "webpki",
 ]
 
+[[package]]
+name = "rustls-connector"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c6a18f8d10f71bce9bca6eaeb80429460e652f3bcf0381f0c5f8954abf7b3b8"
+dependencies = [
+ "log",
+ "rustls",
+ "rustls-native-certs",
+ "webpki",
+]
+
+[[package]]
+name = "rustls-native-certs"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50"
+dependencies = [
+ "openssl-probe",
+ "rustls-pemfile",
+ "schannel",
+ "security-framework",
+]
+
 [[package]]
 name = "rustls-pemfile"
 version = "1.0.2"
@@ -2718,7 +3160,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "serde_derive_internals",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2779,7 +3221,7 @@ dependencies = [
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2814,7 +3256,7 @@ dependencies = [
  "heck 0.3.3",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "thiserror",
 ]
 
@@ -2837,7 +3279,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2878,22 +3320,22 @@ dependencies = [
 
 [[package]]
 name = "serde"
-version = "1.0.152"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
+checksum = "771d4d9c4163ee138805e12c710dd365e4f44be8be0503cb1bb9eb989425d9c9"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.152"
+version = "1.0.158"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
+checksum = "e801c1712f48475582b7696ac71e0ca34ebb30e09338425384269d9717c62cad"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
@@ -2904,7 +3346,7 @@ checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -2920,11 +3362,24 @@ dependencies = [
 
 [[package]]
 name = "serde_path_to_error"
-version = "0.1.10"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7f05c1d5476066defcdfacce1f52fc3cae3af1d3089727100c02ae92e5abbe0"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_qs"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "db0969fff533976baadd92e08b1d102c5a3d8a8049eadfd69d4d1e3c5b2ed189"
+checksum = "c679fa27b429f2bb57fd4710257e643e86c966e716037259f8baa33de594a1b6"
 dependencies = [
+ "axum",
+ "futures",
+ "percent-encoding",
  "serde",
+ "thiserror",
 ]
 
 [[package]]
@@ -3048,6 +3503,15 @@ version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
 
+[[package]]
+name = "spin"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
+dependencies = [
+ "lock_api",
+]
+
 [[package]]
 name = "spki"
 version = "0.4.1"
@@ -3080,9 +3544,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx"
-version = "0.6.2"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428"
+checksum = "f8de3b03a925878ed54a954f621e64bf55a3c1bd29652d0d1a17830405350188"
 dependencies = [
  "sqlx-core",
  "sqlx-macros",
@@ -3090,9 +3554,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-core"
-version = "0.6.2"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105"
+checksum = "fa8241483a83a3f33aa5fff7e7d9def398ff9990b2752b6c6112b83c6d246029"
 dependencies = [
  "ahash 0.7.6",
  "atoi",
@@ -3144,9 +3608,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-macros"
-version = "0.6.2"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9"
+checksum = "9966e64ae989e7e575b19d7265cb79d7fc3cbbdf179835cb0d716f294c2049c9"
 dependencies = [
  "dotenvy",
  "either",
@@ -3158,15 +3622,15 @@ dependencies = [
  "sha2 0.10.6",
  "sqlx-core",
  "sqlx-rt",
- "syn",
+ "syn 1.0.109",
  "url",
 ]
 
 [[package]]
 name = "sqlx-rt"
-version = "0.6.2"
+version = "0.6.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396"
+checksum = "804d3f245f894e61b1e6263c84b23ca675d96753b5abfd5cc8597d86806e8024"
 dependencies = [
  "once_cell",
  "tokio",
@@ -3208,7 +3672,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustversion",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3249,7 +3713,7 @@ dependencies = [
 
 [[package]]
 name = "svix-server"
-version = "0.81.0"
+version = "1.4.12"
 dependencies = [
  "aide",
  "anyhow",
@@ -3276,6 +3740,7 @@ dependencies = [
  "ipnet",
  "jsonschema",
  "jwt-simple",
+ "lapin",
  "lazy_static",
  "num_enum",
  "openssl",
@@ -3284,7 +3749,7 @@ dependencies = [
  "opentelemetry-otlp",
  "p256",
  "rand",
- "redis",
+ "redis 0.23.0",
  "redis_cluster_async",
  "regex",
  "reqwest",
@@ -3305,7 +3770,7 @@ dependencies = [
  "time 0.3.20",
  "tokio",
  "tower",
- "tower-http",
+ "tower-http 0.4.0",
  "tracing",
  "tracing-opentelemetry",
  "tracing-subscriber",
@@ -3321,7 +3786,7 @@ version = "0.1.0"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3335,6 +3800,17 @@ dependencies = [
  "unicode-ident",
 ]
 
+[[package]]
+name = "syn"
+version = "2.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcc02725fd69ab9f26eab07fad303e2497fad6fb9eba4f96c4d1687bdf704ad9"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
 [[package]]
 name = "sync_wrapper"
 version = "0.1.2"
@@ -3349,10 +3825,22 @@ checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "unicode-xid",
 ]
 
+[[package]]
+name = "tcp-stream"
+version = "0.24.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09a4b0a70bac0a58ca6a7659d1328e34ee462339c70b0fa49f72bad1f278910a"
+dependencies = [
+ "cfg-if",
+ "p12",
+ "rustls-connector",
+ "rustls-pemfile",
+]
+
 [[package]]
 name = "tempfile"
 version = "3.4.0"
@@ -3362,7 +3850,7 @@ dependencies = [
  "cfg-if",
  "fastrand",
  "redox_syscall",
- "rustix",
+ "rustix 0.36.11",
  "windows-sys 0.42.0",
 ]
 
@@ -3377,22 +3865,22 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.39"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c"
+checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.39"
+version = "1.0.40"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e"
+checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 2.0.8",
 ]
 
 [[package]]
@@ -3495,7 +3983,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3587,9 +4075,9 @@ checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
 
 [[package]]
 name = "toml_edit"
-version = "0.19.4"
+version = "0.19.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a1eb0622d28f4b9c90adc4ea4b2b46b47663fde9ac5fafcb14a1369d5508825"
+checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
 dependencies = [
  "indexmap",
  "toml_datetime",
@@ -3636,7 +4124,7 @@ dependencies = [
  "proc-macro2",
  "prost-build",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3676,6 +4164,24 @@ dependencies = [
  "tower",
  "tower-layer",
  "tower-service",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658"
+dependencies = [
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tower-layer",
+ "tower-service",
  "tracing",
  "uuid",
 ]
@@ -3713,7 +4219,7 @@ checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -3869,9 +4375,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-bidi"
-version = "0.3.10"
+version = "0.3.13"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58"
+checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460"
 
 [[package]]
 name = "unicode-ident"
@@ -3984,7 +4490,7 @@ dependencies = [
  "proc-macro2",
  "quote",
  "regex",
- "syn",
+ "syn 1.0.109",
  "validator_types",
 ]
 
@@ -3995,7 +4501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ded9d97e1d42327632f5f3bae6403c04886e2de3036261ef42deebd931a6a291"
 dependencies = [
  "proc-macro2",
- "syn",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -4016,6 +4522,12 @@ version = "0.9.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
 
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
 [[package]]
 name = "want"
 version = "0.3.0"
@@ -4059,7 +4571,7 @@ dependencies = [
  "once_cell",
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "wasm-bindgen-shared",
 ]
 
@@ -4093,7 +4605,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "wasm-bindgen-backend",
  "wasm-bindgen-shared",
 ]
@@ -4146,9 +4658,9 @@ dependencies = [
 
 [[package]]
 name = "whoami"
-version = "1.3.0"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45dbc71f0cdca27dc261a9bd37ddec174e4a0af2b900b890f378460f745426e3"
+checksum = "2c70234412ca409cc04e864e89523cb0fc37f5e1344ebed5a3ebf4192b6b9f68"
 dependencies = [
  "wasm-bindgen",
  "web-sys",
@@ -4191,19 +4703,28 @@ version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 
+[[package]]
+name = "windows"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
 [[package]]
 name = "windows-sys"
 version = "0.42.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
@@ -4212,71 +4733,137 @@ version = "0.45.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
 dependencies = [
- "windows-targets",
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets 0.48.0",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
 ]
 
 [[package]]
 name = "windows-targets"
-version = "0.42.1"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7"
+checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
 dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
+ "windows_aarch64_gnullvm 0.48.0",
+ "windows_aarch64_msvc 0.48.0",
+ "windows_i686_gnu 0.48.0",
+ "windows_i686_msvc 0.48.0",
+ "windows_x86_64_gnu 0.48.0",
+ "windows_x86_64_gnullvm 0.48.0",
+ "windows_x86_64_msvc 0.48.0",
 ]
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.42.1"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.42.1"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.42.1"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.42.1"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.42.1"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.42.1"
+version = "0.42.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.42.1"
+version = "0.48.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
 
 [[package]]
 name = "winnow"
-version = "0.3.4"
+version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c95fb4ff192527911dd18eb138ac30908e7165b8944e528b6af93aa4c842d345"
+checksum = "deac0939bd6e4f24ab5919fbf751c97a8cfc8543bb083a305ed5c0c10bb241d1"
 dependencies = [
  "memchr",
 ]
@@ -4296,6 +4883,12 @@ version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
 
+[[package]]
+name = "yasna"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd"
+
 [[package]]
 name = "zeroize"
 version = "1.4.3"
@@ -4313,6 +4906,6 @@ checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn",
+ "syn 1.0.109",
  "synstructure",
 ]
diff --git a/server/docker-compose.yml b/server/docker-compose.yml
index d53968e88..2cec23b08 100644
--- a/server/docker-compose.yml
+++ b/server/docker-compose.yml
@@ -38,7 +38,7 @@ services:
     - postgres
 
   redis:
-    image: "redis:6.2-alpine"
+    image: "redis:7-alpine"
     # Enable persistence
     command: "--save 60 500 --appendonly yes --appendfsync everysec"
     volumes:
diff --git a/server/generate-openapi.sh b/server/generate-openapi.sh
new file mode 100755
index 000000000..043e46c7f
--- /dev/null
+++ b/server/generate-openapi.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+# Generates OpenAPI spec
+
+set -eo pipefail
+
+export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres"
+export SVIX_JWT_SECRET="test value"
+export SVIX_LOG_LEVEL="info"
+export SVIX_WHITELIST_SUBNETS="[127.0.0.1/32]"
+export SVIX_QUEUE_TYPE="memory"
+export SVIX_CACHE_TYPE="none"
+export SVIX_REDIS_DSN="redis://localhost:6379"
+
+server_path=$(dirname "$0")
+openapi_path=$server_path/openapi.json
+# Do not output the entire thing
+output=$(cargo run --manifest-path "$server_path"/Cargo.toml -- generate-openapi | jq -S --indent 4 '.openapi = "3.0.2"')
+
+if [[ "$1" = "--check" ]]; then
+    # Do not quit immediately if the diff fails, we check status afterwards
+    set +e
+    if ! diff_result=$(echo "$output" | diff -C5 "$openapi_path" -); then
+        echo "===== Uncommitted difference in OpenAPI spec generation output! ====="
+        echo
+        echo "$diff_result"
+        echo
+        echo "===== If these changes were intended then run locally $0 and add the changes to the commit. ====="
+        exit 1
+    fi
+    echo "No differences found"
+else
+    echo "$output" > "$openapi_path"
+    echo "OpenAPI specification written to $openapi_path"
+fi
diff --git a/server/openapi.json b/server/openapi.json
new file mode 100644
index 000000000..0bd822b7e
--- /dev/null
+++ b/server/openapi.json
@@ -0,0 +1,7459 @@
+{
+    "components": {
+        "schemas": {
+            "AppPortalAccessIn": {
+                "properties": {
+                    "featureFlags": {
+                        "description": "The set of feature flags the created token will have access to.",
+                        "example": [],
+                        "items": {
+                            "example": "cool-new-feature",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "type": "array",
+                        "uniqueItems": true
+                    }
+                },
+                "type": "object"
+            },
+            "AppPortalAccessOut": {
+                "properties": {
+                    "token": {
+                        "example": "appsk_kV3ts5tKPNJN4Dl25cMTfUNdmabxbX0O",
+                        "type": "string"
+                    },
+                    "url": {
+                        "example": "https://app.svix.com/login#key=eyJhcHBJZCI6ICJhcHBfMXRSdFl",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "token",
+                    "url"
+                ],
+                "type": "object"
+            },
+            "ApplicationIn": {
+                "properties": {
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "default": {},
+                        "type": "object"
+                    },
+                    "name": {
+                        "example": "My first application",
+                        "minLength": 1,
+                        "type": "string"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 1,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "uid": {
+                        "description": "Optional unique identifier for the application",
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "name"
+                ],
+                "type": "object"
+            },
+            "ApplicationOut": {
+                "properties": {
+                    "createdAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "id": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "type": "object"
+                    },
+                    "name": {
+                        "example": "My first application",
+                        "type": "string"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "uid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "updatedAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "createdAt",
+                    "id",
+                    "metadata",
+                    "name",
+                    "updatedAt"
+                ],
+                "type": "object"
+            },
+            "ApplicationPatch": {
+                "properties": {
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "type": "object"
+                    },
+                    "name": {
+                        "type": "string"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "uid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    }
+                },
+                "type": "object"
+            },
+            "DashboardAccessOut": {
+                "properties": {
+                    "token": {
+                        "example": "appsk_kV3ts5tKPNJN4Dl25cMTfUNdmabxbX0O",
+                        "type": "string"
+                    },
+                    "url": {
+                        "example": "https://app.svix.com/login#key=eyJhcHBJZCI6ICJhcHBfMXRSdFl",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "token",
+                    "url"
+                ],
+                "type": "object"
+            },
+            "Duration": {
+                "properties": {
+                    "nanos": {
+                        "format": "uint32",
+                        "minimum": 0,
+                        "type": "integer"
+                    },
+                    "secs": {
+                        "format": "uint64",
+                        "minimum": 0,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "nanos",
+                    "secs"
+                ],
+                "type": "object"
+            },
+            "EndpointCreatedEvent": {
+                "description": "Sent when an endpoint is created.",
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/EndpointCreatedEventData"
+                    },
+                    "type": {
+                        "default": "endpoint.created",
+                        "enum": [
+                            "endpoint.created"
+                        ],
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "type"
+                ],
+                "type": "object"
+            },
+            "EndpointCreatedEventData": {
+                "description": "Sent when an endpoint is created, updated, or deleted",
+                "properties": {
+                    "appId": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "appUid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "endpointUid": {
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "appId",
+                    "endpointId"
+                ],
+                "type": "object"
+            },
+            "EndpointDeletedEvent": {
+                "description": "Sent when an endpoint is deleted.",
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/EndpointDeletedEventData"
+                    },
+                    "type": {
+                        "default": "endpoint.deleted",
+                        "enum": [
+                            "endpoint.deleted"
+                        ],
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "type"
+                ],
+                "type": "object"
+            },
+            "EndpointDeletedEventData": {
+                "description": "Sent when an endpoint is created, updated, or deleted",
+                "properties": {
+                    "appId": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "appUid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "endpointUid": {
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "appId",
+                    "endpointId"
+                ],
+                "type": "object"
+            },
+            "EndpointDisabledEvent": {
+                "description": "Sent when an endpoint has been automatically disabled after continuous failures.",
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/EndpointDisabledEventData"
+                    },
+                    "type": {
+                        "default": "endpoint.disabled",
+                        "enum": [
+                            "endpoint.disabled"
+                        ],
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "type"
+                ],
+                "type": "object"
+            },
+            "EndpointDisabledEventData": {
+                "description": "Sent when an endpoint has been automatically disabled after continuous failures.",
+                "properties": {
+                    "appId": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "appUid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "endpointUid": {
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "failSince": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "appId",
+                    "endpointId",
+                    "failSince"
+                ],
+                "type": "object"
+            },
+            "EndpointHeadersIn": {
+                "properties": {
+                    "headers": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "example": {
+                            "X-Example": "123",
+                            "X-Foobar": "Bar"
+                        },
+                        "type": "object"
+                    }
+                },
+                "required": [
+                    "headers"
+                ],
+                "type": "object"
+            },
+            "EndpointHeadersOut": {
+                "description": "The value of the headers is returned in the `headers` field.\n\nSensitive headers that have been redacted are returned in the sensitive field.",
+                "properties": {
+                    "headers": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "example": {
+                            "X-Example": "123",
+                            "X-Foobar": "Bar"
+                        },
+                        "type": "object"
+                    },
+                    "sensitive": {
+                        "example": [
+                            "Authorization"
+                        ],
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array",
+                        "uniqueItems": true
+                    }
+                },
+                "required": [
+                    "headers",
+                    "sensitive"
+                ],
+                "type": "object"
+            },
+            "EndpointHeadersPatchIn": {
+                "properties": {
+                    "headers": {
+                        "additionalProperties": {
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "example": {
+                            "X-Example": "123",
+                            "X-Foobar": "Bar"
+                        },
+                        "type": "object"
+                    }
+                },
+                "required": [
+                    "headers"
+                ],
+                "type": "object"
+            },
+            "EndpointIn": {
+                "properties": {
+                    "channels": {
+                        "description": "List of message channels this endpoint listens to (omit for all)",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 10,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "description": {
+                        "default": "",
+                        "example": "An example endpoint name",
+                        "type": "string"
+                    },
+                    "disabled": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "filterTypes": {
+                        "example": [
+                            "user.signup",
+                            "user.deleted"
+                        ],
+                        "items": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "default": {},
+                        "type": "object"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 1,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "secret": {
+                        "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
+                        "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
+                        "nullable": true,
+                        "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
+                        "type": "string"
+                    },
+                    "uid": {
+                        "description": "Optional unique identifier for the endpoint",
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "url": {
+                        "example": "https://example.com/webhook/",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    },
+                    "version": {
+                        "example": 1,
+                        "format": "uint16",
+                        "minimum": 1,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "url",
+                    "version"
+                ],
+                "type": "object"
+            },
+            "EndpointMessageOut": {
+                "description": "A model containing information on a given message plus additional fields on the last attempt for that message.",
+                "properties": {
+                    "channels": {
+                        "description": "List of free-form identifiers that endpoints can filter by",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 5,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "eventId": {
+                        "description": "Optional unique identifier for the message",
+                        "example": "unique-msg-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "eventType": {
+                        "example": "user.signup",
+                        "maxLength": 256,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "id": {
+                        "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "nextAttempt": {
+                        "format": "date-time",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "payload": {
+                        "example": {
+                            "email": "test@example.com",
+                            "username": "test_user"
+                        },
+                        "type": "object"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/MessageStatus"
+                    },
+                    "timestamp": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "eventType",
+                    "id",
+                    "payload",
+                    "status",
+                    "timestamp"
+                ],
+                "type": "object"
+            },
+            "EndpointOut": {
+                "properties": {
+                    "channels": {
+                        "description": "List of message channels this endpoint listens to (omit for all)",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 10,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "createdAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "description": {
+                        "description": "An example endpoint name",
+                        "type": "string"
+                    },
+                    "disabled": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "filterTypes": {
+                        "example": [
+                            "user.signup",
+                            "user.deleted"
+                        ],
+                        "items": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "id": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "type": "object"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "uid": {
+                        "description": "Optional unique identifier for the endpoint",
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "updatedAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "url": {
+                        "example": "https://example.com/webhook/",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    },
+                    "version": {
+                        "example": 1,
+                        "format": "uint16",
+                        "minimum": 1,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "createdAt",
+                    "description",
+                    "id",
+                    "metadata",
+                    "updatedAt",
+                    "url",
+                    "version"
+                ],
+                "type": "object"
+            },
+            "EndpointPatch": {
+                "properties": {
+                    "channels": {
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "description": {
+                        "type": "string"
+                    },
+                    "disabled": {
+                        "type": "boolean"
+                    },
+                    "filterTypes": {
+                        "items": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "type": "object"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "secret": {
+                        "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
+                        "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
+                        "nullable": true,
+                        "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
+                        "type": "string"
+                    },
+                    "uid": {
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "url": {
+                        "format": "uri",
+                        "type": "string"
+                    },
+                    "version": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "type": "integer"
+                    }
+                },
+                "type": "object"
+            },
+            "EndpointSecretOut": {
+                "properties": {
+                    "key": {
+                        "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
+                        "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
+                        "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "key"
+                ],
+                "type": "object"
+            },
+            "EndpointSecretRotateIn": {
+                "properties": {
+                    "key": {
+                        "default": null,
+                        "description": "The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.",
+                        "example": "whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD",
+                        "nullable": true,
+                        "pattern": "^(whsec_)?[a-zA-Z0-9+/=]{32,100}$",
+                        "type": "string"
+                    }
+                },
+                "type": "object"
+            },
+            "EndpointStats": {
+                "properties": {
+                    "fail": {
+                        "format": "int64",
+                        "type": "integer"
+                    },
+                    "pending": {
+                        "format": "int64",
+                        "type": "integer"
+                    },
+                    "sending": {
+                        "format": "int64",
+                        "type": "integer"
+                    },
+                    "success": {
+                        "format": "int64",
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "fail",
+                    "pending",
+                    "sending",
+                    "success"
+                ],
+                "type": "object"
+            },
+            "EndpointStatsRange": {
+                "properties": {
+                    "since": {
+                        "format": "date-time",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "until": {
+                        "format": "date-time",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "type": "object"
+            },
+            "EndpointUpdate": {
+                "properties": {
+                    "channels": {
+                        "description": "List of message channels this endpoint listens to (omit for all)",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 10,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "description": {
+                        "default": "",
+                        "example": "An example endpoint name",
+                        "type": "string"
+                    },
+                    "disabled": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "filterTypes": {
+                        "example": [
+                            "user.signup",
+                            "user.deleted"
+                        ],
+                        "items": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "metadata": {
+                        "additionalProperties": {
+                            "type": "string"
+                        },
+                        "default": {},
+                        "type": "object"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 1,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "uid": {
+                        "description": "Optional unique identifier for the endpoint",
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "url": {
+                        "example": "https://example.com/webhook/",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    },
+                    "version": {
+                        "example": 1,
+                        "format": "uint16",
+                        "minimum": 1,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "url",
+                    "version"
+                ],
+                "type": "object"
+            },
+            "EndpointUpdatedEvent": {
+                "description": "Sent when an endpoint is updated.",
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/EndpointUpdatedEventData"
+                    },
+                    "type": {
+                        "default": "endpoint.updated",
+                        "enum": [
+                            "endpoint.updated"
+                        ],
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "type"
+                ],
+                "type": "object"
+            },
+            "EndpointUpdatedEventData": {
+                "description": "Sent when an endpoint is created, updated, or deleted",
+                "properties": {
+                    "appId": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "appUid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "endpointUid": {
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "appId",
+                    "endpointId"
+                ],
+                "type": "object"
+            },
+            "EventTypeIn": {
+                "properties": {
+                    "archived": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "description": {
+                        "example": "A user has signed up",
+                        "type": "string"
+                    },
+                    "featureFlag": {
+                        "example": "cool-new-feature",
+                        "maxLength": 256,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "name": {
+                        "example": "user.signup",
+                        "maxLength": 256,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "schemas": {
+                        "additionalProperties": {
+                            "type": "object"
+                        },
+                        "description": "The schema for the event type for a specific version as a JSON schema.",
+                        "example": {
+                            "1": {
+                                "description": "An invoice was paid by a user",
+                                "properties": {
+                                    "invoiceId": {
+                                        "description": "The invoice id",
+                                        "type": "string"
+                                    },
+                                    "userId": {
+                                        "description": "The user id",
+                                        "type": "string"
+                                    }
+                                },
+                                "required": [
+                                    "invoiceId",
+                                    "userId"
+                                ],
+                                "title": "Invoice Paid Event",
+                                "type": "object"
+                            }
+                        },
+                        "nullable": true,
+                        "type": "object"
+                    }
+                },
+                "required": [
+                    "description",
+                    "name"
+                ],
+                "type": "object"
+            },
+            "EventTypeOut": {
+                "properties": {
+                    "archived": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "createdAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "description": {
+                        "example": "A user has signed up",
+                        "type": "string"
+                    },
+                    "featureFlag": {
+                        "example": "cool-new-feature",
+                        "maxLength": 256,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "name": {
+                        "example": "user.signup",
+                        "maxLength": 256,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "schemas": {
+                        "additionalProperties": {
+                            "type": "object"
+                        },
+                        "description": "The schema for the event type for a specific version as a JSON schema.",
+                        "example": {
+                            "1": {
+                                "description": "An invoice was paid by a user",
+                                "properties": {
+                                    "invoiceId": {
+                                        "description": "The invoice id",
+                                        "type": "string"
+                                    },
+                                    "userId": {
+                                        "description": "The user id",
+                                        "type": "string"
+                                    }
+                                },
+                                "required": [
+                                    "invoiceId",
+                                    "userId"
+                                ],
+                                "title": "Invoice Paid Event",
+                                "type": "object"
+                            }
+                        },
+                        "nullable": true,
+                        "type": "object"
+                    },
+                    "updatedAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "createdAt",
+                    "description",
+                    "name",
+                    "updatedAt"
+                ],
+                "type": "object"
+            },
+            "EventTypePatch": {
+                "properties": {
+                    "archived": {
+                        "type": "boolean"
+                    },
+                    "description": {
+                        "type": "string"
+                    },
+                    "featureFlag": {
+                        "example": "cool-new-feature",
+                        "maxLength": 256,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "schemas": {
+                        "additionalProperties": {
+                            "type": "object"
+                        },
+                        "example": {
+                            "description": "An invoice was paid by a user",
+                            "properties": {
+                                "invoiceId": {
+                                    "description": "The invoice id",
+                                    "type": "string"
+                                },
+                                "userId": {
+                                    "description": "The user id",
+                                    "type": "string"
+                                }
+                            },
+                            "required": [
+                                "invoiceId",
+                                "userId"
+                            ],
+                            "title": "Invoice Paid Event",
+                            "type": "object"
+                        },
+                        "nullable": true,
+                        "type": "object"
+                    }
+                },
+                "type": "object"
+            },
+            "EventTypeUpdate": {
+                "properties": {
+                    "archived": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "description": {
+                        "example": "A user has signed up",
+                        "type": "string"
+                    },
+                    "featureFlag": {
+                        "example": "cool-new-feature",
+                        "maxLength": 256,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "schemas": {
+                        "additionalProperties": {
+                            "type": "object"
+                        },
+                        "description": "The schema for the event type for a specific version as a JSON schema.",
+                        "example": {
+                            "1": {
+                                "description": "An invoice was paid by a user",
+                                "properties": {
+                                    "invoiceId": {
+                                        "description": "The invoice id",
+                                        "type": "string"
+                                    },
+                                    "userId": {
+                                        "description": "The user id",
+                                        "type": "string"
+                                    }
+                                },
+                                "required": [
+                                    "invoiceId",
+                                    "userId"
+                                ],
+                                "title": "Invoice Paid Event",
+                                "type": "object"
+                            }
+                        },
+                        "nullable": true,
+                        "type": "object"
+                    }
+                },
+                "required": [
+                    "description"
+                ],
+                "type": "object"
+            },
+            "HTTPValidationError": {
+                "properties": {
+                    "detail": {
+                        "items": {
+                            "$ref": "#/components/schemas/ValidationErrorItem"
+                        },
+                        "type": "array"
+                    }
+                },
+                "required": [
+                    "detail"
+                ],
+                "type": "object"
+            },
+            "HttpErrorOut": {
+                "properties": {
+                    "code": {
+                        "type": "string"
+                    },
+                    "detail": {
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "code",
+                    "detail"
+                ],
+                "title": "HttpError",
+                "type": "object"
+            },
+            "ListResponse_ApplicationOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/ApplicationOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_EndpointMessageOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/EndpointMessageOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_EndpointOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/EndpointOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_EventTypeOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/EventTypeOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_MessageAttemptEndpointOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/MessageAttemptEndpointOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_MessageAttemptOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/MessageAttemptOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_MessageEndpointOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/MessageEndpointOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "ListResponse_MessageOut_": {
+                "properties": {
+                    "data": {
+                        "items": {
+                            "$ref": "#/components/schemas/MessageOut"
+                        },
+                        "type": "array"
+                    },
+                    "done": {
+                        "type": "boolean"
+                    },
+                    "iterator": {
+                        "example": "iterator",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "prevIterator": {
+                        "example": "-iterator",
+                        "nullable": true,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "done"
+                ],
+                "type": "object"
+            },
+            "MessageAttempetLast": {
+                "properties": {
+                    "id": {
+                        "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "responseStatusCode": {
+                        "format": "int16",
+                        "type": "integer"
+                    },
+                    "timestamp": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "id",
+                    "responseStatusCode",
+                    "timestamp"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptEndpointOut": {
+                "properties": {
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "id": {
+                        "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "msgId": {
+                        "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "response": {
+                        "example": "{}",
+                        "type": "string"
+                    },
+                    "responseStatusCode": {
+                        "example": 200,
+                        "format": "int16",
+                        "type": "integer"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/MessageStatus"
+                    },
+                    "timestamp": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "triggerType": {
+                        "$ref": "#/components/schemas/MessageAttemptTriggerType"
+                    },
+                    "url": {
+                        "example": "https://example.com/webhook/",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "endpointId",
+                    "id",
+                    "msgId",
+                    "response",
+                    "responseStatusCode",
+                    "status",
+                    "timestamp",
+                    "triggerType",
+                    "url"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptExhaustedEvent": {
+                "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted).",
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/MessageAttemptExhaustedEventData"
+                    },
+                    "type": {
+                        "default": "message.attempt.exhausted",
+                        "enum": [
+                            "message.attempt.exhausted"
+                        ],
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "type"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptExhaustedEventData": {
+                "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a \"message.attempt.exhausted\" type or after it's failed four times as a \"message.attempt.failing\" event.",
+                "properties": {
+                    "appId": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "appUid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "lastAttempt": {
+                        "$ref": "#/components/schemas/MessageAttempetLast"
+                    },
+                    "msgEventId": {
+                        "example": "unique-msg-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "msgId": {
+                        "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "appId",
+                    "endpointId",
+                    "lastAttempt",
+                    "msgId"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptFailingEvent": {
+                "description": "Sent after a message has been failing for a few times.\nIt's sent on the fourth failure. It complements `message.attempt.exhausted` which is sent after the last failure.",
+                "properties": {
+                    "data": {
+                        "$ref": "#/components/schemas/MessageAttemptFailingEventData"
+                    },
+                    "type": {
+                        "default": "message.attempt.failing",
+                        "enum": [
+                            "message.attempt.failing"
+                        ],
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "data",
+                    "type"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptFailingEventData": {
+                "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a \"message.attempt.exhausted\" type or after it's failed four times as a \"message.attempt.failing\" event.",
+                "properties": {
+                    "appId": {
+                        "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "appUid": {
+                        "example": "unique-app-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "lastAttempt": {
+                        "$ref": "#/components/schemas/MessageAttempetLast"
+                    },
+                    "msgEventId": {
+                        "example": "unique-msg-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "msgId": {
+                        "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "appId",
+                    "endpointId",
+                    "lastAttempt",
+                    "msgId"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptOut": {
+                "properties": {
+                    "endpointId": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "id": {
+                        "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "msgId": {
+                        "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "response": {
+                        "example": "{}",
+                        "type": "string"
+                    },
+                    "responseStatusCode": {
+                        "example": 200,
+                        "format": "int16",
+                        "type": "integer"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/MessageStatus"
+                    },
+                    "timestamp": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "triggerType": {
+                        "$ref": "#/components/schemas/MessageAttemptTriggerType"
+                    },
+                    "url": {
+                        "example": "https://example.com/webhook/",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "endpointId",
+                    "id",
+                    "msgId",
+                    "response",
+                    "responseStatusCode",
+                    "status",
+                    "timestamp",
+                    "triggerType",
+                    "url"
+                ],
+                "type": "object"
+            },
+            "MessageAttemptTriggerType": {
+                "description": "The reason an attempt was made:\n- Scheduled = 0\n- Manual = 1",
+                "enum": [
+                    0,
+                    1
+                ],
+                "title": "MessageAttemptTriggerType",
+                "type": "integer",
+                "x-enum-varnames": [
+                    "Scheduled",
+                    "Manual"
+                ]
+            },
+            "MessageEndpointOut": {
+                "properties": {
+                    "channels": {
+                        "description": "List of message channels this endpoint listens to (omit for all)",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 10,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "createdAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "description": {
+                        "description": "An example endpoint name",
+                        "type": "string"
+                    },
+                    "disabled": {
+                        "default": false,
+                        "example": false,
+                        "type": "boolean"
+                    },
+                    "filterTypes": {
+                        "example": [
+                            "user.signup",
+                            "user.deleted"
+                        ],
+                        "items": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "id": {
+                        "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "nextAttempt": {
+                        "format": "date-time",
+                        "nullable": true,
+                        "type": "string"
+                    },
+                    "rateLimit": {
+                        "format": "uint16",
+                        "minimum": 0,
+                        "nullable": true,
+                        "type": "integer"
+                    },
+                    "status": {
+                        "$ref": "#/components/schemas/MessageStatus"
+                    },
+                    "uid": {
+                        "description": "Optional unique identifier for the endpoint",
+                        "example": "unique-ep-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "updatedAt": {
+                        "format": "date-time",
+                        "type": "string"
+                    },
+                    "url": {
+                        "example": "https://example.com/webhook/",
+                        "format": "uri",
+                        "maxLength": 65536,
+                        "minLength": 1,
+                        "type": "string"
+                    },
+                    "version": {
+                        "example": 1,
+                        "format": "uint16",
+                        "minimum": 1,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "createdAt",
+                    "description",
+                    "id",
+                    "status",
+                    "updatedAt",
+                    "url",
+                    "version"
+                ],
+                "type": "object"
+            },
+            "MessageIn": {
+                "properties": {
+                    "channels": {
+                        "description": "List of free-form identifiers that endpoints can filter by",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 5,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "eventId": {
+                        "description": "Optional unique identifier for the message",
+                        "example": "unique-msg-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "eventType": {
+                        "example": "user.signup",
+                        "maxLength": 256,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "payload": {
+                        "example": {
+                            "email": "test@example.com",
+                            "username": "test_user"
+                        },
+                        "type": "object"
+                    },
+                    "payloadRetentionPeriod": {
+                        "default": 90,
+                        "example": 90,
+                        "format": "int64",
+                        "maximum": 90,
+                        "minimum": 5,
+                        "type": "integer"
+                    }
+                },
+                "required": [
+                    "eventType",
+                    "payload"
+                ],
+                "type": "object"
+            },
+            "MessageOut": {
+                "properties": {
+                    "channels": {
+                        "description": "List of free-form identifiers that endpoints can filter by",
+                        "example": [
+                            "project_123",
+                            "group_2"
+                        ],
+                        "items": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "maxItems": 5,
+                        "minItems": 1,
+                        "nullable": true,
+                        "type": "array",
+                        "uniqueItems": true
+                    },
+                    "eventId": {
+                        "description": "Optional unique identifier for the message",
+                        "example": "unique-msg-identifier",
+                        "maxLength": 256,
+                        "minLength": 1,
+                        "nullable": true,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "eventType": {
+                        "example": "user.signup",
+                        "maxLength": 256,
+                        "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                        "type": "string"
+                    },
+                    "id": {
+                        "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                        "type": "string"
+                    },
+                    "payload": {
+                        "example": {
+                            "email": "test@example.com",
+                            "username": "test_user"
+                        },
+                        "type": "object"
+                    },
+                    "timestamp": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "eventType",
+                    "id",
+                    "payload",
+                    "timestamp"
+                ],
+                "type": "object"
+            },
+            "MessageStatus": {
+                "description": "The sending status of the message:\n- Success = 0\n- Pending = 1\n- Fail = 2\n- Sending = 3",
+                "enum": [
+                    0,
+                    1,
+                    2,
+                    3
+                ],
+                "title": "MessageStatus",
+                "type": "integer",
+                "x-enum-varnames": [
+                    "Success",
+                    "Pending",
+                    "Fail",
+                    "Sending"
+                ]
+            },
+            "Ordering": {
+                "description": "Defines the ordering in a listing of results.",
+                "enum": [
+                    "ascending",
+                    "descending"
+                ],
+                "type": "string"
+            },
+            "RecoverIn": {
+                "properties": {
+                    "since": {
+                        "format": "date-time",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "since"
+                ],
+                "type": "object"
+            },
+            "RetrySchedule": {
+                "items": {
+                    "$ref": "#/components/schemas/Duration"
+                },
+                "type": "array"
+            },
+            "RetryScheduleInOut": {
+                "properties": {
+                    "retrySchedule": {
+                        "$ref": "#/components/schemas/RetrySchedule",
+                        "nullable": true
+                    }
+                },
+                "type": "object"
+            },
+            "StatusCodeClass": {
+                "description": "The different classes of HTTP status codes:\n- CodeNone = 0\n- Code1xx = 100\n- Code2xx = 200\n- Code3xx = 300\n- Code4xx = 400\n- Code5xx = 500",
+                "enum": [
+                    0,
+                    100,
+                    200,
+                    300,
+                    400,
+                    500
+                ],
+                "title": "StatusCodeClass",
+                "type": "integer",
+                "x-enum-varnames": [
+                    "CodeNone",
+                    "Code1xx",
+                    "Code2xx",
+                    "Code3xx",
+                    "Code4xx",
+                    "Code5xx"
+                ]
+            },
+            "ValidationErrorItem": {
+                "description": "Validation errors have their own schema to provide context for invalid requests eg. mismatched types and out of bounds values. There may be any number of these per 422 UNPROCESSABLE ENTITY error.",
+                "properties": {
+                    "loc": {
+                        "description": "The location as a [`Vec`] of [`String`]s -- often in the form `[\"body\", \"field_name\"]`, `[\"query\", \"field_name\"]`, etc. They may, however, be arbitarily deep.",
+                        "items": {
+                            "type": "string"
+                        },
+                        "type": "array"
+                    },
+                    "msg": {
+                        "description": "The message accompanying the validation error item.",
+                        "type": "string"
+                    },
+                    "type": {
+                        "description": "The type of error, often \"type_error\" or \"value_error\", but sometimes with more context like as \"value_error.number.not_ge\"",
+                        "type": "string"
+                    }
+                },
+                "required": [
+                    "loc",
+                    "msg",
+                    "type"
+                ],
+                "type": "object"
+            }
+        }
+    },
+    "info": {
+        "description": "Welcome to the Svix API documentation!\n\nUseful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)\n\n# Introduction\n\nThis is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).\n\n## Main concepts\n\nIn Svix you have four important entities you will be interacting with:\n\n- `messages`: these are the webhooks being sent. They can have contents and a few other properties.\n- `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform.\n- `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type).\n- `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.\n\n\n## Authentication\n\nGet your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.\n\n<SecurityDefinitions />\n\n\n## Code samples\n\nThe code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).\n\n\n## Idempotency\n\nSvix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.\n\nTo perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.\n\nSvix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.\n\nPlease note that idempotency is only supported for `POST` requests.\n\n\n## Cross-Origin Resource Sharing\n\nThis API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site.\n",
+        "title": "Svix API",
+        "version": "1.4",
+        "x-logo": {
+            "altText": "Svix Logo",
+            "url": "https://www.svix.com/static/img/brand-padded.svg"
+        }
+    },
+    "openapi": "3.0.2",
+    "paths": {
+        "/api/v1/app/": {
+            "get": {
+                "description": "List of all the organization's applications.",
+                "operationId": "v1.application.list",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "order",
+                        "schema": {
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_ApplicationOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Applications",
+                "tags": [
+                    "Application"
+                ]
+            },
+            "post": {
+                "description": "Create a new application.",
+                "operationId": "v1.application.create",
+                "parameters": [
+                    {
+                        "description": "Get an existing application, or create a new one if doesn't exist. It's two separate functions in the libs.",
+                        "in": "query",
+                        "name": "get_if_exists",
+                        "schema": {
+                            "default": false,
+                            "description": "Get an existing application, or create a new one if doesn't exist. It's two separate functions in the libs.",
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/ApplicationIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Create Application",
+                "tags": [
+                    "Application"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/": {
+            "delete": {
+                "description": "Delete an application.",
+                "operationId": "v1.application.delete",
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Delete Application",
+                "tags": [
+                    "Application"
+                ]
+            },
+            "get": {
+                "description": "Get an application.",
+                "operationId": "v1.application.get",
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Application",
+                "tags": [
+                    "Application"
+                ]
+            },
+            "patch": {
+                "description": "Partially update an application.",
+                "operationId": "patch_application",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/ApplicationPatch"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Patch Application",
+                "tags": [
+                    "Application"
+                ]
+            },
+            "put": {
+                "description": "Update an application.",
+                "operationId": "v1.application.update",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/ApplicationIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ApplicationOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Update Application",
+                "tags": [
+                    "Application"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/attempt/endpoint/{endpoint_id}/": {
+            "get": {
+                "description": "List attempts by endpoint id",
+                "operationId": "v1.message-attempt.list-by-endpoint",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status_code_class",
+                        "schema": {
+                            "$ref": "#/components/schemas/StatusCodeClass",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Attempts By Endpoint",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/attempt/msg/{msg_id}/": {
+            "get": {
+                "description": "List attempts by message id",
+                "operationId": "v1.message-attempt.list-by-msg",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status_code_class",
+                        "schema": {
+                            "$ref": "#/components/schemas/StatusCodeClass",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "endpoint_id",
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Attempts By Msg",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/": {
+            "get": {
+                "description": "List the application's endpoints.",
+                "operationId": "v1.endpoint.list",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "order",
+                        "schema": {
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_EndpointOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Endpoints",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "post": {
+                "description": "Create a new endpoint for the application.\n\nWhen `secret` is `null` the secret is automatically generated (recommended)",
+                "operationId": "v1.endpoint.create",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Create Endpoint",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/": {
+            "delete": {
+                "description": "Delete an endpoint.",
+                "operationId": "v1.endpoint.delete",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Delete Endpoint",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "get": {
+                "description": "Get an endpoint.",
+                "operationId": "v1.endpoint.get",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Endpoint",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "patch": {
+                "description": "Partially update an endpoint.",
+                "operationId": "patch_endpoint",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointPatch"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Patch Endpoint",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "put": {
+                "description": "Update an endpoint.",
+                "operationId": "v1.endpoint.update",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointUpdate"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Update Endpoint",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/headers/": {
+            "get": {
+                "description": "Get the additional headers to be sent with the webhook",
+                "operationId": "v1.endpoint.get-headers",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointHeadersOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Endpoint Headers",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "patch": {
+                "description": "Partially set the additional headers to be sent with the webhook",
+                "operationId": "v1.endpoint.patch-headers",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointHeadersPatchIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Patch Endpoint Headers",
+                "tags": [
+                    "Endpoint"
+                ]
+            },
+            "put": {
+                "description": "Set the additional headers to be sent with the webhook",
+                "operationId": "v1.endpoint.update-headers",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointHeadersIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Update Endpoint Headers",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/": {
+            "get": {
+                "description": "List messages for a particular endpoint. Additionally includes metadata about the latest message attempt.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.",
+                "operationId": "v1.message-attempt.list-attempted-messages",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_EndpointMessageOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Attempted Messages",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover/": {
+            "post": {
+                "description": "Resend all failed messages since a given time.",
+                "operationId": "v1.endpoint.recover",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/RecoverIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "202": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Recover Failed Webhooks",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/": {
+            "get": {
+                "description": "Get the endpoint's signing secret.\n\nThis is used to verify the authenticity of the webhook.\nFor more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/).",
+                "operationId": "v1.endpoint.get-secret",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointSecretOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Endpoint Secret",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/secret/rotate/": {
+            "post": {
+                "description": "Rotates the endpoint's signing secret.  The previous secret will be valid for the next 24 hours.",
+                "operationId": "v1.endpoint.rotate-secret",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointSecretRotateIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Rotate Endpoint Secret",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/send-example/": {
+            "post": {
+                "description": "Send an example message for event",
+                "parameters": [
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    }
+                },
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/stats/": {
+            "get": {
+                "description": "Get basic statistics for the endpoint.",
+                "operationId": "v1.endpoint.get-stats",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "query",
+                        "name": "since",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "until",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EndpointStats"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Endpoint Stats",
+                "tags": [
+                    "Endpoint"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/": {
+            "get": {
+                "description": "List all of the application's messages.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.\nThe `after` parameter lets you filter all items created after a certain date and is ignored if an iterator is passed.\n`before` and `after` cannot be used simultaneously.",
+                "operationId": "v1.message.list",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": true,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Messages",
+                "tags": [
+                    "Message"
+                ]
+            },
+            "post": {
+                "description": "Creates a new message and dispatches it to all of the application's endpoints.\n\nThe `eventId` is an optional custom unique ID. It's verified to be unique only up to a day, after that no verification will be made.\nIf a message with the same `eventId` already exists for any application in your environment, a 409 conflict error will be returned.\n\nThe `eventType` indicates the type and schema of the event. All messages of a certain `eventType` are expected to have the same schema. Endpoints can choose to only listen to specific event types.\nMessages can also have `channels`, which similar to event types let endpoints filter by them. Unlike event types, messages can have multiple channels, and channels don't imply a specific message content or schema.\n\nThe `payload` property is the webhook's body (the actual webhook message). Svix supports payload sizes of up to ~350kb, though it's generally a good idea to keep webhook payloads small, probably no larger than 40kb.",
+                "operationId": "v1.message.create",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": true,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/MessageIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "202": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/MessageOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Create Message",
+                "tags": [
+                    "Message"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/": {
+            "get": {
+                "description": "Get a message by its ID or eventID.",
+                "operationId": "v1.message.get",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": true,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/MessageOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Message",
+                "tags": [
+                    "Message"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/": {
+            "get": {
+                "description": "Deprecated: Please use \"List Attempts by Endpoint\" and \"List Attempts by Msg\" instead.\n\n`msg_id`: Use a message id or a message `eventId`",
+                "operationId": "v1.message-attempt.list-by-msg-deprecated",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "endpoint_id",
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Messageattempts",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/": {
+            "get": {
+                "description": "`msg_id`: Use a message id or a message `eventId`",
+                "operationId": "v1.message-attempt.get",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "attempt_id",
+                        "required": true,
+                        "schema": {
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/MessageAttemptOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Messageattempt",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/attempt/{attempt_id}/content/": {
+            "delete": {
+                "description": "Deletes the given attempt's response body. Useful when an endpoint accidentally returned sensitive content.",
+                "operationId": "v1.message-attempt.expunge-content",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "attempt_id",
+                        "required": true,
+                        "schema": {
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Expunge Attempt Content",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/content/": {
+            "delete": {
+                "description": "Delete the given message's payload. Useful in cases when a message was accidentally sent with sensitive content.\n\nThe message can't be replayed or resent once its payload has been deleted or expired.",
+                "operationId": "v1.message.expunge-content",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Expunge Message Content",
+                "tags": [
+                    "Message"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/": {
+            "get": {
+                "description": "`msg_id`: Use a message id or a message `eventId`",
+                "operationId": "v1.message-attempt.list-attempted-destinations",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageEndpointOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Attempted Destinations",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/attempt/": {
+            "get": {
+                "description": "DEPRECATED: please use list_attempts with endpoint_id as a query parameter instead.\n\nList the message attempts for a particular endpoint.\n\nReturning the endpoint.\n\nThe `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.",
+                "operationId": "v1.message-attempt.list-by-endpoint-deprecated",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "channel",
+                        "schema": {
+                            "example": "project_1337",
+                            "maxLength": 128,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "status",
+                        "schema": {
+                            "$ref": "#/components/schemas/MessageStatus",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "before",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "after",
+                        "schema": {
+                            "format": "date-time",
+                            "nullable": true,
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "event_types",
+                        "schema": {
+                            "items": {
+                                "example": "user.signup",
+                                "maxLength": 256,
+                                "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                                "type": "string"
+                            },
+                            "nullable": true,
+                            "type": "array",
+                            "uniqueItems": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_MessageAttemptEndpointOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Attempts For Endpoint",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/app/{app_id}/msg/{msg_id}/endpoint/{endpoint_id}/resend/": {
+            "post": {
+                "description": "Resend a message to the specified endpoint.",
+                "operationId": "v1.message-attempt.resend",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "msg_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-msg-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "in": "path",
+                        "name": "endpoint_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-ep-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "202": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Resend Webhook",
+                "tags": [
+                    "Message Attempt"
+                ]
+            }
+        },
+        "/api/v1/auth/app-portal-access/{app_id}/": {
+            "post": {
+                "description": "Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.",
+                "operationId": "v1.authentication.app-portal-access",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/AppPortalAccessIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/AppPortalAccessOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "App Portal Access",
+                "tags": [
+                    "Authentication"
+                ]
+            }
+        },
+        "/api/v1/auth/dashboard-access/{app_id}/": {
+            "post": {
+                "description": "DEPRECATED: Please use `app-portal-access` instead.\n\nUse this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.",
+                "operationId": "v1.authentication.dashboard-access",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "app_id",
+                        "required": true,
+                        "schema": {
+                            "example": "unique-app-identifier",
+                            "maxLength": 256,
+                            "minLength": 1,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    },
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/DashboardAccessOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Dashboard Access",
+                "tags": [
+                    "Authentication"
+                ]
+            }
+        },
+        "/api/v1/auth/logout/": {
+            "post": {
+                "description": "\nLogout an app token.\n\nTrying to log out other tokens will fail.\n",
+                "operationId": "logout_api_v1_auth_logout__post",
+                "parameters": [
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    }
+                },
+                "summary": "Logout",
+                "tags": [
+                    "Authentication"
+                ]
+            }
+        },
+        "/api/v1/event-type/": {
+            "get": {
+                "description": "Return the list of event types.",
+                "operationId": "v1.event-type.list",
+                "parameters": [
+                    {
+                        "in": "query",
+                        "name": "limit",
+                        "schema": {
+                            "format": "uint64",
+                            "minimum": 0,
+                            "type": "integer"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "iterator",
+                        "schema": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "nullable": true,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "order",
+                        "schema": {
+                            "$ref": "#/components/schemas/Ordering",
+                            "nullable": true
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "include_archived",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/ListResponse_EventTypeOut_"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "List Event Types",
+                "tags": [
+                    "Event Type"
+                ]
+            },
+            "post": {
+                "description": "Create new or unarchive existing event type.\n\nUnarchiving an event type will allow endpoints to filter on it and messages to be sent with it.\nEndpoints filtering on the event type before archival will continue to filter on it.\nThis operation does not preserve the description and schemas.",
+                "operationId": "v1.event-type.create",
+                "parameters": [
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EventTypeIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Create Event Type",
+                "tags": [
+                    "Event Type"
+                ]
+            }
+        },
+        "/api/v1/event-type/schema/generate-example/": {
+            "post": {
+                "description": "Generates a fake example from the given JSONSchema",
+                "parameters": [
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    }
+                },
+                "tags": [
+                    "Event Type"
+                ]
+            }
+        },
+        "/api/v1/event-type/{event_type_name}/": {
+            "delete": {
+                "description": "Archive an event type.\n\nEndpoints already configured to filter on an event type will continue to do so after archival.\nHowever, new messages can not be sent with it and endpoints can not filter on it.\nAn event type can be unarchived with the\n[create operation](#operation/create_event_type_api_v1_event_type__post).",
+                "operationId": "v1.event-type.delete",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
+                        "schema": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Delete Event Type",
+                "tags": [
+                    "Event Type"
+                ]
+            },
+            "get": {
+                "description": "Get an event type.",
+                "operationId": "v1.event-type.get",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
+                        "schema": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Get Event Type",
+                "tags": [
+                    "Event Type"
+                ]
+            },
+            "patch": {
+                "description": "Partially update an event type.",
+                "operationId": "patch_event_type",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
+                        "schema": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EventTypePatch"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Patch Event Type",
+                "tags": [
+                    "Event Type"
+                ]
+            },
+            "put": {
+                "description": "Update an event type.",
+                "operationId": "v1.event-type.update",
+                "parameters": [
+                    {
+                        "in": "path",
+                        "name": "event_type_name",
+                        "required": true,
+                        "schema": {
+                            "example": "user.signup",
+                            "maxLength": 256,
+                            "pattern": "^[a-zA-Z0-9\\-_.]+$",
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EventTypeUpdate"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "201": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/EventTypeOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Update Event Type",
+                "tags": [
+                    "Event Type"
+                ]
+            }
+        },
+        "/api/v1/event-type/{event_type_name}/retry-schedule/": {
+            "get": {
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/RetryScheduleInOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    }
+                },
+                "tags": [
+                    "Event Type"
+                ]
+            },
+            "put": {
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/RetryScheduleInOut"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "200": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/RetryScheduleInOut"
+                                }
+                            }
+                        },
+                        "description": ""
+                    }
+                },
+                "tags": [
+                    "Event Type"
+                ]
+            }
+        },
+        "/api/v1/health/": {
+            "get": {
+                "description": "Verify the API server is up and running.",
+                "operationId": "v1.health.get",
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    },
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Health",
+                "tags": [
+                    "Health"
+                ]
+            },
+            "head": {
+                "description": "Verify the API server is up and running.",
+                "operationId": "v1.health.get",
+                "responses": {
+                    "401": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Unauthorized"
+                    },
+                    "403": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Forbidden"
+                    },
+                    "404": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Not Found"
+                    },
+                    "409": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Conflict"
+                    },
+                    "422": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HTTPValidationError"
+                                }
+                            }
+                        },
+                        "description": "Validation Error"
+                    },
+                    "429": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/HttpErrorOut"
+                                }
+                            }
+                        },
+                        "description": "Too Many Requests"
+                    }
+                },
+                "summary": "Health",
+                "tags": [
+                    "Health"
+                ]
+            }
+        },
+        "/api/v1/health/ping/": {
+            "get": {
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    }
+                }
+            },
+            "head": {
+                "responses": {
+                    "204": {
+                        "description": "no content"
+                    }
+                }
+            }
+        }
+    },
+    "tags": [
+        {
+            "name": "Application"
+        },
+        {
+            "name": "Message"
+        },
+        {
+            "name": "Message Attempt"
+        },
+        {
+            "name": "Endpoint"
+        },
+        {
+            "name": "Integration"
+        },
+        {
+            "name": "Event Type"
+        },
+        {
+            "name": "Authentication"
+        },
+        {
+            "name": "Health"
+        },
+        {
+            "name": "Webhooks"
+        }
+    ],
+    "x-tagGroups": [
+        {
+            "name": "General",
+            "tags": [
+                "Application",
+                "Event Type"
+            ]
+        },
+        {
+            "name": "Application specific",
+            "tags": [
+                "Authentication",
+                "Endpoint",
+                "Message",
+                "Message Attempt",
+                "Integration"
+            ]
+        },
+        {
+            "name": "Utility",
+            "tags": [
+                "Health"
+            ]
+        },
+        {
+            "name": "Webhooks",
+            "tags": [
+                "Webhooks"
+            ]
+        }
+    ],
+    "x-webhooks": {
+        "EndpointCreatedEvent": {
+            "post": {
+                "description": "Sent when an endpoint is created.",
+                "operationId": "EndpointCreatedEvent",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointCreatedEvent"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "2XX": {
+                        "description": "Return any 2XX status to indicate that the data was received successfully"
+                    }
+                },
+                "summary": "EndpointCreatedEvent",
+                "tags": [
+                    "Webhooks"
+                ]
+            }
+        },
+        "EndpointDeletedEvent": {
+            "post": {
+                "description": "Sent when an endpoint is deleted.",
+                "operationId": "EndpointDeletedEvent",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointDeletedEvent"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "2XX": {
+                        "description": "Return any 2XX status to indicate that the data was received successfully"
+                    }
+                },
+                "summary": "EndpointDeletedEvent",
+                "tags": [
+                    "Webhooks"
+                ]
+            }
+        },
+        "EndpointDisabledEvent": {
+            "post": {
+                "description": "Sent when an endpoint has been automatically disabled after continuous failures.",
+                "operationId": "EndpointDisabledEvent",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointDisabledEvent"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "2XX": {
+                        "description": "Return any 2XX status to indicate that the data was received successfully"
+                    }
+                },
+                "summary": "EndpointDisabledEvent",
+                "tags": [
+                    "Webhooks"
+                ]
+            }
+        },
+        "EndpointUpdatedEvent": {
+            "post": {
+                "description": "Sent when an endpoint is updated.",
+                "operationId": "EndpointUpdatedEvent",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/EndpointUpdatedEvent"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "2XX": {
+                        "description": "Return any 2XX status to indicate that the data was received successfully"
+                    }
+                },
+                "summary": "EndpointUpdatedEvent",
+                "tags": [
+                    "Webhooks"
+                ]
+            }
+        },
+        "MessageAttemptExhaustedEvent": {
+            "post": {
+                "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted).",
+                "operationId": "MessageAttemptExhaustedEvent",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/MessageAttemptExhaustedEvent"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "2XX": {
+                        "description": "Return any 2XX status to indicate that the data was received successfully"
+                    }
+                },
+                "summary": "MessageAttemptExhaustedEvent",
+                "tags": [
+                    "Webhooks"
+                ]
+            }
+        },
+        "MessageAttemptFailingEvent": {
+            "post": {
+                "description": "Sent after a message has been failing for a few times.\nIt's sent on the fourth failure. It complements `message.attempt.exhausted` which is sent after the last failure.",
+                "operationId": "MessageAttemptFailingEvent",
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/MessageAttemptFailingEvent"
+                            }
+                        }
+                    }
+                },
+                "responses": {
+                    "2XX": {
+                        "description": "Return any 2XX status to indicate that the data was received successfully"
+                    }
+                },
+                "summary": "MessageAttemptFailingEvent",
+                "tags": [
+                    "Webhooks"
+                ]
+            }
+        }
+    }
+}
diff --git a/server/rabbit/enabled_plugins b/server/rabbit/enabled_plugins
new file mode 100644
index 000000000..56c2f19c6
--- /dev/null
+++ b/server/rabbit/enabled_plugins
@@ -0,0 +1,1 @@
+[rabbitmq_management, rabbitmq_delayed_message_exchange].
diff --git a/server/rabbit/plugins/rabbitmq_delayed_message_exchange-3.11.1.ez b/server/rabbit/plugins/rabbitmq_delayed_message_exchange-3.11.1.ez
new file mode 100644
index 000000000..fb7530f36
Binary files /dev/null and b/server/rabbit/plugins/rabbitmq_delayed_message_exchange-3.11.1.ez differ
diff --git a/server/svix-server/Cargo.toml b/server/svix-server/Cargo.toml
index cf91970d7..705d911b9 100644
--- a/server/svix-server/Cargo.toml
+++ b/server/svix-server/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "svix-server"
-version = "0.81.0"
+version = "1.4.12"
 license = "MIT"
 description = "Svix webhooks server"
 
@@ -27,9 +27,9 @@ hyper-openssl = "0.9.2"
 openssl = "0.10.45"
 tokio = { version = "1.24.2", features = ["full"] }
 tower = "0.4.11"
-tower-http = { version = "0.3.4", features = ["trace", "cors", "request-id"] }
+tower-http = { version = "0.4.0", features = ["trace", "cors", "request-id"] }
 serde = { version = "1.0.133", features = ["derive"] }
-serde_json = { version = "1.0.74", features = ["arbitrary_precision"] }
+serde_json = { version = "1.0.74", features = ["arbitrary_precision", "raw_value"] }
 serde_urlencoded = "0.7.1"
 serde_path_to_error = "0.1.7"
 num_enum = "0.5.6"
@@ -49,9 +49,9 @@ ed25519-compact = "1.0.11"
 p256 = "0.10.1"
 chrono = { version="0.4.19", features = ["serde"] }
 reqwest = { version = "0.11.9", features = ["json", "rustls-tls", "trust-dns"], default-features = false }
-bb8 = "0.7.1"
-bb8-redis = "0.10.1"
-redis = { version = "0.21.5", features = ["tokio-comp", "tokio-native-tls-comp", "streams"] }
+bb8 = "0.8"
+bb8-redis = "0.13.1"
+redis = { version = "0.23", features = ["tokio-comp", "tokio-native-tls-comp", "streams", "cluster-async"] }
 thiserror = "1.0.30"
 bytes = "1.1.0"
 blake2 = "0.10.4"
@@ -66,8 +66,8 @@ redis_cluster_async = { git = "https://github.com/redis-rs/redis-cluster-async.g
 url = { version = "2.2.2", features = ["serde"] }
 rand = "0.8.5"
 jsonschema = "0.16.1"
-aide = { version = "0.9.0", features = ["axum", "redoc", "macros"] }
-schemars = { version = "0.8.11", features = ["chrono", "url"] }
+aide = { git = "https://github.com/svix/aide", rev = "e6e9af3", features = ["axum", "redoc", "macros", "axum-headers"] }
+schemars = { version = "0.8.11", features = ["chrono", "url", "preserve_order"] }
 indexmap = "1.9.2"
 trust-dns-resolver = "0.22.0"
 ipnet = { version = "2.5", features = ["serde"] }
@@ -75,6 +75,7 @@ urlencoding = "2.1.2"
 strum_macros = "0.24"
 strum = { version = "0.24", features = ["derive"] }
 form_urlencoded = "1.1.0"
+lapin = "2.1.1"
 
 [dev-dependencies]
 anyhow = "1.0.56"
diff --git a/server/svix-server/config.default.toml b/server/svix-server/config.default.toml
index ce6cd2c5f..eee7b7d3c 100644
--- a/server/svix-server/config.default.toml
+++ b/server/svix-server/config.default.toml
@@ -49,10 +49,10 @@ db_dsn = "postgresql://postgres:postgres@pgbouncer/postgres"
 # Higher values can significantly increase performance if your database can handle it.
 db_pool_max_size = 20
 
-# The defualt DSN for redis. `queue_dsn` and `cache_dsn` with take precedence over this value.
+# The default DSN for redis. `queue_dsn` and `cache_dsn` with take precedence over this value.
 # (can be left empty if not using redis or if Redis is configured through the queue and/or cache
 # specific DSNs)
-redis_dsn = "redis://redis:6379"
+# redis_dsn = "redis://redis:6379"
 
 # The maximum number of connections for the Redis pool. Minimum value of 10
 # Higher values can significantly increase performance if your database can handle it.
diff --git a/server/svix-server/description.md b/server/svix-server/description.md
new file mode 100644
index 000000000..751293383
--- /dev/null
+++ b/server/svix-server/description.md
@@ -0,0 +1,44 @@
+Welcome to the Svix API documentation!
+
+Useful links: [Homepage](https://www.svix.com) | [Support email](mailto:support+docs@svix.com) | [Blog](https://www.svix.com/blog/) | [Slack Community](https://www.svix.com/slack/)
+
+# Introduction
+
+This is the reference documentation and schemas for the [Svix webhook service](https://www.svix.com) API. For tutorials and other documentation please refer to [the documentation](https://docs.svix.com).
+
+## Main concepts
+
+In Svix you have four important entities you will be interacting with:
+
+- `messages`: these are the webhooks being sent. They can have contents and a few other properties.
+- `application`: this is where `messages` are sent to. Usually you want to create one application for each user on your platform.
+- `endpoint`: endpoints are the URLs messages will be sent to. Each application can have multiple `endpoints` and each message sent to that application will be sent to all of them (unless they are not subscribed to the sent event type).
+- `event-type`: event types are identifiers denoting the type of the message being sent. Event types are primarily used to decide which events are sent to which endpoint.
+
+
+## Authentication
+
+Get your authentication token (`AUTH_TOKEN`) from the [Svix dashboard](https://dashboard.svix.com) and use it as part of the `Authorization` header as such: `Authorization: Bearer ${AUTH_TOKEN}`.
+
+<SecurityDefinitions />
+
+
+## Code samples
+
+The code samples assume you already have the respective libraries installed and you know how to use them. For the latest information on how to do that, please refer to [the documentation](https://docs.svix.com/).
+
+
+## Idempotency
+
+Svix supports [idempotency](https://en.wikipedia.org/wiki/Idempotence) for safely retrying requests without accidentally performing the same operation twice. This is useful when an API call is disrupted in transit and you do not receive a response.
+
+To perform an idempotent request, pass the idempotency key in the `Idempotency-Key` header to the request. The idempotency key should be a unique value generated by the client. You can create the key in however way you like, though we suggest using UUID v4, or any other string with enough entropy to avoid collisions.
+
+Svix's idempotency works by saving the resulting status code and body of the first request made for any given idempotency key for any successful request. Subsequent requests with the same key return the same result.
+
+Please note that idempotency is only supported for `POST` requests.
+
+
+## Cross-Origin Resource Sharing
+
+This API features Cross-Origin Resource Sharing (CORS) implemented in compliance with [W3C spec](https://www.w3.org/TR/cors/). And that allows cross-domain communication from the browser. All responses have a wildcard same-origin which makes them completely public and accessible to everyone, including any code on any site.
diff --git a/server/svix-server/development.env b/server/svix-server/development.env
index a9c49d6d9..c8e8c7496 100644
--- a/server/svix-server/development.env
+++ b/server/svix-server/development.env
@@ -1,7 +1,8 @@
 # Example .env file for development
-DATABASE_URL=postgresql://postgres:postgres@localhost:8079/postgres # For sqlx
+DATABASE_URL="postgresql://postgres:postgres@localhost:8079/postgres" # For sqlx
 SVIX_CACHE_TYPE=memory
 SVIX_JWT_SECRET=x
 SVIX_LOG_LEVEL=trace
 SVIX_QUEUE_TYPE=redis
+SVIX_RABBIT_DSN="amqp://xivs:xivs@127.0.0.1:5672/%2f"
 SVIX_REDIS_DSN=redis://localhost:8078
diff --git a/server/svix-server/migrations/20230505222507_operational_webhook_event-types.down.sql b/server/svix-server/migrations/20230505222507_operational_webhook_event-types.down.sql
new file mode 100644
index 000000000..e24c27809
--- /dev/null
+++ b/server/svix-server/migrations/20230505222507_operational_webhook_event-types.down.sql
@@ -0,0 +1,1 @@
+DELETE FROM eventtype where id in ('evtype_2POKhK6pz91yFxPrGh92s2g38js', 'evtype_2POKhK6hm0oHxMc3eXrtoeUmWGH', 'evtype_2POKhK6QKJWGeDVSWXY2vJgDSQB', 'evtype_2POKhK6vcRRnl2tyeEOfcQ15C4x', 'evtype_2POKhK70XG6GQHcqTkeGvID3EvB', 'evtype_2POKhK6MvCdGn7rQmnj8yDYBuGJ', 'evtype_2POKhK7H4djUarm92hUYHt2HDI9'); 
\ No newline at end of file
diff --git a/server/svix-server/migrations/20230505222507_operational_webhook_event-types.up.sql b/server/svix-server/migrations/20230505222507_operational_webhook_event-types.up.sql
new file mode 100644
index 000000000..85601c914
--- /dev/null
+++ b/server/svix-server/migrations/20230505222507_operational_webhook_event-types.up.sql
@@ -0,0 +1,23 @@
+INSERT INTO eventtype(
+    created_at, updated_at, id, org_id, description, deleted, schemas, name, feature_flag)
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'evtype_2POKhK6pz91yFxPrGh92s2g38js', 'org_00000000000SvixManagement00', 'Sent when an endpoint is created.', false, '{"1": {"type": "object", "title": "EndpointCreatedEvent", "examples": [{"data": {"appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2", "appUid": "unique-app-identifier", "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2", "endpointUid": "unique-endpoint-identifier"}, "type": "endpoint.created"}], "required": ["data"], "properties": {"data": {"$ref": "#/definitions/EndpointCreatedEventData"}, "type": {"enum": ["endpoint.created"], "type": "string", "title": "Type", "default": "endpoint.created"}}, "definitions": {"EndpointCreatedEventData": {"type": "object", "title": "EndpointCreatedEventData", "required": ["appId", "endpointId"], "properties": {"appId": {"type": "string", "title": "Appid", "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "appUid": {"type": "string", "title": "Appuid", "example": "unique-app-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the application"}, "endpointId": {"type": "string", "title": "Endpointid", "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "endpointUid": {"type": "string", "title": "Endpointuid", "example": "unique-endpoint-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the endpoint"}}}}, "description": "Sent when an endpoint is created."}}', 'endpoint.created', NULL);
+
+INSERT INTO eventtype(
+    created_at, updated_at, id, org_id, description, deleted, schemas, name, feature_flag)
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'evtype_2POKhK6QKJWGeDVSWXY2vJgDSQB', 'org_00000000000SvixManagement00', 'Sent when an endpoint is updated.', false, '{"1": {"type": "object", "title": "EndpointUpdatedEvent", "examples": [{"data": {"appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2", "appUid": "unique-app-identifier", "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2", "endpointUid": "unique-endpoint-identifier"}, "type": "endpoint.updated"}], "required": ["data"], "properties": {"data": {"$ref": "#/definitions/EndpointUpdatedEventData"}, "type": {"enum": ["endpoint.updated"], "type": "string", "title": "Type", "default": "endpoint.updated"}}, "definitions": {"EndpointUpdatedEventData": {"type": "object", "title": "EndpointUpdatedEventData", "required": ["appId", "endpointId"], "properties": {"appId": {"type": "string", "title": "Appid", "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "appUid": {"type": "string", "title": "Appuid", "example": "unique-app-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the application"}, "endpointId": {"type": "string", "title": "Endpointid", "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "endpointUid": {"type": "string", "title": "Endpointuid", "example": "unique-endpoint-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the endpoint"}}}}, "description": "Sent when an endpoint is updated."}}', 'endpoint.updated', NULL);
+
+INSERT INTO eventtype(
+    created_at, updated_at, id, org_id, description, deleted, schemas, name, feature_flag)
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'evtype_2POKhK6vcRRnl2tyeEOfcQ15C4x', 'org_00000000000SvixManagement00', 'Sent when an endpoint is deleted.', false, '{"1": {"type": "object", "title": "EndpointDeletedEvent", "examples": [{"data": {"appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2", "appUid": "unique-app-identifier", "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2", "endpointUid": "unique-endpoint-identifier"}, "type": "endpoint.deleted"}], "required": ["data"], "properties": {"data": {"$ref": "#/definitions/EndpointDeletedEventData"}, "type": {"enum": ["endpoint.deleted"], "type": "string", "title": "Type", "default": "endpoint.deleted"}}, "definitions": {"EndpointDeletedEventData": {"type": "object", "title": "EndpointDeletedEventData", "required": ["appId", "endpointId"], "properties": {"appId": {"type": "string", "title": "Appid", "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "appUid": {"type": "string", "title": "Appuid", "example": "unique-app-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the application"}, "endpointId": {"type": "string", "title": "Endpointid", "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "endpointUid": {"type": "string", "title": "Endpointuid", "example": "unique-endpoint-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the endpoint"}}}}, "description": "Sent when an endpoint is deleted."}}', 'endpoint.deleted', NULL);
+
+INSERT INTO eventtype(
+    created_at, updated_at, id, org_id, description, deleted, schemas, name, feature_flag)
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'evtype_2POKhK70XG6GQHcqTkeGvID3EvB', 'org_00000000000SvixManagement00', 'Sent when an endpoint has been automatically disabled after continuous failures.', false, '{"1": {"type": "object", "title": "EndpointDisabledEvent", "examples": [{"data": {"appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2", "appUid": "unique-app-identifier", "failSince": "1970-01-01T00:00:00", "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2", "endpointUid": "unique-endpoint-identifier"}, "type": "endpoint.disabled"}], "required": ["data"], "properties": {"data": {"$ref": "#/definitions/EndpointDisabledEventData"}, "type": {"enum": ["endpoint.disabled"], "type": "string", "title": "Type", "default": "endpoint.disabled"}}, "definitions": {"EndpointDisabledEventData": {"type": "object", "title": "EndpointDisabledEventData", "required": ["appId", "endpointId", "failSince"], "properties": {"appId": {"type": "string", "title": "Appid", "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "appUid": {"type": "string", "title": "Appuid", "example": "unique-app-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the application"}, "failSince": {"type": "string", "title": "Failsince", "format": "date-time"}, "endpointId": {"type": "string", "title": "Endpointid", "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "endpointUid": {"type": "string", "title": "Endpointuid", "example": "unique-endpoint-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the endpoint"}}}}, "description": "Sent when an endpoint has been automatically disabled after continuous failures."}}', 'endpoint.disabled', NULL);
+
+INSERT INTO eventtype(
+    created_at, updated_at, id, org_id, description, deleted, schemas, name, feature_flag)
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'evtype_2POKhK6MvCdGn7rQmnj8yDYBuGJ', 'org_00000000000SvixManagement00', 'Sent after a message has been failing for a few times.', false, '{"1": {"type": "object", "title": "MessageAttemptFailingEvent", "examples": [{"data": {"appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2", "msgId": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2", "appUid": "unique-app-identifier", "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2", "msgEventId": "unique-msg-identifier", "lastAttempt": {"id": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2", "timestamp": "1970-01-01T00:00:00", "responseStatusCode": 500}}, "type": "message.attempt.failing"}], "required": ["data"], "properties": {"data": {"$ref": "#/definitions/MessageAttemptFailingEventData"}, "type": {"enum": ["message.attempt.failing"], "type": "string", "title": "Type", "default": "message.attempt.failing"}}, "definitions": {"MessageAttemptFailedData": {"type": "object", "title": "MessageAttemptFailedData", "required": ["id", "responseStatusCode", "timestamp"], "properties": {"id": {"type": "string", "title": "Id", "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "timestamp": {"type": "string", "title": "Timestamp", "format": "date-time"}, "responseStatusCode": {"type": "integer", "title": "Responsestatuscode", "example": 500}}}, "MessageAttemptFailingEventData": {"type": "object", "title": "MessageAttemptFailingEventData", "required": ["appId", "msgId", "endpointId", "lastAttempt"], "properties": {"appId": {"type": "string", "title": "Appid", "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "msgId": {"type": "string", "title": "Msgid", "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "appUid": {"type": "string", "title": "Appuid", "example": "unique-app-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the application"}, "endpointId": {"type": "string", "title": "Endpointid", "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "msgEventId": {"type": "string", "title": "Msgeventid", "example": "evt_pNZKtWg8Azow", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the message"}, "lastAttempt": {"$ref": "#/definitions/MessageAttemptFailedData"}}}}, "description": "Sent after a message has been failing for a few times.\nSent on the fourth failure. It complements `message.attempt.exhausted` which is sent after the last failure."}}', 'message.attempt.failing', NULL);
+
+INSERT INTO eventtype(
+    created_at, updated_at, id, org_id, description, deleted, schemas, name, feature_flag)
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'evtype_2POKhK7H4djUarm92hUYHt2HDI9', 'org_00000000000SvixManagement00', 'Sent when a message delivery has failed (all of the retry attempts have been exhausted).', false, '{"1": {"type": "object", "title": "MessageAttemptExhaustedEvent", "examples": [{"data": {"appId": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2", "msgId": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2", "appUid": "unique-app-identifier", "endpointId": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2", "msgEventId": "unique-msg-identifier", "lastAttempt": {"id": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2", "timestamp": "1970-01-01T00:00:00", "responseStatusCode": 500}}, "type": "message.attempt.exhausted"}], "required": ["data"], "properties": {"data": {"$ref": "#/definitions/MessageAttemptExhaustedEventData"}, "type": {"enum": ["message.attempt.exhausted"], "type": "string", "title": "Type", "default": "message.attempt.exhausted"}}, "definitions": {"MessageAttemptFailedData": {"type": "object", "title": "MessageAttemptFailedData", "required": ["id", "responseStatusCode", "timestamp"], "properties": {"id": {"type": "string", "title": "Id", "example": "atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "timestamp": {"type": "string", "title": "Timestamp", "format": "date-time"}, "responseStatusCode": {"type": "integer", "title": "Responsestatuscode", "example": 500}}}, "MessageAttemptExhaustedEventData": {"type": "object", "title": "MessageAttemptExhaustedEventData", "required": ["appId", "msgId", "endpointId", "lastAttempt"], "properties": {"appId": {"type": "string", "title": "Appid", "example": "app_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "msgId": {"type": "string", "title": "Msgid", "example": "msg_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "appUid": {"type": "string", "title": "Appuid", "example": "unique-app-identifier", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the application"}, "endpointId": {"type": "string", "title": "Endpointid", "example": "ep_1srOrx2ZWZBpBUvZwXKQmoEYga2"}, "msgEventId": {"type": "string", "title": "Msgeventid", "example": "evt_pNZKtWg8Azow", "pattern": "^[a-zA-Z0-9\\-_.]+$", "nullable": true, "maxLength": 256, "minLength": 1, "description": "Optional unique identifier for the message"}, "lastAttempt": {"$ref": "#/definitions/MessageAttemptFailedData"}}}}, "description": "Sent when a message delivery has failed (all of the retry attempts have been exhausted)."}}', 'message.attempt.exhausted', NULL);
diff --git a/server/svix-server/src/cfg.rs b/server/svix-server/src/cfg.rs
index 4f3db9701..12ac75f37 100644
--- a/server/svix-server/src/cfg.rs
+++ b/server/svix-server/src/cfg.rs
@@ -181,6 +181,10 @@ pub struct ConfigurationInner {
     /// Maximum number of concurrent worker tasks to spawn (0 is unlimited)
     pub worker_max_tasks: u16,
 
+    /// The address of the rabbitmq exchange
+    pub rabbit_dsn: Option<Arc<String>>,
+    pub rabbit_consumer_prefetch_size: Option<u16>,
+
     #[serde(flatten)]
     pub internal: InternalConfig,
 }
@@ -216,6 +220,17 @@ fn validate_config_complete(
                 });
             }
         }
+        QueueType::RabbitMQ => {
+            if config.rabbit_dsn.is_none() {
+                return Err(ValidationError {
+                    code: Cow::from("missing field"),
+                    message: Some(Cow::from(
+                        "The rabbit_dsn field must be set if the queue_type is `rabbitmq`",
+                    )),
+                    params: HashMap::new(),
+                });
+            }
+        }
     }
 
     Ok(())
@@ -239,6 +254,7 @@ impl ConfigurationInner {
             QueueType::Memory => QueueBackend::Memory,
             QueueType::Redis => QueueBackend::Redis(self.queue_dsn().expect(err)),
             QueueType::RedisCluster => QueueBackend::RedisCluster(self.queue_dsn().expect(err)),
+            QueueType::RabbitMQ => QueueBackend::RabbitMq(self.rabbit_dsn.as_ref().expect(err)),
         }
     }
 
@@ -280,6 +296,7 @@ pub enum QueueBackend<'a> {
     Memory,
     Redis(&'a str),
     RedisCluster(&'a str),
+    RabbitMq(&'a str),
 }
 
 #[derive(Debug, Eq, PartialEq)]
@@ -311,6 +328,7 @@ pub enum QueueType {
     Memory,
     Redis,
     RedisCluster,
+    RabbitMQ,
 }
 
 #[derive(Clone, Debug, Deserialize)]
@@ -419,7 +437,7 @@ mod tests {
         // NOTE: Does not use `figment::Jail` like the above because set env vars will leak into
         // other tests overwriting real configurations
         let mut cfg = load().unwrap();
-        let mut cfg = Arc::make_mut(&mut cfg);
+        let cfg = Arc::make_mut(&mut cfg);
 
         // Override all relevant values
         cfg.queue_type = QueueType::Redis;
diff --git a/server/svix-server/src/core/cache/mod.rs b/server/svix-server/src/core/cache/mod.rs
index 6d438ce42..985773ca7 100644
--- a/server/svix-server/src/core/cache/mod.rs
+++ b/server/svix-server/src/core/cache/mod.rs
@@ -26,10 +26,10 @@ pub enum Error {
     #[error("error deserializing byte array")]
     DeserializationBytes(#[from] FromUtf8Error),
 
-    #[error("Redis pool error")]
+    #[error("Redis pool error: {0}")]
     Pool(#[from] bb8::RunError<RedisError>),
 
-    #[error("Redis database error")]
+    #[error("Redis database error: {0}")]
     Database(#[from] RedisError),
 
     #[error("input error: {0}")]
diff --git a/server/svix-server/src/core/operational_webhooks.rs b/server/svix-server/src/core/operational_webhooks.rs
index 435e62725..d4c1d3bc4 100644
--- a/server/svix-server/src/core/operational_webhooks.rs
+++ b/server/svix-server/src/core/operational_webhooks.rs
@@ -7,6 +7,7 @@ use std::sync::Arc;
 
 use chrono::{DateTime, Utc};
 use http::StatusCode;
+use schemars::JsonSchema;
 use serde::Serialize;
 use svix::api::{MessageIn, Svix, SvixOptions};
 
@@ -23,9 +24,9 @@ use crate::{
 };
 
 /// Sent when an endpoint has been automatically disabled after continuous failures.
-#[derive(Debug, Serialize)]
+#[derive(Debug, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
-pub struct EndpointDisabledEvent {
+pub struct EndpointDisabledEventData {
     pub app_id: ApplicationId,
     pub app_uid: Option<ApplicationUid>,
     pub endpoint_id: EndpointId,
@@ -34,7 +35,7 @@ pub struct EndpointDisabledEvent {
 }
 
 /// Sent when an endpoint is created, updated, or deleted
-#[derive(Debug, Serialize)]
+#[derive(Debug, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointEvent {
     pub app_id: ApplicationId,
@@ -54,7 +55,7 @@ impl EndpointEvent {
     }
 }
 
-#[derive(Debug, Serialize)]
+#[derive(Debug, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageAttempetLast {
     pub id: MessageAttemptId,
@@ -75,7 +76,7 @@ impl From<messageattempt::Model> for MessageAttempetLast {
 /// Sent when a message delivery has failed (all of the retry attempts have been exhausted) as a
 /// "message.attempt.exhausted" type or after it's failed four times as a "message.attempt.failing"
 /// event.
-#[derive(Debug, Serialize)]
+#[derive(Debug, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageAttemptEvent {
     pub app_id: ApplicationId,
@@ -90,7 +91,7 @@ pub struct MessageAttemptEvent {
 #[serde(tag = "type", content = "data")]
 pub enum OperationalWebhook {
     #[serde(rename = "endpoint.disabled")]
-    EndpointDisabled(EndpointDisabledEvent),
+    EndpointDisabled(EndpointDisabledEventData),
     #[serde(rename = "endpoint.created")]
     EndpointCreated(EndpointEvent),
     #[serde(rename = "endpoint.updated")]
diff --git a/server/svix-server/src/core/security.rs b/server/svix-server/src/core/security.rs
index 6a57c57c8..2cc3dc5d0 100644
--- a/server/svix-server/src/core/security.rs
+++ b/server/svix-server/src/core/security.rs
@@ -26,7 +26,7 @@ pub fn default_org_id() -> OrganizationId {
     OrganizationId("org_23rb8YdGqMT0qIzpgGwdXfHirMu".to_owned())
 }
 
-/// The default org_id we use (useful for generating JWTs when testing).
+/// The default Operational Webhooks org_id
 pub fn management_org_id() -> OrganizationId {
     OrganizationId("org_00000000000SvixManagement00".to_owned())
 }
diff --git a/server/svix-server/src/core/types/metadata.rs b/server/svix-server/src/core/types/metadata.rs
index b3e9e6ae9..0157a30d9 100644
--- a/server/svix-server/src/core/types/metadata.rs
+++ b/server/svix-server/src/core/types/metadata.rs
@@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize};
 pub const MAX_METADATA_SIZE: usize = 4096;
 
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Default, JsonSchema)]
+#[schemars(transparent)]
 pub struct Metadata(HashMap<String, String>);
 
 json_wrapper!(Metadata);
diff --git a/server/svix-server/src/core/types/mod.rs b/server/svix-server/src/core/types/mod.rs
index 140e0a22f..f913d1c76 100644
--- a/server/svix-server/src/core/types/mod.rs
+++ b/server/svix-server/src/core/types/mod.rs
@@ -202,7 +202,15 @@ fn validate_limited_str(s: &str) -> std::result::Result<(), ValidationErrors> {
         static ref RE: Regex = Regex::new(r"^[a-zA-Z0-9\-_.]+$").unwrap();
     }
     let mut errors = ValidationErrors::new();
-    if s.len() > MAX_LENGTH {
+    if s.is_empty() {
+        errors.add(
+            ALL_ERROR,
+            validation_error(
+                Some("length"),
+                Some("String must be at least one character"),
+            ),
+        );
+    } else if s.len() > MAX_LENGTH {
         errors.add(
             ALL_ERROR,
             validation_error(Some("length"), Some("String too long")),
@@ -250,11 +258,16 @@ pub trait BaseUid: Deref<Target = String> {
 
 macro_rules! string_wrapper {
     ($name_id:ident) => {
-        #[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
+        #[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)]
         pub struct $name_id(pub String);
 
         string_wrapper_impl!($name_id);
     };
+    ($name_id:ident, $string_schema:expr) => {
+        string_wrapper!($name_id);
+
+        common_jsonschema_impl!($name_id, $string_schema);
+    };
 }
 
 macro_rules! string_wrapper_impl {
@@ -334,9 +347,79 @@ macro_rules! string_wrapper_impl {
     };
 }
 
+/// A container type for storing schema information commonly used by string
+/// wrapper types.
+#[derive(Default)]
+pub struct StringSchema {
+    pub string_validation: Option<schemars::schema::StringValidation>,
+    pub example: Option<String>,
+}
+
+impl StringSchema {
+    pub fn schema_for_ids(prefix: &'static str) -> Self {
+        Self {
+            string_validation: None,
+            example: Some(format!("{prefix}1srOrx2ZWZBpBUvZwXKQmoEYga2")),
+        }
+    }
+
+    pub fn schema_for_uids(prefix: &'static str) -> Self {
+        Self {
+            string_validation: Some(schemars::schema::StringValidation {
+                min_length: Some(1),
+                max_length: Some(256),
+                pattern: Some(r"^[a-zA-Z0-9\-_.]+$".to_string()),
+            }),
+            example: Some(format!("unique-{prefix}identifier").replace('_', "-")),
+        }
+    }
+}
+
+/// Macro to generate a [`JsonSchema`] impl for string wrapper types.
+/// * `name_id` is the name of the identifier for which the impl is generated.
+/// * `string_schema` is a [`StringSchema`] to enrich the generated schema with
+///   more information.
+macro_rules! common_jsonschema_impl {
+    ($name_id:ident, $string_schema:expr) => {
+        impl ::schemars::JsonSchema for $name_id {
+            fn schema_name() -> String {
+                stringify!($name_id).to_string()
+            }
+
+            fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
+                let mut schema = String::json_schema(gen);
+
+                if let schemars::schema::Schema::Object(obj) = &mut schema {
+                    // This is just to help with type hints when the macro is expanded.
+                    let options: $crate::core::types::StringSchema = $string_schema;
+
+                    obj.string = options.string_validation.map(Box::new);
+                    if let Some(example) = options.example {
+                        obj.extensions
+                            .insert("example".to_string(), serde_json::Value::String(example));
+                    }
+                }
+
+                schema
+            }
+
+            fn is_referenceable() -> bool {
+                false
+            }
+        }
+    };
+}
+
 macro_rules! create_id_type {
     ($name_id:ident, $key_prefix:literal) => {
-        string_wrapper!($name_id);
+        create_id_type!(
+            $name_id,
+            $key_prefix,
+            $crate::core::types::StringSchema::default()
+        );
+    };
+    ($name_id:ident, $key_prefix:literal, $string_schema:expr) => {
+        string_wrapper!($name_id, $string_schema);
 
         impl BaseId for $name_id {
             const PREFIX: &'static str = $key_prefix;
@@ -366,10 +449,17 @@ macro_rules! create_id_type {
 macro_rules! create_all_id_types {
     ($name_id:ident, $name_uid:ident, $name_id_or_uid:ident, $key_prefix:literal) => {
         // Id
-        create_id_type!($name_id, $key_prefix);
+        create_id_type!(
+            $name_id,
+            $key_prefix,
+            $crate::core::types::StringSchema::schema_for_ids($key_prefix)
+        );
 
         // Uid
-        string_wrapper!($name_uid);
+        string_wrapper!(
+            $name_uid,
+            $crate::core::types::StringSchema::schema_for_uids($key_prefix)
+        );
 
         impl BaseUid for $name_uid {
             const ID_PREFIX: &'static str = $key_prefix;
@@ -388,9 +478,14 @@ macro_rules! create_all_id_types {
         }
 
         // Id or uid
-        #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
+        #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
         pub struct $name_id_or_uid(pub String);
 
+        common_jsonschema_impl!(
+            $name_id_or_uid,
+            $crate::core::types::StringSchema::schema_for_uids($key_prefix)
+        );
+
         impl From<$name_id_or_uid> for $name_uid {
             fn from(v: $name_id_or_uid) -> Self {
                 Self(v.0)
@@ -418,7 +513,14 @@ macro_rules! create_all_id_types {
 }
 
 create_id_type!(OrganizationId, "org_");
-create_id_type!(MessageAttemptId, "atmpt_");
+create_id_type!(
+    MessageAttemptId,
+    "atmpt_",
+    crate::core::types::StringSchema {
+        string_validation: None,
+        example: Some("atmpt_1srOrx2ZWZBpBUvZwXKQmoEYga2".to_string()),
+    }
+);
 create_id_type!(MessageEndpointId, "msgep_");
 create_id_type!(EventTypeId, "evtype_");
 
@@ -426,7 +528,17 @@ create_all_id_types!(ApplicationId, ApplicationUid, ApplicationIdOrUid, "app_");
 create_all_id_types!(EndpointId, EndpointUid, EndpointIdOrUid, "ep_");
 create_all_id_types!(MessageId, MessageUid, MessageIdOrUid, "msg_");
 
-string_wrapper!(EventTypeName);
+string_wrapper!(
+    EventTypeName,
+    crate::core::types::StringSchema {
+        string_validation: Some(schemars::schema::StringValidation {
+            max_length: Some(256),
+            min_length: None,
+            pattern: Some(r"^[a-zA-Z0-9\-_.]+$".to_string()),
+        }),
+        example: Some("user.signup".to_string()),
+    }
+);
 
 impl Validate for EventTypeName {
     fn validate(&self) -> Result<(), validator::ValidationErrors> {
@@ -434,7 +546,17 @@ impl Validate for EventTypeName {
     }
 }
 
-string_wrapper!(EventChannel);
+string_wrapper!(
+    EventChannel,
+    crate::core::types::StringSchema {
+        string_validation: Some(schemars::schema::StringValidation {
+            max_length: Some(128),
+            min_length: None,
+            pattern: Some(r"^[a-zA-Z0-9\-_.]+$".to_string()),
+        }),
+        example: Some("project_1337".to_string()),
+    }
+);
 
 impl Validate for EventChannel {
     fn validate(&self) -> Result<(), validator::ValidationErrors> {
@@ -443,6 +565,7 @@ impl Validate for EventChannel {
 }
 
 #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
+#[schemars(transparent)]
 pub struct EventChannelSet(pub HashSet<EventChannel>);
 json_wrapper!(EventChannelSet);
 
@@ -456,6 +579,7 @@ impl Validate for EventChannelSet {
 }
 
 #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, JsonSchema)]
+#[schemars(transparent)]
 pub struct EventTypeNameSet(pub HashSet<EventTypeName>);
 json_wrapper!(EventTypeNameSet);
 
@@ -993,9 +1117,21 @@ impl JsonSchema for EndpointSecret {
                 pattern: Some(KEY_PATTERN.to_string()),
                 ..Default::default()
             }));
+            obj.metadata = Some(Box::new(schemars::schema::Metadata{
+                description: Some("The endpoint's verification secret. If `null` is passed, a secret is automatically generated. Format: `base64` encoded random bytes optionally prefixed with `whsec_`. Recommended size: 24.".to_string()),
+                .. Default::default()
+            }));
+            obj.extensions.insert(
+                "example".to_string(),
+                serde_json::Value::String("whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD".to_string()),
+            );
         }
         schema
     }
+
+    fn is_referenceable() -> bool {
+        false
+    }
 }
 
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
@@ -1060,6 +1196,7 @@ fn validate_header_key(k: &str, errors: &mut ValidationErrors) {
 }
 
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Default, JsonSchema)]
+#[schemars(transparent)]
 pub struct EndpointHeaders(pub HashMap<String, String>);
 json_wrapper!(EndpointHeaders);
 
@@ -1107,6 +1244,7 @@ fn validate_header_map(
 }
 
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Default, JsonSchema)]
+#[schemars(transparent)]
 pub struct EndpointHeadersPatch(pub HashMap<String, Option<String>>);
 json_wrapper!(EndpointHeadersPatch);
 
@@ -1135,15 +1273,93 @@ impl Validate for EndpointHeadersPatch {
     }
 }
 
+/// A macro to which you pass the list of variants of an enum using `repr(N)`
+/// and it returns a `Vec<(N, String)>`, where each element is `(value, "VariantStringified")`
+macro_rules! repr_enum {
+    ($($variant:ident),+) => {
+        vec![
+            $(($variant.into(), stringify!($variant).to_string())),+
+        ]
+    }
+}
+
+/// Generates a `JsonSchema` implementation for an enum using `repr(N)`. The
+/// enum must also derive `IntoPrimitive`.
+///
+/// Arguments are:
+/// 1. Name of the enum type, `Foo`
+/// 2. The repr type used, e.g. in case of `repr(i16)` it must be `i16`
+/// 3. The string description to be used in the docs.
+/// Remaining arguments must be the variants in order. For example:
+///
+/// ```
+/// #[derive(IntoPrimitive)]
+/// #[repr(u8)]
+/// enum MyEnum {
+///     Foo = 0,
+///     Bar = 1,
+///     Qux = 5,
+/// }
+///
+/// jsonschema_for_repr_enum{
+///     MyEnum,
+///     u8,
+///     "My nice little enum",
+///     Foo, Bar, Qux
+/// }
+/// ```
+macro_rules! jsonschema_for_repr_enum {
+    ($tyname:ty, $repr_ty:ty, $descr:expr, $($variant:ident),+) => {
+        impl JsonSchema for $tyname {
+            fn schema_name() -> String {
+                stringify!($tyname).to_string()
+            }
+
+            fn json_schema(_: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
+                use schemars::schema::{InstanceType, Metadata, Schema, SchemaObject, SingleOrVec};
+                use $tyname::*;
+
+                // A list of variant values and their corresponding name.
+                let variants: Vec<($repr_ty, String)> = repr_enum!($($variant),+);
+                // The list of possible enum primitive values.
+                let values = variants.iter().map(|(value, _)| serde_json::json!(value)).collect();
+                // The list of nice variant names the above values correspond to.
+                let variant_names = variants.iter().map(|(_, name)| serde_json::Value::String(name.clone())).collect();
+
+                Schema::Object(SchemaObject{
+                    metadata: Some(Box::new(Metadata {
+                        title: Some(Self::schema_name()),
+                        description: Some($descr.to_string()),
+                        ..Default::default()
+                    })),
+                    instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::Integer))),
+                    enum_values: Some(values),
+                    extensions: indexmap::indexmap!{
+                        "x-enum-varnames".to_string() => serde_json::Value::Array(variant_names),
+                    },
+                    ..Default::default()
+                })
+            }
+        }
+    }
+}
+
 #[repr(i16)]
-#[derive(Clone, Debug, Copy, PartialEq, Eq, IntoPrimitive, TryFromPrimitive, JsonSchema)]
+#[derive(Clone, Debug, Copy, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
 pub enum MessageAttemptTriggerType {
     Scheduled = 0,
     Manual = 1,
 }
 
+jsonschema_for_repr_enum! {
+    MessageAttemptTriggerType,
+    i16,
+    "The reason an attempt was made:\n- Scheduled = 0\n- Manual = 1",
+    Scheduled, Manual
+}
+
 #[repr(i16)]
-#[derive(Clone, Debug, Copy, PartialEq, IntoPrimitive, TryFromPrimitive, Hash, Eq, JsonSchema)]
+#[derive(Clone, Debug, Copy, PartialEq, IntoPrimitive, TryFromPrimitive, Hash, Eq)]
 pub enum MessageStatus {
     Success = 0,
     Pending = 1,
@@ -1151,8 +1367,15 @@ pub enum MessageStatus {
     Sending = 3,
 }
 
+jsonschema_for_repr_enum! {
+    MessageStatus,
+    i16,
+    "The sending status of the message:\n- Success = 0\n- Pending = 1\n- Fail = 2\n- Sending = 3",
+    Success, Pending, Fail, Sending
+}
+
 #[repr(i16)]
-#[derive(Clone, Debug, Copy, PartialEq, Eq, IntoPrimitive, TryFromPrimitive, JsonSchema)]
+#[derive(Clone, Debug, Copy, PartialEq, Eq, IntoPrimitive, TryFromPrimitive)]
 pub enum StatusCodeClass {
     CodeNone = 0,
     Code1xx = 100,
@@ -1162,13 +1385,32 @@ pub enum StatusCodeClass {
     Code5xx = 500,
 }
 
+jsonschema_for_repr_enum! {
+    StatusCodeClass,
+    i16,
+    "The different classes of HTTP status codes:\n- CodeNone = 0\n- Code1xx = 100\n- Code2xx = 200\n- Code3xx = 300\n- Code4xx = 400\n- Code5xx = 500",
+    CodeNone, Code1xx, Code2xx, Code3xx, Code4xx, Code5xx
+}
+
 enum_wrapper!(MessageAttemptTriggerType);
 enum_wrapper!(MessageStatus);
 enum_wrapper!(StatusCodeClass);
 
-#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, JsonSchema)]
+#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize)]
 pub struct FeatureFlag(pub String);
 
+common_jsonschema_impl!(
+    FeatureFlag,
+    crate::core::types::StringSchema {
+        string_validation: Some(schemars::schema::StringValidation {
+            min_length: None,
+            max_length: Some(256),
+            pattern: Some(r"^[a-zA-Z0-9\-_.]+$".to_string()),
+        }),
+        example: Some("cool-new-feature".to_string()),
+    }
+);
+
 string_wrapper_impl!(FeatureFlag);
 
 impl<'de> Deserialize<'de> for FeatureFlag {
@@ -1217,10 +1459,16 @@ mod tests {
 
         // Check length
         let long_str: String = "X".repeat(300);
-        let app_id = ApplicationUid(long_str.clone());
+        let app_id = ApplicationId(long_str.clone());
         assert!(app_id.validate().is_err());
         let app_uid = ApplicationUid(long_str);
         assert!(app_uid.validate().is_err());
+
+        let empty_str: String = "".to_owned();
+        let app_id = ApplicationId(empty_str.clone());
+        assert!(app_id.validate().is_err());
+        let app_uid = ApplicationUid(empty_str);
+        assert!(app_uid.validate().is_err());
     }
 
     #[test]
@@ -1237,6 +1485,10 @@ mod tests {
         let long_str: String = "X".repeat(300);
         let evt_name = EventTypeName(long_str);
         assert!(evt_name.validate().is_err());
+
+        let empty_str = "".to_owned();
+        let evt_name = EventTypeName(empty_str);
+        assert!(evt_name.validate().is_err());
     }
 
     #[test]
diff --git a/server/svix-server/src/core/webhook_http_client.rs b/server/svix-server/src/core/webhook_http_client.rs
index 93d5649ec..1f1b8cdea 100644
--- a/server/svix-server/src/core/webhook_http_client.rs
+++ b/server/svix-server/src/core/webhook_http_client.rs
@@ -52,6 +52,7 @@ pub enum Error {
     FailedRequest(hyper::Error),
 }
 
+#[derive(Clone)]
 pub struct WebhookClient {
     client: Client<HttpsConnector<NonLocalConnector>, Body>,
     whitelist_nets: Arc<Vec<IpNet>>,
diff --git a/server/svix-server/src/db/models/eventtype.rs b/server/svix-server/src/db/models/eventtype.rs
index 6894e5b5d..562347447 100644
--- a/server/svix-server/src/db/models/eventtype.rs
+++ b/server/svix-server/src/db/models/eventtype.rs
@@ -78,10 +78,53 @@ impl Entity {
     }
 }
 
-#[derive(Clone, Debug, PartialEq, Eq, Serialize, Default, JsonSchema)]
+pub fn schema_example() -> serde_json::Value {
+    serde_json::json!({
+        "description": "An invoice was paid by a user",
+        "properties": {
+            "invoiceId": {
+                "description": "The invoice id",
+                "type": "string"
+            },
+            "userId": {
+                "description": "The user id",
+                "type": "string"
+            }
+        },
+        "required": [
+            "invoiceId",
+            "userId"
+        ],
+        "title": "Invoice Paid Event",
+        "type": "object"
+    })
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Serialize, Default)]
 pub struct Schema(HashMap<String, Json>);
 json_wrapper!(Schema);
 
+impl JsonSchema for Schema {
+    fn schema_name() -> String {
+        stringify!(Schema).to_string()
+    }
+
+    fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
+        let mut schema = gen.subschema_for::<HashMap<String, Json>>();
+
+        if let schemars::schema::Schema::Object(obj) = &mut schema {
+            obj.extensions
+                .insert("example".to_string(), schema_example());
+        }
+
+        schema
+    }
+
+    fn is_referenceable() -> bool {
+        false
+    }
+}
+
 impl<'de> Deserialize<'de> for Schema {
     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
     where
diff --git a/server/svix-server/src/error.rs b/server/svix-server/src/error.rs
index a56ad2551..4c5c6571d 100644
--- a/server/svix-server/src/error.rs
+++ b/server/svix-server/src/error.rs
@@ -238,6 +238,12 @@ impl<T> Traceable<T> for std::result::Result<T, TransactionError<Error>> {
     }
 }
 
+impl<T> Traceable<T> for std::result::Result<T, lapin::Error> {
+    fn trace(self, location: &'static str) -> Result<T> {
+        self.map_err(|e| Error::queue(format!("{e:?}"), location))
+    }
+}
+
 #[derive(Debug, Clone)]
 pub enum ErrorType {
     /// A generic error
@@ -276,11 +282,25 @@ impl From<HttpError> for ErrorType {
     }
 }
 
+// Python generation relies on the title of this being `HttpError`
+#[derive(Debug, Clone, Serialize, JsonSchema)]
+#[schemars(rename = "HttpErrorOut", title = "HttpError")]
+pub struct StandardHttpError {
+    code: String,
+    detail: String,
+}
+
+#[derive(Debug, Clone, Serialize, JsonSchema)]
+#[schemars(rename = "HTTPValidationError")]
+pub struct ValidationHttpError {
+    detail: Vec<ValidationErrorItem>,
+}
+
 #[derive(Debug, Clone, Serialize)]
 #[serde(untagged)]
 pub enum HttpErrorBody {
-    Standard { code: String, detail: String },
-    Validation { detail: Vec<ValidationErrorItem> },
+    Standard(StandardHttpError),
+    Validation(ValidationHttpError),
 }
 
 #[derive(Debug, Clone, Serialize, PartialEq, Eq, JsonSchema)]
@@ -311,7 +331,7 @@ impl HttpError {
     fn new_standard(status: StatusCode, code: String, detail: String) -> Self {
         Self {
             status,
-            body: HttpErrorBody::Standard { code, detail },
+            body: HttpErrorBody::Standard(StandardHttpError { code, detail }),
         }
     }
 
@@ -358,7 +378,7 @@ impl HttpError {
     pub fn unprocessable_entity(detail: Vec<ValidationErrorItem>) -> Self {
         Self {
             status: StatusCode::UNPROCESSABLE_ENTITY,
-            body: HttpErrorBody::Validation { detail },
+            body: HttpErrorBody::Validation(ValidationHttpError { detail }),
         }
     }
 
@@ -388,13 +408,13 @@ impl From<HttpError> for Error {
 impl fmt::Display for HttpError {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         match &self.body {
-            HttpErrorBody::Standard { code, detail } => write!(
+            HttpErrorBody::Standard(StandardHttpError { code, detail }) => write!(
                 f,
                 "status={} code=\"{}\" detail=\"{}\"",
                 self.status, code, detail
             ),
 
-            HttpErrorBody::Validation { detail } => {
+            HttpErrorBody::Validation(ValidationHttpError { detail }) => {
                 write!(
                     f,
                     "status={} detail={}",
diff --git a/server/svix-server/src/lib.rs b/server/svix-server/src/lib.rs
index f542959b9..19163ff91 100644
--- a/server/svix-server/src/lib.rs
+++ b/server/svix-server/src/lib.rs
@@ -4,10 +4,7 @@
 #![warn(clippy::all)]
 #![forbid(unsafe_code)]
 
-use aide::{
-    axum::ApiRouter,
-    openapi::{self, OpenApi},
-};
+use aide::axum::ApiRouter;
 
 use crate::core::cache::Cache;
 use cfg::ConfigurationInner;
@@ -42,6 +39,7 @@ pub mod core;
 pub mod db;
 pub mod error;
 pub mod expired_message_cleaner;
+pub mod openapi;
 pub mod queue;
 pub mod redis;
 pub mod v1;
@@ -85,111 +83,6 @@ pub async fn run(cfg: Configuration, listener: Option<TcpListener>) {
     run_with_prefix(None, cfg, listener).await
 }
 
-pub fn initialize_openapi() -> OpenApi {
-    aide::gen::on_error(|error| {
-        tracing::error!("Aide generation error: {error}");
-    });
-    // Extract schemas to `#/components/schemas/` instead of using inline schemas.
-    aide::gen::extract_schemas(true);
-    // Have aide attempt to infer the `Content-Type` of responses based on the
-    // handlers' return types.
-    aide::gen::infer_responses(true);
-
-    aide::gen::in_context(|ctx| {
-        ctx.schema = schemars::gen::SchemaGenerator::new(
-            schemars::gen::SchemaSettings::draft07().with(|s| {
-                // HACK: These are set by the `extract_schemas` call above, but
-                // reinitializing the schema generator here means we are
-                // overwriting it. Hopefully, in the future we can set schema
-                // generator options without overwriting settings set by aide
-                // internally.
-                s.inline_subschemas = false;
-                s.definitions_path = "#/components/schemas/".into();
-
-                // Schemars generates an `anyOf` for `Option<T>` by default. This changes that
-                // to instead simply mark them as nullable.
-                s.option_nullable = true;
-                s.option_add_null_type = false;
-            }),
-        );
-    });
-
-    let tag_groups = serde_json::json![[
-        {
-            "name": "General",
-            "tags": ["Application", "Event Type"]
-        },
-        {
-            "name": "Application specific",
-            "tags": ["Authentication", "Endpoint", "Message", "Message Attempt", "Integration"]
-        },
-        {
-            "name": "Utility",
-            "tags": ["Health"]
-        },
-        {
-            "name": "Webhooks",
-            "tags": ["Webhooks"]
-        }
-    ]];
-
-    OpenApi {
-        info: openapi::Info {
-            title: "Svix API".to_owned(),
-            version: "1.4".to_owned(),
-            extensions: indexmap::indexmap! {
-                "x-logo".to_string() => serde_json::json!({
-                    "url": "https://www.svix.com/static/img/brand-padded.svg",
-                    "altText": "Svix Logo",
-                }),
-            },
-            ..Default::default()
-        },
-        tags: vec![
-            openapi::Tag {
-                name: "Application".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Message".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Message Attempt".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Endpoint".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Integration".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Event Type".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Authentication".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Health".to_owned(),
-                ..openapi::Tag::default()
-            },
-            openapi::Tag {
-                name: "Webhooks".to_owned(),
-                ..openapi::Tag::default()
-            },
-        ],
-        extensions: indexmap::indexmap! {
-            "x-tagGroups".to_owned() => tag_groups,
-        },
-        ..Default::default()
-    }
-}
-
 #[derive(Clone)]
 pub struct AppState {
     db: DatabaseConnection,
@@ -237,7 +130,7 @@ pub async fn run_with_prefix(
     // OpenAPI/aide must be initialized before any routers are constructed
     // because its initialization sets generation-global settings which are
     // needed at router-construction time.
-    let mut openapi = initialize_openapi();
+    let mut openapi = openapi::initialize_openapi();
 
     let svc_cache = cache.clone();
     // build our application with a route
@@ -254,6 +147,8 @@ pub async fn run_with_prefix(
     let app = ApiRouter::new()
         .nest_api_service("/api/v1", v1_router)
         .finish_api(&mut openapi);
+
+    let openapi = openapi::postprocess_spec(openapi);
     let docs_router = docs::router(openapi);
     let app = app
         .merge(docs_router)
diff --git a/server/svix-server/src/main.rs b/server/svix-server/src/main.rs
index a98fdc7e7..5a1a1cf75 100644
--- a/server/svix-server/src/main.rs
+++ b/server/svix-server/src/main.rs
@@ -68,6 +68,10 @@ enum Commands {
         #[clap(long)]
         yes_i_know_what_im_doing: bool,
     },
+
+    /// Generate OpenAPI JSON specification and exit
+    #[clap()]
+    GenerateOpenapi,
 }
 
 #[derive(Subcommand)]
@@ -184,6 +188,22 @@ async fn main() {
 
             exit(0);
         }
+        Some(Commands::GenerateOpenapi) => {
+            let mut openapi = svix_server::openapi::initialize_openapi();
+
+            let router = svix_server::v1::router();
+            aide::axum::ApiRouter::new()
+                .nest("/api/v1", router)
+                .finish_api(&mut openapi);
+
+            let openapi = svix_server::openapi::postprocess_spec(openapi);
+            println!(
+                "{}",
+                serde_json::to_string_pretty(&openapi).expect("Failed to serialize JSON spec")
+            );
+
+            exit(0);
+        }
         None => {}
     };
 
diff --git a/server/svix-server/src/openapi.rs b/server/svix-server/src/openapi.rs
new file mode 100644
index 000000000..67db626fa
--- /dev/null
+++ b/server/svix-server/src/openapi.rs
@@ -0,0 +1,465 @@
+use aide::openapi::{self, OpenApi, Parameter, ReferenceOr};
+use schemars::{visit::Visitor, JsonSchema};
+
+pub fn initialize_openapi() -> OpenApi {
+    aide::gen::on_error(|error| {
+        tracing::error!("Aide generation error: {error}");
+    });
+    // Extract schemas to `#/components/schemas/` instead of using inline schemas.
+    aide::gen::extract_schemas(true);
+    // Have aide attempt to infer the `Content-Type` of responses based on the
+    // handlers' return types.
+    aide::gen::infer_responses(true);
+    aide::gen::inferred_empty_response_status(204);
+
+    aide::gen::in_context(|ctx| ctx.schema = schemars::gen::SchemaSettings::openapi3().into());
+
+    let tag_groups = serde_json::json![[
+        {
+            "name": "General",
+            "tags": ["Application", "Event Type"]
+        },
+        {
+            "name": "Application specific",
+            "tags": ["Authentication", "Endpoint", "Message", "Message Attempt", "Integration"]
+        },
+        {
+            "name": "Utility",
+            "tags": ["Health"]
+        },
+        {
+            "name": "Webhooks",
+            "tags": ["Webhooks"]
+        }
+    ]];
+
+    let webhooks = serde_json::to_value(webhooks::webhooks())
+        .expect("failed to serialize webhook documentation");
+
+    const DESCRIPTION: &str = include_str!("../description.md");
+
+    OpenApi {
+        info: openapi::Info {
+            title: "Svix API".to_owned(),
+            version: "1.4".to_owned(),
+            extensions: indexmap::indexmap! {
+                "x-logo".to_string() => serde_json::json!({
+                    "url": "https://www.svix.com/static/img/brand-padded.svg",
+                    "altText": "Svix Logo",
+                }),
+            },
+            description: Some(DESCRIPTION.to_string()),
+            ..Default::default()
+        },
+        tags: vec![
+            openapi::Tag {
+                name: "Application".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Message".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Message Attempt".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Endpoint".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Integration".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Event Type".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Authentication".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Health".to_owned(),
+                ..openapi::Tag::default()
+            },
+            openapi::Tag {
+                name: "Webhooks".to_owned(),
+                ..openapi::Tag::default()
+            },
+        ],
+        extensions: indexmap::indexmap! {
+            "x-tagGroups".to_owned() => tag_groups,
+            "x-webhooks".to_owned() => webhooks,
+        },
+        ..Default::default()
+    }
+}
+
+/// Replaces OpenAPI 3.1 style `"foo": true` schemas with OpenAPI 3.0 style
+/// `"foo": {"type": "object"}` schemas.
+fn replace_true_schemas(mut openapi: OpenApi) -> OpenApi {
+    use schemars::schema::{InstanceType, ObjectValidation, Schema, SchemaObject, SingleOrVec};
+
+    // Checks if it's a plain boolean schema, and if yes replaces it with a
+    // `{"type": "object"}` schema. If it's an object then it will descend into
+    // its properties and `additionalProperties` too.
+    fn visit_schema(schema: &mut Schema) {
+        match schema {
+            Schema::Bool(true) => {
+                *schema = Schema::Object(SchemaObject {
+                    instance_type: Some(SingleOrVec::Single(Box::new(InstanceType::Object))),
+                    ..Default::default()
+                })
+            }
+            Schema::Bool(false) => {
+                tracing::warn!("unexpected `false` schema encountered");
+            }
+            Schema::Object(obj) => {
+                // When examples are added to a `"foo": bool` schema it gets
+                // expanded into an object, i.e. `"foo": {"example": ...}`, but
+                // no "type" field is set on it. Although the OpenAPI spec does
+                // not specifically say that the type field is mandatory, in
+                // practice a lack of the "type" field should only ever occur
+                // when a `true` schema gets replaced because it is somehow
+                // modified (e.g. example added), or because it's a "$ref"
+                // object.
+                // If it's not a reference, then we must add the "type" field
+                // back with the value "object" so code generators work correctly.
+                if obj.instance_type.is_none() && obj.reference.is_none() {
+                    obj.instance_type = Some(SingleOrVec::Single(Box::new(InstanceType::Object)));
+                }
+
+                obj.object.as_mut().map(visit_object_validation);
+            }
+        }
+    }
+
+    fn visit_object_validation(obj: &mut Box<ObjectValidation>) {
+        if let Some(additional_props) = &mut obj.additional_properties {
+            visit_schema(additional_props.as_mut())
+        }
+        for (_, schema) in obj.properties.iter_mut() {
+            visit_schema(schema)
+        }
+    }
+
+    if let Some(ref mut components) = openapi.components {
+        for (_, schema) in components.schemas.iter_mut() {
+            visit_schema(&mut schema.json_schema)
+        }
+    }
+
+    openapi
+}
+
+/// Adds the `Idempotency-Key` header parameter to all `POST` operations in the schema.
+fn add_idempotency_to_post(mut openapi: OpenApi) -> OpenApi {
+    // The header's value can be any valid string
+    let string_schema = aide::gen::in_context(|ctx| String::json_schema(&mut ctx.schema));
+
+    let s = openapi::SchemaObject {
+        json_schema: string_schema,
+        external_docs: None,
+        example: None,
+    };
+
+    let idempotency_key_data = openapi::ParameterData {
+        name: "idempotency-key".to_string(),
+        description: Some("The request's idempotency key".to_string()),
+        required: false,
+        deprecated: None,
+        format: openapi::ParameterSchemaOrContent::Schema(s),
+        example: None,
+        examples: indexmap::indexmap! {},
+        explode: None,
+        extensions: indexmap::indexmap! {},
+    };
+
+    if let Some(paths) = openapi.paths.as_mut() {
+        for (_, op) in paths.paths.iter_mut() {
+            match op {
+                openapi::ReferenceOr::Reference { reference, .. } => {
+                    // References to operations should never appear in our
+                    // schema since all our operations are unique, and we
+                    // don't reference any 3rd party/external operations.
+                    tracing::warn!(
+                        "Unexpected operation reference encountered in OpenAPI schema: {reference}"
+                    );
+                }
+                openapi::ReferenceOr::Item(op) => {
+                    if let Some(post) = op.post.as_mut() {
+                        post.parameters.push(ReferenceOr::Item(Parameter::Header {
+                            parameter_data: idempotency_key_data.clone(),
+                            style: openapi::HeaderStyle::Simple,
+                        }))
+                    }
+                }
+            }
+        }
+    }
+
+    openapi
+}
+
+/// Remove schemas from `components.schemas` of the spec which are under normal
+/// circumstances not referenced. At the moment these are struct schemas used
+/// by query parameters and path placeholders.
+fn remove_unneeded_schemas(mut openapi: OpenApi) -> OpenApi {
+    if let Some(components) = openapi.components.as_mut() {
+        components.schemas.retain(|name, _| {
+            !(name.ends_with("Path")
+                || name.ends_with("QueryParams")
+                || name.starts_with("Pagination"))
+        });
+    };
+
+    openapi
+}
+
+/// Replaces the `examples` property of a schema with a singular `example`
+/// property.
+/// OpenAPI <=3.0 used `example` as an extension, >=3.1 standardized `examples`.
+fn replace_multiple_examples(mut openapi: OpenApi) -> OpenApi {
+    let mut visitor = schemars::visit::SetSingleExample {
+        retain_examples: false,
+    };
+
+    if let Some(components) = openapi.components.as_mut() {
+        for (_, schema_object) in components.schemas.iter_mut() {
+            visitor.visit_schema(&mut schema_object.json_schema);
+        }
+    }
+
+    openapi
+}
+
+/// Applies a list of hacks to the finished OpenAPI spec to make it usable with
+/// our tooling.
+pub fn postprocess_spec(mut openapi: OpenApi) -> OpenApi {
+    let hacks = [
+        add_idempotency_to_post,
+        remove_unneeded_schemas,
+        replace_true_schemas,
+        replace_multiple_examples,
+    ];
+
+    for hack in hacks {
+        openapi = hack(openapi);
+    }
+
+    openapi
+}
+
+/// This module documents operational webhooks. To document one define a data
+/// struct first, use the [`webhook_event`] macro to generate a wrapping struct
+/// for it, then include it in the [`webhooks`] function call.
+mod webhooks {
+    use std::collections::HashMap;
+
+    use aide::openapi;
+    use schemars::JsonSchema;
+
+    use crate::core::operational_webhooks::{
+        EndpointDisabledEventData, EndpointEvent, MessageAttemptEvent,
+    };
+
+    /// Documents the webhook specified by the type `T`.
+    fn document_webhook<T: Webhook>() -> (String, openapi::PathItem) {
+        let type_name = std::any::type_name::<T>()
+            .split("::")
+            .last()
+            .expect("Last element of split can't be empty")
+            .to_string();
+
+        let body_schema =
+            aide::gen::in_context(|ctx| ctx.schema.subschema_for::<T>().into_object());
+
+        let body_media = openapi::MediaType {
+            schema: Some(openapi::SchemaObject {
+                json_schema: body_schema.into(),
+                external_docs: None,
+                example: None,
+            }),
+            ..Default::default()
+        };
+
+        let body = openapi::RequestBody {
+            content: indexmap::indexmap! {
+                "application/json".to_string() => body_media,
+            },
+            ..Default::default()
+        };
+
+        let success_response = openapi::Response {
+            description:
+                "Return any 2XX status to indicate that the data was received successfully"
+                    .to_string(),
+            ..Default::default()
+        };
+
+        (
+            type_name.clone(),
+            openapi::PathItem {
+                post: Some(openapi::Operation {
+                    description: Some(T::description().to_string()),
+                    operation_id: Some(type_name.clone()),
+                    request_body: Some(openapi::ReferenceOr::Item(body)),
+                    responses: Some(openapi::Responses {
+                        responses: indexmap::indexmap! {
+                            openapi::StatusCode::Range(2) => openapi::ReferenceOr::Item(success_response),
+                        },
+                        ..Default::default()
+                    }),
+                    summary: Some(type_name),
+                    tags: vec!["Webhooks".to_string()],
+                    ..Default::default()
+                }),
+                ..Default::default()
+            },
+        )
+    }
+
+    trait Webhook: JsonSchema {
+        fn description() -> &'static str;
+    }
+
+    /// Generates a struct that wraps the webhook payload, adding the discriminant.
+    macro_rules! webhook_event {
+        ($name:ident, $payload_name:ident, $discriminant:expr, $description:literal) => {
+            #[allow(unused)]
+            struct $name {
+                data: $payload_name,
+                type_: String,
+            }
+
+            impl JsonSchema for $name {
+                fn schema_name() -> String {
+                    stringify!($name).to_string()
+                }
+
+                fn json_schema(
+                    gen: &mut schemars::gen::SchemaGenerator,
+                ) -> schemars::schema::Schema {
+                    #[derive(::schemars::JsonSchema)]
+                    #[allow(unused)]
+                    struct $name {
+                        data: $payload_name,
+                        #[serde(rename = "type")]
+                        type_: String,
+                    }
+
+                    let mut schema = $name::json_schema(gen).into_object();
+
+                    schema
+                        .object()
+                        .properties
+                        .get_mut("type")
+                        .map(|type_property| {
+                            if let ::schemars::schema::Schema::Object(obj) = type_property {
+                                let discriminant_value =
+                                    serde_json::Value::String($discriminant.to_string());
+                                obj.enum_values = Some(vec![discriminant_value.clone()]);
+                                obj.metadata().default = Some(discriminant_value);
+                            }
+                        });
+                    schema.metadata().description = Some($description.to_string());
+
+                    schema.into()
+                }
+            }
+
+            impl Webhook for $name {
+                fn description() -> &'static str {
+                    $description
+                }
+            }
+        };
+    }
+
+    #[derive(JsonSchema)]
+    #[allow(unused)]
+    struct EndpointCreatedEventData {
+        #[serde(flatten)]
+        common_: EndpointEvent,
+    }
+
+    #[derive(JsonSchema)]
+    #[allow(unused)]
+    struct EndpointDeletedEventData {
+        #[serde(flatten)]
+        common_: EndpointEvent,
+    }
+
+    #[derive(JsonSchema)]
+    #[allow(unused)]
+    struct EndpointUpdatedEventData {
+        #[serde(flatten)]
+        common_: EndpointEvent,
+    }
+
+    #[derive(JsonSchema)]
+    #[allow(unused)]
+    struct MessageAttemptExhaustedEventData {
+        #[serde(flatten)]
+        common_: MessageAttemptEvent,
+    }
+
+    #[derive(JsonSchema)]
+    #[allow(unused)]
+    struct MessageAttemptFailingEventData {
+        #[serde(flatten)]
+        common_: MessageAttemptEvent,
+    }
+
+    webhook_event!(
+        EndpointCreatedEvent,
+        EndpointCreatedEventData,
+        "endpoint.created",
+        "Sent when an endpoint is created."
+    );
+    webhook_event!(
+        EndpointDeletedEvent,
+        EndpointDeletedEventData,
+        "endpoint.deleted",
+        "Sent when an endpoint is deleted."
+    );
+    webhook_event!(
+        EndpointUpdatedEvent,
+        EndpointUpdatedEventData,
+        "endpoint.updated",
+        "Sent when an endpoint is updated."
+    );
+    webhook_event!(
+        EndpointDisabledEvent,
+        EndpointDisabledEventData,
+        "endpoint.disabled",
+        "Sent when an endpoint has been automatically disabled after continuous failures."
+    );
+    webhook_event!(
+        MessageAttemptExhaustedEvent,
+        MessageAttemptExhaustedEventData,
+        "message.attempt.exhausted",
+        "Sent when a message delivery has failed (all of the retry attempts have been exhausted)."
+    );
+    webhook_event!(
+        MessageAttemptFailingEvent,
+        MessageAttemptFailingEventData,
+        "message.attempt.failing",
+        "Sent after a message has been failing for a few times.\nIt's sent on the fourth failure. It complements `message.attempt.exhausted` which is sent after the last failure."
+    );
+
+    /// Generates documentation for operational webhooks in the Redoc `x-webhooks`
+    /// format. For more info see https://redocly.com/docs/api-reference-docs/specification-extensions/x-webhooks/
+    pub(super) fn webhooks() -> HashMap<String, openapi::PathItem> {
+        HashMap::from([
+            document_webhook::<EndpointCreatedEvent>(),
+            document_webhook::<EndpointDeletedEvent>(),
+            document_webhook::<EndpointDisabledEvent>(),
+            document_webhook::<EndpointUpdatedEvent>(),
+            document_webhook::<MessageAttemptExhaustedEvent>(),
+            document_webhook::<MessageAttemptFailingEvent>(),
+        ])
+    }
+}
diff --git a/server/svix-server/src/queue/memory.rs b/server/svix-server/src/queue/memory.rs
index b085c4f3b..2b0aff4d8 100644
--- a/server/svix-server/src/queue/memory.rs
+++ b/server/svix-server/src/queue/memory.rs
@@ -7,19 +7,19 @@ use tokio::{sync::mpsc, time::sleep};
 use crate::{err_queue, error::Result};
 
 use super::{
-    QueueTask, TaskQueueConsumer, TaskQueueDelivery, TaskQueueProducer, TaskQueueReceive,
+    Acker, QueueTask, TaskQueueConsumer, TaskQueueDelivery, TaskQueueProducer, TaskQueueReceive,
     TaskQueueSend,
 };
 
 pub async fn new_pair() -> (TaskQueueProducer, TaskQueueConsumer) {
     let (tx, rx) = mpsc::unbounded_channel::<TaskQueueDelivery>();
     (
-        TaskQueueProducer(Box::new(MemoryQueueProducer { tx })),
-        TaskQueueConsumer(Box::new(MemoryQueueConsumer { rx })),
+        TaskQueueProducer::Memory(MemoryQueueProducer { tx }),
+        TaskQueueConsumer::Memory(MemoryQueueConsumer { rx }),
     )
 }
 
-#[derive(Clone)]
+#[derive(Clone, Debug)]
 pub struct MemoryQueueProducer {
     tx: mpsc::UnboundedSender<TaskQueueDelivery>,
 }
@@ -27,29 +27,25 @@ pub struct MemoryQueueProducer {
 #[async_trait]
 impl TaskQueueSend for MemoryQueueProducer {
     async fn send(&self, msg: Arc<QueueTask>, delay: Option<Duration>) -> Result<()> {
-        let tx = self.tx.clone();
         let timestamp = delay.map(|delay| Utc::now() + chrono::Duration::from_std(delay).unwrap());
-        let delivery = TaskQueueDelivery::from_arc(msg, timestamp);
-        tokio::spawn(async move {
-            // We just assume memory queue always works, so we can defer the error handling
-            tracing::trace!("MemoryQueue: event sent > (delay: {:?})", delay);
-            if let Some(delay) = delay {
+        let delivery = TaskQueueDelivery::from_arc(msg, timestamp, Acker::Memory(self.clone()));
+
+        if let Some(delay) = delay {
+            let tx = self.tx.clone();
+            tokio::spawn(async move {
+                // We just assume memory queue always works, so we can defer the error handling
+                tracing::trace!("MemoryQueue: event sent > (delay: {:?})", delay);
                 sleep(delay).await;
-            }
-            if tx.send(delivery).is_err() {
-                tracing::error!("Receiver dropped");
-            }
-        });
-        Ok(())
-    }
+                if tx.send(delivery).is_err() {
+                    tracing::error!("Receiver dropped");
+                }
+            });
+        } else if self.tx.send(delivery).is_err() {
+            tracing::error!("Receiver dropped");
+        }
 
-    async fn ack(&self, _delivery: &TaskQueueDelivery) -> Result<()> {
         Ok(())
     }
-
-    fn clone_box(&self) -> Box<dyn TaskQueueSend> {
-        Box::new(self.clone())
-    }
 }
 
 pub struct MemoryQueueConsumer {
@@ -59,16 +55,25 @@ pub struct MemoryQueueConsumer {
 #[async_trait]
 impl TaskQueueReceive for MemoryQueueConsumer {
     async fn receive_all(&mut self) -> Result<Vec<TaskQueueDelivery>> {
-        tokio::select! {
-            _ = tokio::time::sleep(Duration::from_secs(30)) => Ok(Vec::new()),
+        let mut deliveries = tokio::select! {
+            _ = tokio::time::sleep(Duration::from_secs(30)) => return Ok(Vec::new()),
             recv = self.rx.recv() => {
                 if let Some(delivery) = recv {
                     tracing::trace!("MemoryQueue: event recv <");
-                    Ok(vec![delivery])
+                    vec![delivery]
                 } else {
-                    Err(err_queue!("Failed to fetch from queue"))
+                    return Err(err_queue!("Failed to fetch from queue"))
                 }
             }
+        };
+
+        // possible errors are `Empty` or `Disconnected`. Either way,
+        // we want to return the deliveries that could be received.
+        // If it was Disconnected, the next call to receive_all will fail
+        while let Ok(delivery) = self.rx.try_recv() {
+            deliveries.push(delivery);
         }
+
+        Ok(deliveries)
     }
 }
diff --git a/server/svix-server/src/queue/mod.rs b/server/svix-server/src/queue/mod.rs
index 152ac62b5..3468628c2 100644
--- a/server/svix-server/src/queue/mod.rs
+++ b/server/svix-server/src/queue/mod.rs
@@ -2,6 +2,7 @@ use std::{sync::Arc, time::Duration};
 
 use axum::async_trait;
 use chrono::{DateTime, Utc};
+use lapin::options::{BasicAckOptions, BasicNackOptions};
 use serde::{Deserialize, Serialize};
 use strum::Display;
 use svix_ksuid::*;
@@ -12,10 +13,17 @@ use crate::{
         run_with_retries::run_with_retries,
         types::{ApplicationId, EndpointId, MessageAttemptTriggerType, MessageId},
     },
+    ctx,
     error::{Error, ErrorType, Result},
 };
 
+use self::{
+    memory::{MemoryQueueConsumer, MemoryQueueProducer},
+    redis::{RedisQueueConsumer, RedisQueueInner, RedisQueueProducer},
+};
+
 pub mod memory;
+pub mod rabbitmq;
 pub mod redis;
 
 const RETRY_SCHEDULE: &[Duration] = &[
@@ -42,6 +50,15 @@ pub async fn new_pair(
             redis::new_pair(pool, prefix).await
         }
         QueueBackend::Memory => memory::new_pair().await,
+        QueueBackend::RabbitMq(dsn) => {
+            let prefix = prefix.unwrap_or("");
+            let queue = format!("{prefix}-message-queue");
+            // Default to a prefetch_size of 1, as it's the safest (least likely to starve consumers)
+            let prefetch_size = cfg.rabbit_consumer_prefetch_size.unwrap_or(1);
+            rabbitmq::new_pair(dsn, queue, prefetch_size)
+                .await
+                .expect("can't connect to rabbit")
+        }
     }
 }
 
@@ -103,39 +120,24 @@ pub enum QueueTask {
     MessageBatch(MessageTaskBatch),
 }
 
-pub struct TaskQueueProducer(Box<dyn TaskQueueSend>);
-
-impl Clone for TaskQueueProducer {
-    fn clone(&self) -> Self {
-        Self(self.0.clone_box())
-    }
+#[derive(Clone)]
+pub enum TaskQueueProducer {
+    Memory(MemoryQueueProducer),
+    Redis(RedisQueueProducer),
+    RabbitMq(rabbitmq::Producer),
 }
 
 impl TaskQueueProducer {
     pub async fn send(&self, task: QueueTask, delay: Option<Duration>) -> Result<()> {
         let task = Arc::new(task);
         run_with_retries(
-            || async { self.0.send(task.clone(), delay).await },
-            should_retry,
-            RETRY_SCHEDULE,
-        )
-        .await
-    }
-
-    pub async fn ack(&self, delivery: TaskQueueDelivery) -> Result<()> {
-        tracing::trace!("ack {}", delivery.id);
-        run_with_retries(
-            || async { self.0.ack(&delivery).await },
-            should_retry,
-            RETRY_SCHEDULE,
-        )
-        .await
-    }
-
-    pub async fn nack(&self, delivery: TaskQueueDelivery) -> Result<()> {
-        tracing::trace!("nack {}", delivery.id);
-        run_with_retries(
-            || async { self.0.nack(&delivery).await },
+            || async {
+                match self {
+                    TaskQueueProducer::Memory(q) => q.send(task.clone(), delay).await,
+                    TaskQueueProducer::Redis(q) => q.send(task.clone(), delay).await,
+                    TaskQueueProducer::RabbitMq(q) => q.send(task.clone(), delay).await,
+                }
+            },
             should_retry,
             RETRY_SCHEDULE,
         )
@@ -143,51 +145,109 @@ impl TaskQueueProducer {
     }
 }
 
-pub struct TaskQueueConsumer(Box<dyn TaskQueueReceive + Send + Sync>);
+pub enum TaskQueueConsumer {
+    Redis(RedisQueueConsumer),
+    Memory(MemoryQueueConsumer),
+    RabbitMq(rabbitmq::Consumer),
+}
 
 impl TaskQueueConsumer {
     pub async fn receive_all(&mut self) -> Result<Vec<TaskQueueDelivery>> {
-        self.0.receive_all().await
+        match self {
+            TaskQueueConsumer::Redis(q) => ctx!(q.receive_all().await),
+            TaskQueueConsumer::Memory(q) => ctx!(q.receive_all().await),
+            TaskQueueConsumer::RabbitMq(q) => ctx!(q.receive_all().await),
+        }
     }
 }
 
+/// Used by TaskQueueDeliveries to Ack/Nack itself
+#[derive(Debug)]
+enum Acker {
+    Memory(MemoryQueueProducer),
+    Redis(Arc<RedisQueueInner>),
+    RabbitMQ(lapin::message::Delivery),
+}
+
+#[derive(Debug)]
 pub struct TaskQueueDelivery {
     pub id: String,
     pub task: Arc<QueueTask>,
+    acker: Acker,
 }
 
 impl TaskQueueDelivery {
     /// The `timestamp` is when this message will be delivered at
-    fn from_arc(task: Arc<QueueTask>, timestamp: Option<DateTime<Utc>>) -> Self {
+    fn from_arc(task: Arc<QueueTask>, timestamp: Option<DateTime<Utc>>, acker: Acker) -> Self {
         let ksuid = KsuidMs::new(timestamp, None);
         Self {
             id: ksuid.to_string(),
             task,
+            acker,
         }
     }
-}
-
-#[async_trait]
-trait TaskQueueSend: Sync + Send {
-    async fn send(&self, task: Arc<QueueTask>, delay: Option<Duration>) -> Result<()>;
-    fn clone_box(&self) -> Box<dyn TaskQueueSend>;
 
-    async fn ack(&self, delivery: &TaskQueueDelivery) -> Result<()>;
+    pub async fn ack(self) -> Result<()> {
+        tracing::trace!("ack {}", self.id);
+        run_with_retries(
+            || async {
+                match &self.acker {
+                    Acker::Memory(_) => Ok(()), // nothing to do
+                    Acker::Redis(q) => {
+                        ctx!(q.ack(&self).await)
+                    }
+                    Acker::RabbitMQ(delivery) => {
+                        ctx!(
+                            delivery
+                                .ack(BasicAckOptions {
+                                    multiple: false // Only ack this message, not others
+                                })
+                                .await
+                        )
+                    }
+                }
+            },
+            should_retry,
+            RETRY_SCHEDULE,
+        )
+        .await
+    }
 
-    /// By default NACKing a [`TaskQueueDelivery`] simply reinserts it in the back of the queue
-    /// without any delay. Additionally it `ack`s the orignal, now duplicated task, such as to
-    /// avoid memory leaks in persistent implementations of the queue.
-    async fn nack(&self, delivery: &TaskQueueDelivery) -> Result<()> {
-        tracing::debug!("nack {}", delivery.id);
-        self.send(delivery.task.clone(), None).await?;
-        self.ack(delivery).await
+    pub async fn nack(self) -> Result<()> {
+        tracing::trace!("nack {}", self.id);
+        run_with_retries(
+            || async {
+                match &self.acker {
+                    Acker::Memory(q) => {
+                        tracing::debug!("nack {}", self.id);
+                        ctx!(q.send(self.task.clone(), None).await)
+                    }
+                    Acker::Redis(q) => {
+                        ctx!(q.nack(&self).await)
+                    }
+                    Acker::RabbitMQ(delivery) => {
+                        // See https://www.rabbitmq.com/confirms.html#consumer-nacks-requeue
+                        ctx!(
+                            delivery
+                                .nack(BasicNackOptions {
+                                    requeue: true,
+                                    multiple: false // Only nack this message, not others
+                                })
+                                .await
+                        )
+                    }
+                }
+            },
+            should_retry,
+            RETRY_SCHEDULE,
+        )
+        .await
     }
 }
 
-impl Clone for Box<dyn TaskQueueSend> {
-    fn clone(&self) -> Box<dyn TaskQueueSend> {
-        self.clone_box()
-    }
+#[async_trait]
+trait TaskQueueSend: Sync + Send {
+    async fn send(&self, task: Arc<QueueTask>, delay: Option<Duration>) -> Result<()>;
 }
 
 #[async_trait]
@@ -255,8 +315,9 @@ mod tests {
             assert_send(&tx_mem, msg_2).await;
         });
 
-        assert_recv(&mut rx_mem, msg_1).await;
-        assert_recv(&mut rx_mem, msg_2).await;
+        let tasks = rx_mem.receive_all().await.unwrap();
+        assert_eq!(*tasks[0].task, mock_message(msg_1.to_owned()));
+        assert_eq!(*tasks[1].task, mock_message(msg_2.to_owned()));
     }
 
     #[tokio::test]
@@ -297,7 +358,7 @@ mod tests {
 
         assert_eq!(*recv.task, mock_message("test".to_owned()));
 
-        assert!(tx_mem.ack(recv).await.is_ok());
+        assert!(recv.ack().await.is_ok());
 
         tokio::select! {
             _ = rx_mem.receive_all() => {
@@ -326,7 +387,7 @@ mod tests {
             .unwrap();
         assert_eq!(*recv.task, mock_message("test".to_owned()));
 
-        assert!(tx_mem.nack(recv).await.is_ok());
+        assert!(recv.nack().await.is_ok());
 
         tokio::select! {
             _ = rx_mem.receive_all() => {}
diff --git a/server/svix-server/src/queue/rabbitmq.rs b/server/svix-server/src/queue/rabbitmq.rs
new file mode 100644
index 000000000..515ee0906
--- /dev/null
+++ b/server/svix-server/src/queue/rabbitmq.rs
@@ -0,0 +1,269 @@
+use chrono::Utc;
+use futures::StreamExt;
+use lapin::{
+    options::{
+        BasicConsumeOptions, BasicPublishOptions, BasicQosOptions, ExchangeDeclareOptions,
+        QueueBindOptions, QueueDeclareOptions,
+    },
+    types::{AMQPValue, FieldTable},
+    BasicProperties, ConnectionProperties,
+};
+use svix_ksuid::{KsuidLike, KsuidMs};
+
+use crate::{ctx, err_generic, err_queue, error::Result};
+use std::{sync::Arc, time::Duration};
+
+use super::{
+    Acker, QueueTask, TaskQueueConsumer, TaskQueueDelivery, TaskQueueProducer, TaskQueueReceive,
+    TaskQueueSend,
+};
+
+#[derive(Clone)]
+pub struct Producer(Arc<ProducerInner>);
+
+struct ProducerInner {
+    exchange_name: String,
+    queue_name: String,
+    channel: lapin::Channel,
+}
+
+pub struct Consumer {
+    consumer: lapin::Consumer,
+}
+
+/// Returns a new_pair producers/consumers that use RabbitMQ under the hood.
+/// USE WITH CAUTION - For the time being, this implementation has only been exercised in local development
+/// and testing environments. There may be production kinks that need working out
+pub async fn new_pair(
+    dsn: &str,
+    queue_name: String,
+    prefetch_size: u16,
+) -> Result<(TaskQueueProducer, TaskQueueConsumer)> {
+    let conn = ctx!(lapin::Connection::connect(dsn, ConnectionProperties::default()).await)?;
+    let producer_chan = ctx!(conn.create_channel().await)?;
+    let consumer_chan = ctx!(conn.create_channel().await)?;
+
+    let exchange_name = ctx!(declare_delayed_message_exchange(&producer_chan).await)?;
+    ctx!(declare_bound_queue(&queue_name, &exchange_name, &producer_chan).await)?;
+
+    let consumer = ctx!(start_queue_consumer(&queue_name, &consumer_chan, prefetch_size).await)?;
+    let consumer = Consumer { consumer };
+
+    let producer = Producer(Arc::new(ProducerInner {
+        exchange_name,
+        channel: producer_chan,
+        queue_name,
+    }));
+
+    let producer = TaskQueueProducer::RabbitMq(producer);
+    let consumer = TaskQueueConsumer::RabbitMq(consumer);
+
+    Ok((producer, consumer))
+}
+
+async fn declare_delayed_message_exchange(channel: &lapin::Channel) -> Result<String> {
+    let exchange_name = "first-message";
+
+    // See https://www.rabbitmq.com/amqp-0-9-1-reference.html#exchange.declare
+    let opts = ExchangeDeclareOptions {
+        // Want the server to create the exchange if it doesn't already exist
+        passive: false,
+        nowait: false,
+        // Want the exchange to survive restarts, and not be deleted even when the underlying queues are
+        // deleted
+        durable: true,
+        auto_delete: false,
+        internal: false,
+    };
+
+    // See https://github.com/rabbitmq/rabbitmq-delayed-message-exchange#usage
+    let mut args = FieldTable::default();
+    args.insert(
+        "x-delayed-type".into(),
+        AMQPValue::LongString("direct".into()),
+    );
+
+    ctx!(
+        channel
+            .exchange_declare(
+                exchange_name,
+                lapin::ExchangeKind::Custom("x-delayed-message".into()),
+                opts,
+                args
+            )
+            .await
+    )?;
+
+    Ok(exchange_name.to_owned())
+}
+
+async fn declare_bound_queue(
+    queue_name: &str,
+    exchange_name: &str,
+    channel: &lapin::Channel,
+) -> Result<()> {
+    // Ref https://www.rabbitmq.com/amqp-0-9-1-quickref.html#queue.declare
+    let opts = QueueDeclareOptions {
+        // If the queue already exists with the same configuration, we want the server to respond w/OK
+        // Alternatively, if the queue exists with a _different_ configuration, we want this to fail
+        passive: false,
+        nowait: false,
+
+        // We want to support multiple consumers per queue
+        exclusive: false,
+
+        // We want the queue to survive rust-primary restarts
+        durable: true,
+        auto_delete: false,
+    };
+
+    // Refs https://www.rabbitmq.com/maxlength.html#definition-using-x-args and https://www.rabbitmq.com/dlx.html#using-optional-queue-arguments
+    // We may want to figure out what the queue length enforcement looks like and dead letter queueing at a later point in time
+    let args = FieldTable::default();
+    ctx!(channel.queue_declare(queue_name, opts, args).await)?;
+
+    let routing_key = queue_name;
+    ctx!(
+        channel
+            .queue_bind(
+                queue_name,
+                exchange_name,
+                routing_key,
+                QueueBindOptions { nowait: false },
+                FieldTable::default()
+            )
+            .await
+    )?;
+
+    Ok(())
+}
+
+async fn start_queue_consumer(
+    queue_name: &str,
+    channel: &lapin::Channel,
+    prefetch_size: u16,
+) -> Result<lapin::Consumer> {
+    // Ref https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.consume.consumer-tag
+    let consumer_tag = format!(
+        "{queue_name}-consumer-{}",
+        KsuidMs::new(None, None).to_string() // prevent possible errors around duplicate consumer tags
+    );
+
+    let opts = BasicConsumeOptions {
+        // https://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-local
+        // false because I don't care if the same connection reads and publishes to the same queue
+        no_local: false,
+
+        // https://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-ack
+        // Obviously want message ACKs to ensure message are handled
+        no_ack: false,
+
+        // https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.consume.exclusive
+        // More than one worker should be able to read from the same queue
+        exclusive: false,
+
+        // https://www.rabbitmq.com/amqp-0-9-1-reference.html#domain.no-wait
+        // want the server to respond if there's a failure
+        nowait: false,
+    };
+
+    let args = FieldTable::default();
+
+    // Ref https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.qos.prefetch-size
+    //
+    // prefetch_size tells the consumer how many messages to load in batches from the queue.
+    // Higher values generally means better queue performance (fewer messages stuck in the queue),
+    // at the cost of consumer memory.
+    // Additionally, if the prefetch_size is *too* large, a single worker can "starve" other workers,
+    // potentially hurting total message throughput.
+    //
+    // "global" enforces the same limit for other consumers on the channel, which isn't necessarily
+    // what we want
+    ctx!(
+        channel
+            .basic_qos(prefetch_size, BasicQosOptions { global: false })
+            .await
+    )?;
+
+    ctx!(
+        channel
+            .basic_consume(queue_name, &consumer_tag, opts, args)
+            .await
+    )
+}
+
+#[axum::async_trait]
+impl TaskQueueSend for Producer {
+    async fn send(&self, task: Arc<QueueTask>, delay: Option<Duration>) -> Result<()> {
+        let payload = serde_json::to_vec(&task)
+            .map_err(|e| err_generic!("unable to serialize queue task wtf: {:?}", e))?;
+
+        let mut headers = FieldTable::default();
+        if let Some(delay) = delay {
+            let delay_ms: u32 = delay
+                .as_millis()
+                .try_into()
+                .map_err(|_| err_queue!("message delay is too large"))?;
+            headers.insert("x-delay".into(), AMQPValue::LongUInt(delay_ms))
+        }
+
+        let routing_key = &self.0.queue_name;
+
+        // Ref https://www.rabbitmq.com/publishers.html#unroutable
+        let options = BasicPublishOptions {
+            mandatory: true, // so we're alerted if the message is unroutable
+            immediate: false,
+        };
+
+        let id = KsuidMs::new(Some(Utc::now()), None).to_string();
+
+        let properties = BasicProperties::default()
+            .with_message_id(id.into())
+            .with_headers(headers);
+
+        let confirm = ctx!(
+            self.0
+                .channel
+                .basic_publish(
+                    &self.0.exchange_name,
+                    routing_key,
+                    options,
+                    &payload,
+                    properties
+                )
+                .await
+        )?;
+
+        ctx!(confirm.await)?;
+
+        Ok(())
+    }
+}
+
+#[axum::async_trait]
+impl TaskQueueReceive for Consumer {
+    async fn receive_all(&mut self) -> Result<Vec<TaskQueueDelivery>> {
+        // Unfortunately, lapin::Consumer currently has no API for fetching a batch of messages
+        // without potentially blocking for each one. So we'll always return a vec! of length 1
+        let delivery = ctx!(self.consumer.next().await.ok_or(err_generic!(
+            "rabbitmq consumer unexpectedly returned nothing!"
+        ))?)?;
+
+        let id = delivery
+            .properties
+            .message_id()
+            .as_ref()
+            .ok_or(err_generic!("task is missing message_id!"))?
+            .to_string();
+
+        let task: QueueTask = serde_json::from_slice(&delivery.data).map_err(|_e| {
+            err_generic!("rabbitmq task deserialization unexpectedly failed?!: {e:?}")
+        })?;
+
+        Ok(vec![TaskQueueDelivery {
+            id,
+            task: Arc::new(task),
+            acker: Acker::RabbitMQ(delivery),
+        }])
+    }
+}
diff --git a/server/svix-server/src/queue/redis.rs b/server/svix-server/src/queue/redis.rs
index b8738b508..654cf4018 100644
--- a/server/svix-server/src/queue/redis.rs
+++ b/server/svix-server/src/queue/redis.rs
@@ -41,6 +41,7 @@ use tokio::time::sleep;
 use crate::{
     ctx, err_generic,
     error::Result,
+    queue::Acker,
     redis::{PoolLike, PooledConnection, PooledConnectionLike, RedisPool},
 };
 
@@ -403,18 +404,19 @@ async fn new_pair_inner(
         }
     });
 
+    let inner = Arc::new(RedisQueueInner {
+        pool: worker_pool,
+        main_queue_name,
+    });
+
     // Once the background thread has been started, simply return the [`TaskQueueProducer`] and
     // [`TaskQueueConsumer`]
     (
-        TaskQueueProducer(Box::new(RedisQueueProducer {
-            pool: worker_pool.clone(),
-            main_queue_name: main_queue_name.clone(),
-            delayed_queue_name,
-        })),
-        TaskQueueConsumer(Box::new(RedisQueueConsumer {
-            pool: worker_pool,
-            main_queue_name,
-        })),
+        TaskQueueProducer::Redis(RedisQueueProducer {
+            inner: inner.clone(),
+            delayed_queue_name: Arc::new(delayed_queue_name),
+        }),
+        TaskQueueConsumer::Redis(RedisQueueConsumer(inner)),
     )
 }
 
@@ -437,11 +439,16 @@ impl ToRedisArgs for Direction {
     }
 }
 
-#[derive(Clone)]
-pub struct RedisQueueProducer {
+#[derive(Debug)]
+pub(super) struct RedisQueueInner {
     pool: RedisPool,
     main_queue_name: String,
-    delayed_queue_name: String,
+}
+
+#[derive(Clone)]
+pub struct RedisQueueProducer {
+    inner: Arc<RedisQueueInner>,
+    delayed_queue_name: Arc<String>,
 }
 
 fn to_redis_key(delivery: &TaskQueueDelivery) -> String {
@@ -452,57 +459,36 @@ fn to_redis_key(delivery: &TaskQueueDelivery) -> String {
     )
 }
 
-fn from_redis_key(key: &str) -> TaskQueueDelivery {
+fn from_redis_key(key: &str) -> (String, Arc<QueueTask>) {
     // Get the first delimiter -> it has to have the |
     let pos = key.find('|').unwrap();
     let id = key[..pos].to_string();
     let task = serde_json::from_str(&key[pos + 1..]).unwrap();
-    TaskQueueDelivery { id, task }
+    (id, task)
 }
 
-#[async_trait]
-impl TaskQueueSend for RedisQueueProducer {
-    async fn send(&self, task: Arc<QueueTask>, delay: Option<Duration>) -> Result<()> {
+impl RedisQueueInner {
+    async fn send_immedietly(&self, task: Arc<QueueTask>) -> Result<()> {
         let mut pool = ctx!(self.pool.get().await)?;
 
-        // If there's a delay, compute the timestamp at which the delay is up
-        let timestamp = delay.map(|delay| -> Result<_> {
-            Ok(Utc::now()
-                + chrono::Duration::from_std(delay)
-                    .map_err(|_| err_generic!("Duration out of bounds"))?)
-        });
+        let _: () = ctx!(
+            pool.query_async(Cmd::xadd(
+                &self.main_queue_name,
+                GENERATE_STREAM_ID,
+                &[(
+                    QUEUE_KV_KEY,
+                    serde_json::to_string(&task)
+                        .map_err(|e| err_generic!("serialization error: {}", e))?,
+                )],
+            ))
+            .await
+        )?;
 
-        if let Some(timestamp) = timestamp {
-            let timestamp = timestamp?;
-            // If there's a delay, add it to the DELAYED queue by ZADDING the Redis-key-ified
-            // delivery
-            let delivery = TaskQueueDelivery::from_arc(task.clone(), Some(timestamp));
-            let key = to_redis_key(&delivery);
-            let _: () = ctx!(
-                pool.zadd(&self.delayed_queue_name, key, timestamp.timestamp())
-                    .await
-            )?;
-        } else {
-            // If there is no delay simply XADD the task to the MAIN queue
-            let _: () = ctx!(
-                pool.query_async(Cmd::xadd(
-                    &self.main_queue_name,
-                    GENERATE_STREAM_ID,
-                    &[(
-                        QUEUE_KV_KEY,
-                        serde_json::to_string(&*task)
-                            .map_err(|e| err_generic!("serialization error: {}", e))?,
-                    )],
-                ))
-                .await
-            )?;
-        }
-        tracing::trace!("RedisQueue: event sent > (delay: {:?})", delay);
         Ok(())
     }
 
     /// ACKing the delivery, XACKs the message in the queue so it will no longer be retried
-    async fn ack(&self, delivery: &TaskQueueDelivery) -> Result<()> {
+    pub(super) async fn ack(&self, delivery: &TaskQueueDelivery) -> Result<()> {
         let mut pool = ctx!(self.pool.get().await)?;
 
         let mut pipe = redis::pipe();
@@ -529,31 +515,61 @@ impl TaskQueueSend for RedisQueueProducer {
         Ok(())
     }
 
-    fn clone_box(&self) -> Box<dyn TaskQueueSend> {
-        Box::new(self.clone())
+    pub(super) async fn nack(&self, delivery: &TaskQueueDelivery) -> Result<()> {
+        tracing::debug!("nack {}", delivery.id);
+        self.send_immedietly(delivery.task.clone()).await?;
+        self.ack(delivery).await
     }
 }
 
-#[derive(Debug, Clone)]
-pub struct RedisQueueConsumer {
-    pool: RedisPool,
-    main_queue_name: String,
+#[async_trait]
+impl TaskQueueSend for RedisQueueProducer {
+    async fn send(&self, task: Arc<QueueTask>, delay: Option<Duration>) -> Result<()> {
+        let timestamp = if let Some(delay) = delay {
+            Utc::now()
+                + chrono::Duration::from_std(delay)
+                    .map_err(|_| err_generic!("Duration out of bounds"))?
+        } else {
+            tracing::trace!("RedisQueue: event sent (no delay)");
+            return self.inner.send_immedietly(task).await;
+        };
+
+        // If there's a delay, add it to the DELAYED queue by ZADDING the Redis-key-ified
+        // delivery
+        let mut pool = ctx!(self.inner.pool.get().await)?;
+        let delivery = TaskQueueDelivery::from_arc(
+            task.clone(),
+            Some(timestamp),
+            Acker::Redis(self.inner.clone()),
+        );
+        let key = to_redis_key(&delivery);
+        let delayed_queue_name: &str = &self.delayed_queue_name;
+        let _: () = ctx!(
+            pool.zadd(delayed_queue_name, key, timestamp.timestamp())
+                .await
+        )?;
+
+        tracing::trace!("RedisQueue: event sent > (delay: {:?})", delay);
+        Ok(())
+    }
 }
 
+#[derive(Clone)]
+pub struct RedisQueueConsumer(Arc<RedisQueueInner>);
+
 #[async_trait]
 impl TaskQueueReceive for RedisQueueConsumer {
     async fn receive_all(&mut self) -> Result<Vec<TaskQueueDelivery>> {
-        let pool = self.pool.clone();
-        let main_queue_name = self.main_queue_name.clone();
+        let consumer = self.clone();
         tokio::spawn(async move {
             // TODO: Receive messages in batches so it's not always a Vec with one member
-            let mut pool = ctx!(pool.get().await)?;
+            let mut pool = ctx!(consumer.0.pool.get().await)?;
 
             // There is no way to make it await a message for unbounded times, so simply block for a short
             // amount of time (to avoid locking) and loop if no messages were retreived
             let resp: StreamReadReply = ctx!(
                 pool.query_async(Cmd::xread_options(
-                    &[&main_queue_name],
+                    &[&consumer.0.main_queue_name],
                     &[LISTEN_STREAM_ID],
                     &StreamReadOptions::default()
                         .group(WORKERS_GROUP, WORKER_CONSUMER)
@@ -579,6 +595,7 @@ impl TaskQueueReceive for RedisQueueConsumer {
                 Ok(vec![TaskQueueDelivery {
                     id,
                     task: Arc::new(task),
+                    acker: Acker::Redis(consumer.0.clone()),
                 }])
             } else {
                 Ok(Vec::new())
@@ -616,11 +633,11 @@ async fn migrate_list_to_stream(
 
         let mut pipe = redis::pipe();
         for key in legacy_keys {
-            let delivery = from_redis_key(&key);
+            let (_, task) = from_redis_key(&key);
             let _ = pipe.xadd(
                 queue,
                 GENERATE_STREAM_ID,
-                &[(QUEUE_KV_KEY, serde_json::to_string(&delivery.task).unwrap())],
+                &[(QUEUE_KV_KEY, serde_json::to_string(&task).unwrap())],
             );
         }
 
@@ -698,7 +715,10 @@ pub mod tests {
     use crate::{
         cfg::{CacheType, Configuration},
         core::types::{ApplicationId, EndpointId, MessageAttemptTriggerType, MessageId},
-        queue::{MessageTask, QueueTask, TaskQueueConsumer, TaskQueueDelivery, TaskQueueProducer},
+        queue::{
+            redis::RedisQueueInner, Acker, MessageTask, QueueTask, TaskQueueConsumer,
+            TaskQueueDelivery, TaskQueueProducer,
+        },
         redis::{PoolLike, PooledConnectionLike, RedisPool},
     };
 
@@ -781,12 +801,12 @@ pub mod tests {
 
     /// Reads and acknowledges all items in the queue with the given name for clearing out entries
     /// from previous test runs
-    async fn flush_stale_queue_items(p: TaskQueueProducer, c: &mut TaskQueueConsumer) {
+    async fn flush_stale_queue_items(_p: TaskQueueProducer, c: &mut TaskQueueConsumer) {
         loop {
             tokio::select! {
                 recv = c.receive_all() => {
                     let recv = recv.unwrap().pop().unwrap();
-                    p.ack(recv).await.unwrap();
+                    recv.ack().await.unwrap();
                 }
 
                 _ = tokio::time::sleep(Duration::from_millis(100)) => {
@@ -840,7 +860,7 @@ pub mod tests {
                 let recv = recv.unwrap().pop().unwrap();
                 assert_eq!(*recv.task, mt);
                 // Acknowledge so the queue isn't further polluted
-                p.ack(recv).await.unwrap();
+                recv.ack().await.unwrap();
             }
 
             _ = tokio::time::sleep(Duration::from_secs(5)) => {
@@ -900,7 +920,7 @@ pub mod tests {
 
         let recv = c.receive_all().await.unwrap().pop().unwrap();
         assert_eq!(*recv.task, mt);
-        p.ack(recv).await.unwrap();
+        recv.ack().await.unwrap();
 
         tokio::select! {
             recv = c.receive_all() => {
@@ -949,7 +969,7 @@ pub mod tests {
 
         let recv = c.receive_all().await.unwrap().pop().unwrap();
         assert_eq!(*recv.task, mt);
-        p.nack(recv).await.unwrap();
+        recv.nack().await.unwrap();
 
         tokio::select! {
             recv = c.receive_all() => {
@@ -1003,11 +1023,11 @@ pub mod tests {
 
         let recv2 = c.receive_all().await.unwrap().pop().unwrap();
         assert_eq!(*recv2.task, mt2);
-        p.ack(recv2).await.unwrap();
+        recv2.ack().await.unwrap();
 
         let recv1 = c.receive_all().await.unwrap().pop().unwrap();
         assert_eq!(*recv1.task, mt1);
-        p.ack(recv1).await.unwrap();
+        recv1.ack().await.unwrap();
     }
 
     #[tokio::test]
@@ -1070,6 +1090,10 @@ pub mod tests {
                                 trigger_type: MessageAttemptTriggerType::Manual,
                                 attempt_count: 0,
                             })),
+                            acker: Acker::Redis(Arc::new(RedisQueueInner {
+                                pool: pool.clone(),
+                                main_queue_name: v1_main.to_owned(),
+                            })),
                         }),
                     ))
                     .await
@@ -1089,6 +1113,10 @@ pub mod tests {
                                 trigger_type: MessageAttemptTriggerType::Manual,
                                 attempt_count: 0,
                             })),
+                            acker: Acker::Redis(Arc::new(RedisQueueInner {
+                                pool: pool.clone(),
+                                main_queue_name: v1_main.to_owned(),
+                            })),
                         }),
                         Utc::now().timestamp() + 2,
                     ))
@@ -1127,7 +1155,7 @@ pub mod tests {
         }
 
         // Read
-        let (p, mut c) = new_pair_inner(
+        let (_p, mut c) = new_pair_inner(
             pool,
             Duration::from_secs(5),
             "",
@@ -1152,7 +1180,7 @@ pub mod tests {
                     attempt_count: 0,
                 })
             );
-            p.ack(recv).await.unwrap();
+            recv.ack().await.unwrap();
         }
         for num in 1..=5 {
             let recv = c.receive_all().await.unwrap().pop().unwrap();
@@ -1166,7 +1194,7 @@ pub mod tests {
                     attempt_count: 0,
                 })
             );
-            p.ack(recv).await.unwrap();
+            recv.ack().await.unwrap();
         }
         for num in 11..=15 {
             let recv = c.receive_all().await.unwrap().pop().unwrap();
@@ -1180,7 +1208,7 @@ pub mod tests {
                     attempt_count: 0,
                 })
             );
-            p.ack(recv).await.unwrap();
+            recv.ack().await.unwrap();
         }
     }
 }
diff --git a/server/svix-server/src/redis/cluster.rs b/server/svix-server/src/redis/cluster.rs
index 7c935a3e1..b4293d3c7 100644
--- a/server/svix-server/src/redis/cluster.rs
+++ b/server/svix-server/src/redis/cluster.rs
@@ -1,15 +1,15 @@
-use std::ops::DerefMut;
-
 use axum::async_trait;
 
-use redis::{ErrorKind, IntoConnectionInfo, RedisError};
-use redis_cluster_async::Client;
+use redis::{
+    cluster::{ClusterClient, ClusterClientBuilder},
+    ErrorKind, IntoConnectionInfo, RedisError,
+};
 
 /// ConnectionManager that implements `bb8::ManageConnection` and supports
 /// asynchronous clustered connections via `redis_cluster_async::Connection`
 #[derive(Clone)]
 pub struct RedisClusterConnectionManager {
-    client: Client,
+    client: ClusterClient,
 }
 
 impl RedisClusterConnectionManager {
@@ -17,25 +17,22 @@ impl RedisClusterConnectionManager {
         info: T,
     ) -> Result<RedisClusterConnectionManager, RedisError> {
         Ok(RedisClusterConnectionManager {
-            client: Client::open(vec![info])?,
+            client: ClusterClientBuilder::new(vec![info]).build()?,
         })
     }
 }
 
 #[async_trait]
 impl bb8::ManageConnection for RedisClusterConnectionManager {
-    type Connection = redis_cluster_async::Connection;
+    type Connection = redis::cluster_async::ClusterConnection;
     type Error = RedisError;
 
     async fn connect(&self) -> Result<Self::Connection, Self::Error> {
-        self.client.get_connection().await
+        self.client.get_async_connection().await
     }
 
-    async fn is_valid(
-        &self,
-        conn: &mut bb8::PooledConnection<'_, Self>,
-    ) -> Result<(), Self::Error> {
-        let pong: String = redis::cmd("PING").query_async(conn.deref_mut()).await?;
+    async fn is_valid(&self, conn: &mut Self::Connection) -> Result<(), Self::Error> {
+        let pong: String = redis::cmd("PING").query_async(&mut *conn).await?;
         match pong.as_str() {
             "PONG" => Ok(()),
             _ => Err((ErrorKind::ResponseError, "ping request").into()),
diff --git a/server/svix-server/src/redis/mod.rs b/server/svix-server/src/redis/mod.rs
index 475a8621b..18bbd0a3d 100644
--- a/server/svix-server/src/redis/mod.rs
+++ b/server/svix-server/src/redis/mod.rs
@@ -1,7 +1,7 @@
 mod cluster;
 
 use bb8::{Pool, RunError};
-use bb8_redis::RedisConnectionManager;
+use bb8_redis::RedisMultiplexedConnectionManager;
 pub use cluster::RedisClusterConnectionManager;
 
 use axum::async_trait;
@@ -22,7 +22,7 @@ pub struct ClusteredRedisPool {
 
 #[derive(Clone, Debug)]
 pub struct NonClusteredRedisPool {
-    pool: Pool<RedisConnectionManager>,
+    pool: Pool<RedisMultiplexedConnectionManager>,
 }
 
 pub enum PooledConnection<'a> {
@@ -187,7 +187,7 @@ impl<'a> PooledConnectionLike for PooledConnection<'a> {
 }
 
 pub struct NonClusteredPooledConnection<'a> {
-    con: bb8::PooledConnection<'a, RedisConnectionManager>,
+    con: bb8::PooledConnection<'a, RedisMultiplexedConnectionManager>,
 }
 
 impl<'a> NonClusteredPooledConnection<'a> {
@@ -270,7 +270,8 @@ async fn new_redis_pool_helper(
         let pool = ClusteredRedisPool { pool };
         RedisPool::Clustered(pool)
     } else {
-        let mgr = RedisConnectionManager::new(redis_dsn).expect("Error intializing redis client");
+        let mgr = RedisMultiplexedConnectionManager::new(redis_dsn)
+            .expect("Error intializing redis client");
         let pool = bb8::Pool::builder()
             .max_size(max_connections.into())
             .build(mgr)
diff --git a/server/svix-server/src/v1/endpoints/application.rs b/server/svix-server/src/v1/endpoints/application.rs
index da1dc63ba..f3d537870 100644
--- a/server/svix-server/src/v1/endpoints/application.rs
+++ b/server/svix-server/src/v1/endpoints/application.rs
@@ -17,9 +17,9 @@ use crate::{
             UnrequiredNullableField,
         },
         validate_no_control_characters, validate_no_control_characters_unrequired,
-        validation_error, ApplicationPath, EmptyResponse, JsonStatus, JsonStatusUpsert,
-        ListOrdering, ListResponse, ModelIn, ModelOut, Pagination, PaginationLimit,
-        ReversibleIterator, ValidatedJson, ValidatedQuery,
+        validation_error, ApplicationPath, JsonStatusUpsert, ListResponse, ModelIn, ModelOut,
+        NoContent, Ordering, Pagination, PaginationLimit, ReversibleIterator, ValidatedJson,
+        ValidatedQuery,
     },
     AppState,
 };
@@ -39,6 +39,10 @@ use serde::{Deserialize, Serialize};
 use svix_server_derive::{aide_annotate, ModelOut};
 use validator::{Validate, ValidationError};
 
+fn application_name_example() -> &'static str {
+    "My first application"
+}
+
 #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize, Validate, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct ApplicationIn {
@@ -46,6 +50,7 @@ pub struct ApplicationIn {
         length(min = 1, message = "Application names must be at least one character"),
         custom = "validate_no_control_characters"
     )]
+    #[schemars(example = "application_name_example")]
     pub name: String,
 
     #[validate(range(min = 1, message = "Application rate limits must be at least 1 if set"))]
@@ -165,6 +170,7 @@ pub struct ApplicationOut {
     // FIXME: Do we want to use serde(flatten) or just duplicate the keys?
     #[serde(skip_serializing_if = "Option::is_none")]
     pub uid: Option<ApplicationUid>,
+    #[schemars(example = "application_name_example")]
     pub name: String,
     #[serde(skip_serializing_if = "Option::is_none")]
     pub rate_limit: Option<u16>,
@@ -189,8 +195,8 @@ impl From<(application::Model, applicationmetadata::Model)> for ApplicationOut {
     }
 }
 
-/// List all of the organization's applications.
-#[aide_annotate(op_id = "list_applications_api_v1_app__get")]
+/// List of all the organization's applications.
+#[aide_annotate(op_id = "v1.application.list")]
 async fn list_applications(
     State(AppState { ref db, .. }): State<AppState>,
     ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<ApplicationId>>>,
@@ -205,7 +211,7 @@ async fn list_applications(
         application::Column::Id,
         limit,
         iterator,
-        pagination.order.unwrap_or(ListOrdering::Ascending),
+        pagination.order.unwrap_or(Ordering::Ascending),
     );
 
     let results: Vec<ApplicationOut> = ctx!(
@@ -234,16 +240,17 @@ fn default_as_false() -> bool {
 }
 
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct CreateApplicationQuery {
+pub struct CreateApplicationQueryParams {
+    /// Get an existing application, or create a new one if doesn't exist. It's two separate functions in the libs.
     #[serde(default = "default_as_false")]
     get_if_exists: bool,
 }
 
 /// Create a new application.
-#[aide_annotate(op_id = "create_application_api_v1_app__post")]
+#[aide_annotate(op_id = "v1.application.create")]
 async fn create_application(
     State(AppState { ref db, .. }): State<AppState>,
-    query: ValidatedQuery<CreateApplicationQuery>,
+    query: ValidatedQuery<CreateApplicationQueryParams>,
     permissions::Organization { org_id }: permissions::Organization,
     ValidatedJson(data): ValidatedJson<ApplicationIn>,
 ) -> Result<JsonStatusUpsert<ApplicationOut>> {
@@ -280,7 +287,7 @@ async fn create_application(
 }
 
 /// Get an application.
-#[aide_annotate(op_id = "get_application_api_v1_app__app_id___get")]
+#[aide_annotate(op_id = "v1.application.get")]
 async fn get_application(
     permissions::ApplicationWithMetadata { app, metadata }: permissions::ApplicationWithMetadata,
 ) -> Result<Json<ApplicationOut>> {
@@ -288,7 +295,7 @@ async fn get_application(
 }
 
 /// Update an application.
-#[aide_annotate(op_id = "update_application_api_v1_app__app_id___put")]
+#[aide_annotate(op_id = "v1.application.update")]
 async fn update_application(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationPath { app_id }): Path<ApplicationPath>,
@@ -350,16 +357,16 @@ async fn patch_application(
 }
 
 /// Delete an application.
-#[aide_annotate(op_id = "delete_application_api_v1_app__app_id___delete")]
+#[aide_annotate(op_id = "v1.application.delete")]
 async fn delete_application(
     State(AppState { ref db, .. }): State<AppState>,
     permissions::OrganizationWithApplication { app }: permissions::OrganizationWithApplication,
-) -> Result<JsonStatus<204, EmptyResponse>> {
+) -> Result<NoContent> {
     let mut app: application::ActiveModel = app.into();
     app.deleted = Set(true);
     app.uid = Set(None); // We don't want deleted UIDs to clash
     ctx!(app.update(db).await)?;
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContent)
 }
 
 pub fn router() -> ApiRouter<AppState> {
diff --git a/server/svix-server/src/v1/endpoints/attempt.rs b/server/svix-server/src/v1/endpoints/attempt.rs
index 10399d071..e9bc29f3b 100644
--- a/server/svix-server/src/v1/endpoints/attempt.rs
+++ b/server/svix-server/src/v1/endpoints/attempt.rs
@@ -1,6 +1,8 @@
 // SPDX-FileCopyrightText: © 2022 Svix Authors
 // SPDX-License-Identifier: MIT
 
+use std::collections::HashMap;
+
 use crate::{
     core::{
         permissions,
@@ -20,8 +22,8 @@ use crate::{
         utils::{
             apply_pagination_desc, iterator_from_before_or_after, openapi_tag,
             ApplicationEndpointPath, ApplicationMsgAttemptPath, ApplicationMsgEndpointPath,
-            ApplicationMsgPath, EmptyResponse, EventTypesQuery, JsonStatus, ListResponse, ModelOut,
-            PaginationLimit, ReversibleIterator, ValidatedQuery,
+            ApplicationMsgPath, EventTypesQueryParams, ListResponse, ModelOut, NoContentWithCode,
+            PaginationDescending, PaginationLimit, ReversibleIterator, ValidatedQuery,
         },
     },
     AppState,
@@ -42,19 +44,34 @@ use sea_orm::{
     entity::prelude::*, sea_query::Expr, DatabaseConnection, IntoActiveModel, QueryOrder,
     QuerySelect,
 };
-use serde::{Deserialize, Serialize};
+use serde::{Deserialize, Deserializer, Serialize};
 
+use serde_json::value::RawValue;
 use svix_server_derive::{aide_annotate, ModelOut};
 use validator::Validate;
 
 use crate::db::models::messageattempt;
-use crate::v1::utils::Pagination;
+
+fn example_status_code() -> i16 {
+    200
+}
+
+fn example_endpoint_url() -> &'static str {
+    "https://example.com/webhook/"
+}
+
+fn example_attempt_response() -> &'static str {
+    "{}"
+}
 
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, ModelOut, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageAttemptOut {
+    #[schemars(url, length(min = 1, max = 65_536), example = "example_endpoint_url")]
     pub url: String,
+    #[schemars(example = "example_attempt_response")]
     pub response: String,
+    #[schemars(example = "example_status_code")]
     pub response_status_code: i16,
     pub status: MessageStatus,
     pub trigger_type: MessageAttemptTriggerType,
@@ -87,9 +104,9 @@ impl From<messageattempt::Model> for MessageAttemptOut {
 
 /// A model containing information on a given message plus additional fields on the last attempt for
 /// that message.
-#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
+#[derive(Clone, Debug, PartialEq, Eq, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
-pub struct AttemptedMessageOut {
+pub struct EndpointMessageOut {
     #[serde(flatten)]
     pub msg: MessageOut,
     pub status: MessageStatus,
@@ -97,18 +114,18 @@ pub struct AttemptedMessageOut {
     pub next_attempt: Option<DateTimeWithTimeZone>,
 }
 
-impl ModelOut for AttemptedMessageOut {
+impl ModelOut for EndpointMessageOut {
     fn id_copy(&self) -> String {
         self.msg.id.0.clone()
     }
 }
 
-impl AttemptedMessageOut {
+impl EndpointMessageOut {
     pub fn from_dest_and_msg(
         dest: messagedestination::Model,
         msg: message::Model,
-    ) -> AttemptedMessageOut {
-        AttemptedMessageOut {
+    ) -> EndpointMessageOut {
+        EndpointMessageOut {
             msg: msg.into(),
             status: dest.status,
             next_attempt: dest.next_attempt,
@@ -116,10 +133,28 @@ impl AttemptedMessageOut {
     }
 }
 
+// XXX: only used in tests, so OK if it's a bit hacky
+impl<'de> Deserialize<'de> for EndpointMessageOut {
+    fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
+    where
+        D: Deserializer<'de>,
+    {
+        let raw_value = Box::<RawValue>::deserialize(deserializer)?;
+        let rest: HashMap<&str, &RawValue> = serde_json::from_str(raw_value.get()).unwrap();
+        Ok(Self {
+            msg: serde_json::from_str(raw_value.get()).unwrap(),
+            status: serde_json::from_str(rest.get("status").unwrap().get()).unwrap(),
+            next_attempt: rest
+                .get("next_attempt")
+                .map(|x| serde_json::from_str(x.get()).unwrap()),
+        })
+    }
+}
+
 /// Additional parameters (besides pagination) in the query string for the "List Attempted Messages"
 /// endpoint.
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct ListAttemptedMessagesQueryParameters {
+pub struct ListAttemptedMessagesQueryParams {
     #[validate]
     channel: Option<EventChannel>,
     status: Option<MessageStatus>,
@@ -130,21 +165,19 @@ pub struct ListAttemptedMessagesQueryParameters {
 /// List messages for a particular endpoint. Additionally includes metadata about the latest message attempt.
 ///
 /// The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
-#[aide_annotate(
-    op_id = "list_attempted_messages_api_v1_app__app_id__endpoint__endpoint_id__msg__get"
-)]
+#[aide_annotate(op_id = "v1.message-attempt.list-attempted-messages")]
 async fn list_attempted_messages(
     State(AppState { ref db, .. }): State<AppState>,
-    ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<MessageId>>>,
-    ValidatedQuery(ListAttemptedMessagesQueryParameters {
+    ValidatedQuery(pagination): ValidatedQuery<PaginationDescending<ReversibleIterator<MessageId>>>,
+    ValidatedQuery(ListAttemptedMessagesQueryParams {
         channel,
         status,
         before,
         after,
-    }): ValidatedQuery<ListAttemptedMessagesQueryParameters>,
+    }): ValidatedQuery<ListAttemptedMessagesQueryParams>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
-) -> Result<Json<ListResponse<AttemptedMessageOut>>> {
+) -> Result<Json<ListResponse<EndpointMessageOut>>> {
     let PaginationLimit(limit) = pagination.limit;
     let endp = ctx!(
         endpoint::Entity::secure_find_by_id_or_uid(app.id.clone(), endpoint_id)
@@ -200,7 +233,7 @@ async fn list_attempted_messages(
     let into = |(dest, msg): (messagedestination::Model, Option<message::Model>)| {
         let msg =
             msg.ok_or_else(|| err_database!("No associated message with messagedestination"))?;
-        Ok(AttemptedMessageOut::from_dest_and_msg(dest, msg))
+        Ok(EndpointMessageOut::from_dest_and_msg(dest, msg))
     };
 
     let out = ctx!(dests_and_msgs.all(db).await)?
@@ -208,7 +241,7 @@ async fn list_attempted_messages(
         .map(into)
         .collect::<Result<_>>()?;
 
-    Ok(Json(AttemptedMessageOut::list_response(
+    Ok(Json(EndpointMessageOut::list_response(
         out,
         limit as usize,
         is_prev,
@@ -218,7 +251,7 @@ async fn list_attempted_messages(
 /// Additional parameters (besides pagination) in the query string for the "List Attempts by
 /// Endpoint" endpoint.
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct ListAttemptsByEndpointQueryParameters {
+pub struct ListAttemptsByEndpointQueryParams {
     status: Option<MessageStatus>,
     status_code_class: Option<StatusCodeClass>,
     #[validate]
@@ -294,20 +327,20 @@ fn list_attempts_by_endpoint_or_message_filters(
 }
 
 /// List attempts by endpoint id
-#[aide_annotate(
-    op_id = "list_attempts_by_endpoint_api_v1_app__app_id__attempt_endpoint__endpoint_id___get"
-)]
+#[aide_annotate(op_id = "v1.message-attempt.list-by-endpoint")]
 async fn list_attempts_by_endpoint(
     State(AppState { ref db, .. }): State<AppState>,
-    ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<MessageAttemptId>>>,
-    ValidatedQuery(ListAttemptsByEndpointQueryParameters {
+    ValidatedQuery(pagination): ValidatedQuery<
+        PaginationDescending<ReversibleIterator<MessageAttemptId>>,
+    >,
+    ValidatedQuery(ListAttemptsByEndpointQueryParams {
         status,
         status_code_class,
         channel,
         before,
         after,
-    }): ValidatedQuery<ListAttemptsByEndpointQueryParameters>,
-    EventTypesQuery(event_types): EventTypesQuery,
+    }): ValidatedQuery<ListAttemptsByEndpointQueryParams>,
+    EventTypesQueryParams(event_types): EventTypesQueryParams,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
 ) -> Result<Json<ListResponse<MessageAttemptOut>>> {
@@ -346,7 +379,7 @@ async fn list_attempts_by_endpoint(
 
 /// Flattens in a [`ListAttemptsByEndpointOrMsgQueryParameters`] and adds one extra query parameter
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct ListAttemptsByMsgQueryParameters {
+pub struct ListAttemptsByMsgQueryParams {
     status: Option<MessageStatus>,
     status_code_class: Option<StatusCodeClass>,
     #[validate]
@@ -358,20 +391,22 @@ pub struct ListAttemptsByMsgQueryParameters {
 }
 
 /// List attempts by message id
-#[aide_annotate(op_id = "list_attempts_by_msg_api_v1_app__app_id__attempt_msg__msg_id___get")]
+#[aide_annotate(op_id = "v1.message-attempt.list-by-msg")]
 async fn list_attempts_by_msg(
     State(AppState { ref db, .. }): State<AppState>,
-    ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<MessageAttemptId>>>,
-    ValidatedQuery(ListAttemptsByMsgQueryParameters {
+    ValidatedQuery(pagination): ValidatedQuery<
+        PaginationDescending<ReversibleIterator<MessageAttemptId>>,
+    >,
+    ValidatedQuery(ListAttemptsByMsgQueryParams {
         status,
         status_code_class,
         channel,
         endpoint_id,
         before,
         after,
-    }): ValidatedQuery<ListAttemptsByMsgQueryParameters>,
+    }): ValidatedQuery<ListAttemptsByMsgQueryParams>,
     Path(ApplicationMsgPath { msg_id, .. }): Path<ApplicationMsgPath>,
-    EventTypesQuery(event_types): EventTypesQuery,
+    EventTypesQueryParams(event_types): EventTypesQueryParams,
     permissions::Application { app }: permissions::Application,
 ) -> Result<Json<ListResponse<MessageAttemptOut>>> {
     let PaginationLimit(limit) = pagination.limit;
@@ -420,8 +455,8 @@ async fn list_attempts_by_msg(
     )))
 }
 
-/// A type combining information from [`messagedestination::Model`]s and [`endpoint::Model`]s to
-/// output information on attempted destinations
+// A type combining information from [`messagedestination::Model`]s and [`endpoint::Model`]s to
+// output information on attempted destinations
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageEndpointOut {
@@ -450,12 +485,10 @@ impl MessageEndpointOut {
 }
 
 /// `msg_id`: Use a message id or a message `eventId`
-#[aide_annotate(
-    op_id = "list_attempted_destinations_api_v1_app__app_id__msg__msg_id__endpoint__get"
-)]
+#[aide_annotate(op_id = "v1.message-attempt.list-attempted-destinations")]
 async fn list_attempted_destinations(
     State(AppState { ref db, .. }): State<AppState>,
-    ValidatedQuery(mut pagination): ValidatedQuery<Pagination<EndpointId>>,
+    ValidatedQuery(mut pagination): ValidatedQuery<PaginationDescending<EndpointId>>,
     Path(ApplicationMsgPath { msg_id, .. }): Path<ApplicationMsgPath>,
     permissions::Application { app }: permissions::Application,
 ) -> Result<Json<ListResponse<MessageEndpointOut>>> {
@@ -501,7 +534,7 @@ async fn list_attempted_destinations(
 }
 
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct ListAttemptsForEndpointQueryParameters {
+pub struct ListAttemptsForEndpointQueryParams {
     #[validate]
     pub channel: Option<EventChannel>,
     pub status: Option<MessageStatus>,
@@ -509,6 +542,18 @@ pub struct ListAttemptsForEndpointQueryParameters {
     pub after: Option<DateTime<Utc>>,
 }
 
+#[derive(Serialize, JsonSchema)]
+struct MessageAttemptEndpointOut {
+    #[serde(flatten)]
+    common_: MessageAttemptOut,
+}
+
+impl From<MessageAttemptOut> for MessageAttemptEndpointOut {
+    fn from(common_: MessageAttemptOut) -> Self {
+        Self { common_ }
+    }
+}
+
 /// DEPRECATED: please use list_attempts with endpoint_id as a query parameter instead.
 ///
 /// List the message attempts for a particular endpoint.
@@ -516,30 +561,28 @@ pub struct ListAttemptsForEndpointQueryParameters {
 /// Returning the endpoint.
 ///
 /// The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
-#[aide_annotate(
-    op_id = "list_attempts_for_endpoint_api_v1_app__app_id__msg__msg_id__endpoint__endpoint_id__attempt__get"
-)]
+#[aide_annotate(op_id = "v1.message-attempt.list-by-endpoint-deprecated")]
 async fn list_attempts_for_endpoint(
     state: State<AppState>,
-    pagination: ValidatedQuery<Pagination<ReversibleIterator<MessageAttemptId>>>,
-    ValidatedQuery(ListAttemptsForEndpointQueryParameters {
+    pagination: ValidatedQuery<PaginationDescending<ReversibleIterator<MessageAttemptId>>>,
+    ValidatedQuery(ListAttemptsForEndpointQueryParams {
         channel,
         status,
         before,
         after,
-    }): ValidatedQuery<ListAttemptsForEndpointQueryParameters>,
-    event_types_query: EventTypesQuery,
+    }): ValidatedQuery<ListAttemptsForEndpointQueryParams>,
+    event_types_query: EventTypesQueryParams,
     Path(ApplicationMsgEndpointPath {
         app_id,
         msg_id,
         endpoint_id,
     }): Path<ApplicationMsgEndpointPath>,
     auth_app: permissions::Application,
-) -> Result<Json<ListResponse<MessageAttemptOut>>> {
+) -> Result<Json<ListResponse<MessageAttemptEndpointOut>>> {
     list_messageattempts(
         state,
         pagination,
-        ValidatedQuery(AttemptListFetchOptions {
+        ValidatedQuery(AttemptListFetchQueryParams {
             endpoint_id: Some(endpoint_id),
             channel,
             status,
@@ -551,10 +594,23 @@ async fn list_attempts_for_endpoint(
         auth_app,
     )
     .await
+    .map(|Json(list)| {
+        let new_data = list
+            .data
+            .into_iter()
+            .map(MessageAttemptEndpointOut::from)
+            .collect();
+        Json(ListResponse {
+            data: new_data,
+            done: list.done,
+            iterator: list.iterator,
+            prev_iterator: list.prev_iterator,
+        })
+    })
 }
 
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct AttemptListFetchOptions {
+pub struct AttemptListFetchQueryParams {
     #[validate]
     pub endpoint_id: Option<EndpointIdOrUid>,
     #[validate]
@@ -567,18 +623,20 @@ pub struct AttemptListFetchOptions {
 /// Deprecated: Please use "List Attempts by Endpoint" and "List Attempts by Msg" instead.
 ///
 /// `msg_id`: Use a message id or a message `eventId`
-#[aide_annotate(op_id = "list_attempts_api_v1_app__app_id__msg__msg_id__attempt__get")]
+#[aide_annotate(op_id = "v1.message-attempt.list-by-msg-deprecated")]
 async fn list_messageattempts(
     State(AppState { ref db, .. }): State<AppState>,
-    ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<MessageAttemptId>>>,
-    ValidatedQuery(AttemptListFetchOptions {
+    ValidatedQuery(pagination): ValidatedQuery<
+        PaginationDescending<ReversibleIterator<MessageAttemptId>>,
+    >,
+    ValidatedQuery(AttemptListFetchQueryParams {
         endpoint_id,
         channel,
         status,
         before,
         after,
-    }): ValidatedQuery<AttemptListFetchOptions>,
-    EventTypesQuery(event_types): EventTypesQuery,
+    }): ValidatedQuery<AttemptListFetchQueryParams>,
+    EventTypesQueryParams(event_types): EventTypesQueryParams,
     Path(ApplicationMsgPath { msg_id, .. }): Path<ApplicationMsgPath>,
     permissions::Application { app }: permissions::Application,
 ) -> Result<Json<ListResponse<MessageAttemptOut>>> {
@@ -630,7 +688,7 @@ async fn list_messageattempts(
 }
 
 /// `msg_id`: Use a message id or a message `eventId`
-#[aide_annotate(op_id = "get_attempt_api_v1_app__app_id__msg__msg_id__attempt__attempt_id___get")]
+#[aide_annotate(op_id = "v1.message-attempt.get")]
 async fn get_messageattempt(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationMsgAttemptPath {
@@ -656,9 +714,7 @@ async fn get_messageattempt(
 }
 
 /// Resend a message to the specified endpoint.
-#[aide_annotate(
-    op_id = "resend_webhook_api_v1_app__app_id__msg__msg_id__endpoint__endpoint_id__resend__post"
-)]
+#[aide_annotate(op_id = "v1.message-attempt.resend")]
 async fn resend_webhook(
     State(AppState {
         ref db, queue_tx, ..
@@ -669,7 +725,7 @@ async fn resend_webhook(
         ..
     }): Path<ApplicationMsgEndpointPath>,
     permissions::Application { app }: permissions::Application,
-) -> Result<JsonStatus<202, EmptyResponse>> {
+) -> Result<NoContentWithCode<202>> {
     let msg = ctx!(
         message::Entity::secure_find_by_id_or_uid(app.id.clone(), msg_id)
             .one(db)
@@ -712,13 +768,11 @@ async fn resend_webhook(
             None,
         )
         .await?;
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContentWithCode)
 }
 
 /// Deletes the given attempt's response body. Useful when an endpoint accidentally returned sensitive content.
-#[aide_annotate(
-    op_id = "expunge_attempt_content_api_v1_app__app_id__msg__msg_id__attempt__attempt_id__content__delete"
-)]
+#[aide_annotate(op_id = "v1.message-attempt.expunge-content")]
 async fn expunge_attempt_content(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationMsgAttemptPath {
@@ -812,9 +866,9 @@ pub fn router() -> ApiRouter<AppState> {
 #[cfg(test)]
 mod tests {
     use super::{
-        AttemptListFetchOptions, ListAttemptedMessagesQueryParameters,
-        ListAttemptsByEndpointQueryParameters, ListAttemptsByMsgQueryParameters,
-        ListAttemptsForEndpointQueryParameters,
+        AttemptListFetchQueryParams, ListAttemptedMessagesQueryParams,
+        ListAttemptsByEndpointQueryParams, ListAttemptsByMsgQueryParams,
+        ListAttemptsForEndpointQueryParams,
     };
     use serde_json::json;
     use validator::Validate;
@@ -826,33 +880,33 @@ mod tests {
 
     #[test]
     fn test_list_attempted_messages_query_params_validation() {
-        let q: ListAttemptedMessagesQueryParameters =
+        let q: ListAttemptedMessagesQueryParams =
             serde_json::from_value(json!({ "channel": INVALID_CHANNEL })).unwrap();
         assert!(q.validate().is_err());
 
-        let q: ListAttemptedMessagesQueryParameters =
+        let q: ListAttemptedMessagesQueryParams =
             serde_json::from_value(json!({ "channel": VALID_CHANNEL })).unwrap();
         q.validate().unwrap();
     }
 
     #[test]
     fn test_list_attempts_by_endpoint_query_parameters_validation() {
-        let q: ListAttemptsByEndpointQueryParameters =
+        let q: ListAttemptsByEndpointQueryParams =
             serde_json::from_value(json!({ "channel": INVALID_CHANNEL })).unwrap();
         assert!(q.validate().is_err());
     }
 
     #[test]
     fn test_list_attempts_by_msg_query_parameters_validation() {
-        let q: ListAttemptsByMsgQueryParameters =
+        let q: ListAttemptsByMsgQueryParams =
             serde_json::from_value(json!({ "channel": INVALID_CHANNEL })).unwrap();
         assert!(q.validate().is_err());
 
-        let q: ListAttemptsByMsgQueryParameters =
+        let q: ListAttemptsByMsgQueryParams =
             serde_json::from_value(json!({ "endpoint_id": INVALID_ENDPOINT_ID })).unwrap();
         assert!(q.validate().is_err());
 
-        let q: ListAttemptsByMsgQueryParameters = serde_json::from_value(json!(
+        let q: ListAttemptsByMsgQueryParams = serde_json::from_value(json!(
             {
                 "channel": VALID_CHANNEL,
                 "endpoint_id": VALID_ENDPOINT_ID
@@ -864,26 +918,26 @@ mod tests {
 
     #[test]
     fn test_list_attempts_for_endpoint_query_parameters_validation() {
-        let q: ListAttemptsForEndpointQueryParameters =
+        let q: ListAttemptsForEndpointQueryParams =
             serde_json::from_value(json!({ "channel": INVALID_CHANNEL })).unwrap();
         assert!(q.validate().is_err());
 
-        let q: ListAttemptsForEndpointQueryParameters =
+        let q: ListAttemptsForEndpointQueryParams =
             serde_json::from_value(json!({ "channel": VALID_CHANNEL })).unwrap();
         q.validate().unwrap();
     }
 
     #[test]
     fn test_attempt_list_fetch_options_validation() {
-        let q: AttemptListFetchOptions =
+        let q: AttemptListFetchQueryParams =
             serde_json::from_value(json!({ "endpoint_id": INVALID_ENDPOINT_ID })).unwrap();
         assert!(q.validate().is_err());
 
-        let q: AttemptListFetchOptions =
+        let q: AttemptListFetchQueryParams =
             serde_json::from_value(json!({ "channel": INVALID_CHANNEL })).unwrap();
         assert!(q.validate().is_err());
 
-        let q: AttemptListFetchOptions = serde_json::from_value(json!(
+        let q: AttemptListFetchQueryParams = serde_json::from_value(json!(
             {
                 "endpoint_id": VALID_ENDPOINT_ID,
                 "channel": VALID_CHANNEL
diff --git a/server/svix-server/src/v1/endpoints/auth.rs b/server/svix-server/src/v1/endpoints/auth.rs
index b80b7bedb..6c0bbc3ae 100644
--- a/server/svix-server/src/v1/endpoints/auth.rs
+++ b/server/svix-server/src/v1/endpoints/auth.rs
@@ -2,7 +2,10 @@ use aide::{
     axum::{routing::post_with, ApiRouter},
     transform::TransformOperation,
 };
-use axum::{extract::State, Json};
+use axum::{
+    extract::{Path, State},
+    Json,
+};
 use schemars::JsonSchema;
 use serde::{Deserialize, Serialize};
 use svix_server_derive::aide_annotate;
@@ -11,30 +14,56 @@ use validator::Validate;
 use crate::{
     core::{permissions, security::generate_app_token, types::FeatureFlagSet},
     error::{HttpError, Result},
-    v1::utils::{api_not_implemented, openapi_tag, ValidatedJson},
+    v1::utils::{api_not_implemented, openapi_tag, ApplicationPath, ValidatedJson},
     AppState,
 };
 
+fn login_url_example() -> &'static str {
+    "https://app.svix.com/login#key=eyJhcHBJZCI6ICJhcHBfMXRSdFl"
+}
+
+fn token_example() -> &'static str {
+    "appsk_kV3ts5tKPNJN4Dl25cMTfUNdmabxbX0O"
+}
+
 #[derive(Deserialize, Serialize, JsonSchema)]
 pub struct DashboardAccessOut {
+    #[schemars(url, example = "login_url_example", length(min = 1, max = 65_536))]
     pub url: String,
+    #[schemars(example = "token_example")]
     pub token: String,
 }
 
+fn feature_flag_set_example() -> FeatureFlagSet {
+    FeatureFlagSet::new()
+}
+
 #[derive(Deserialize, Serialize, Validate, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct AppPortalAccessIn {
     /// The set of feature flags the created token will have access to.
     #[serde(default, skip_serializing_if = "FeatureFlagSet::is_empty")]
+    #[schemars(example = "feature_flag_set_example")]
     pub feature_flags: FeatureFlagSet,
 }
 
-pub type AppPortalAccessOut = DashboardAccessOut;
+#[derive(Serialize, JsonSchema)]
+pub struct AppPortalAccessOut {
+    #[serde(flatten)]
+    common_: DashboardAccessOut,
+}
+
+impl From<DashboardAccessOut> for AppPortalAccessOut {
+    fn from(common_: DashboardAccessOut) -> Self {
+        Self { common_ }
+    }
+}
 
 /// Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.
-#[aide_annotate(op_id = "get_app_portal_access_api_v1_auth_app_portal_access__app_id___post")]
+#[aide_annotate(op_id = "v1.authentication.app-portal-access")]
 async fn app_portal_access(
     State(AppState { cfg, .. }): State<AppState>,
+    _: Path<ApplicationPath>,
     permissions::OrganizationWithApplication { app }: permissions::OrganizationWithApplication,
     ValidatedJson(data): ValidatedJson<AppPortalAccessIn>,
 ) -> Result<Json<AppPortalAccessOut>> {
@@ -57,25 +86,31 @@ async fn app_portal_access(
     // Included for API compatibility, but this URL will not be useful
     let url = format!("{}/login#key={}", &cfg.internal.app_portal_url, login_key);
 
-    Ok(Json(DashboardAccessOut { url, token }))
+    Ok(Json(AppPortalAccessOut::from(DashboardAccessOut {
+        url,
+        token,
+    })))
 }
 
 /// DEPRECATED: Please use `app-portal-access` instead.
 ///
 /// Use this function to get magic links (and authentication codes) for connecting your users to the Consumer Application Portal.
-#[aide_annotate(op_id = "get_dashboard_access_api_v1_auth_dashboard_access__app_id___post")]
+#[aide_annotate(op_id = "v1.authentication.dashboard-access")]
 async fn dashboard_access(
     state: State<AppState>,
+    path: Path<ApplicationPath>,
     permissions: permissions::OrganizationWithApplication,
 ) -> Result<Json<DashboardAccessOut>> {
     app_portal_access(
         state,
+        path,
         permissions,
         ValidatedJson(AppPortalAccessIn {
             feature_flags: FeatureFlagSet::default(),
         }),
     )
     .await
+    .map(|Json(AppPortalAccessOut { common_: out })| Json(out))
 }
 
 const LOGOUT_DESCRIPTION: &str = r#"
diff --git a/server/svix-server/src/v1/endpoints/endpoint/crud.rs b/server/svix-server/src/v1/endpoints/endpoint/crud.rs
index 74eb78053..ab2f9516d 100644
--- a/server/svix-server/src/v1/endpoints/endpoint/crud.rs
+++ b/server/svix-server/src/v1/endpoints/endpoint/crud.rs
@@ -9,7 +9,7 @@ use sea_orm::{ActiveModelTrait, DatabaseConnection, QuerySelect};
 use svix_server_derive::aide_annotate;
 use url::Url;
 
-use super::{EndpointIn, EndpointOut, EndpointPatch};
+use super::{EndpointIn, EndpointOut, EndpointPatch, EndpointUpdate};
 use crate::{
     cfg::Configuration,
     core::{
@@ -23,8 +23,8 @@ use crate::{
     v1::utils::{
         apply_pagination,
         patch::{patch_field_non_nullable, UnrequiredField, UnrequiredNullableField},
-        ApplicationEndpointPath, EmptyResponse, JsonStatus, JsonStatusUpsert, ListOrdering,
-        ListResponse, ModelIn, ModelOut, Pagination, PaginationLimit, ReversibleIterator,
+        ApplicationEndpointPath, ApplicationPath, JsonStatus, JsonStatusUpsert, ListResponse,
+        ModelIn, ModelOut, NoContent, Ordering, Pagination, PaginationLimit, ReversibleIterator,
         ValidatedJson, ValidatedQuery,
     },
     AppState,
@@ -32,9 +32,10 @@ use crate::{
 use hack::EventTypeNameResult;
 
 /// List the application's endpoints.
-#[aide_annotate(op_id = "list_endpoints_api_v1_app__app_id__endpoint__get")]
+#[aide_annotate(op_id = "v1.endpoint.list")]
 pub(super) async fn list_endpoints(
     State(AppState { ref db, .. }): State<AppState>,
+    _: Path<ApplicationPath>,
     ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<EndpointId>>>,
     permissions::Application { app }: permissions::Application,
 ) -> Result<Json<ListResponse<EndpointOut>>> {
@@ -47,7 +48,7 @@ pub(super) async fn list_endpoints(
         endpoint::Column::Id,
         limit,
         iterator,
-        pagination.order.unwrap_or(ListOrdering::Descending),
+        pagination.order.unwrap_or(Ordering::Descending),
     );
 
     let results = ctx!(
@@ -105,7 +106,7 @@ async fn create_endp_from_data(
 /// Create a new endpoint for the application.
 ///
 /// When `secret` is `null` the secret is automatically generated (recommended)
-#[aide_annotate(op_id = "create_endpoint_api_v1_app__app_id__endpoint__post")]
+#[aide_annotate(op_id = "v1.endpoint.create")]
 pub(super) async fn create_endpoint(
     State(AppState {
         ref db,
@@ -113,6 +114,7 @@ pub(super) async fn create_endpoint(
         op_webhooks,
         ..
     }): State<AppState>,
+    _: Path<ApplicationPath>,
     permissions::Application { app }: permissions::Application,
     ValidatedJson(data): ValidatedJson<EndpointIn>,
 ) -> Result<JsonStatus<201, EndpointOut>> {
@@ -127,7 +129,7 @@ pub(super) async fn create_endpoint(
 }
 
 /// Get an endpoint.
-#[aide_annotate(op_id = "get_endpoint_api_v1_app__app_id__endpoint__endpoint_id___get")]
+#[aide_annotate(op_id = "v1.endpoint.get")]
 pub(super) async fn get_endpoint(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
@@ -173,7 +175,7 @@ async fn update_endp_from_data(
 }
 
 /// Update an endpoint.
-#[aide_annotate(op_id = "update_endpoint_api_v1_app__app_id__endpoint__endpoint_id___put")]
+#[aide_annotate(op_id = "v1.endpoint.update")]
 pub(super) async fn update_endpoint(
     State(AppState {
         ref db,
@@ -183,7 +185,7 @@ pub(super) async fn update_endpoint(
     }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
-    ValidatedJson(mut data): ValidatedJson<EndpointIn>,
+    ValidatedJson(mut data): ValidatedJson<EndpointUpdate>,
 ) -> Result<JsonStatusUpsert<EndpointOut>> {
     if let Some(ref event_types_ids) = data.event_types_ids {
         validate_event_types(db, event_types_ids, &app.org_id).await?;
@@ -200,6 +202,7 @@ pub(super) async fn update_endpoint(
             ctx!(update_endp_from_data(db, op_webhooks, app, endp, metadata).await)?;
         Ok(JsonStatusUpsert::Updated((endp, metadata.data).into()))
     } else {
+        let data = data.into_in_with_default_key();
         let (endp, metadata) = ctx!(create_endp_from_data(db, cfg, op_webhooks, app, data).await)?;
         Ok(JsonStatusUpsert::Created((endp, metadata.data).into()))
     }
@@ -240,7 +243,7 @@ pub(super) async fn patch_endpoint(
 }
 
 /// Delete an endpoint.
-#[aide_annotate(op_id = "delete_endpoint_api_v1_app__app_id__endpoint__endpoint_id___delete")]
+#[aide_annotate(op_id = "v1.endpoint.delete")]
 pub(super) async fn delete_endpoint(
     State(AppState {
         ref db,
@@ -249,7 +252,7 @@ pub(super) async fn delete_endpoint(
     }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
-) -> Result<JsonStatus<204, EmptyResponse>> {
+) -> Result<NoContent> {
     let endp = ctx!(
         endpoint::Entity::secure_find_by_id_or_uid(app.id.clone(), endpoint_id)
             .one(db)
@@ -278,7 +281,7 @@ pub(super) async fn delete_endpoint(
         )
         .await?;
 
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContent)
 }
 
 /// This module is here so that our Result override doesn't conflict
diff --git a/server/svix-server/src/v1/endpoints/endpoint/headers.rs b/server/svix-server/src/v1/endpoints/endpoint/headers.rs
index 314601951..116f13700 100644
--- a/server/svix-server/src/v1/endpoints/endpoint/headers.rs
+++ b/server/svix-server/src/v1/endpoints/endpoint/headers.rs
@@ -11,14 +11,12 @@ use crate::{
     ctx,
     db::models::endpoint,
     error::{HttpError, Result},
-    v1::utils::{ApplicationEndpointPath, EmptyResponse, JsonStatus, ModelIn, ValidatedJson},
+    v1::utils::{ApplicationEndpointPath, ModelIn, NoContent, ValidatedJson},
     AppState,
 };
 
 /// Get the additional headers to be sent with the webhook
-#[aide_annotate(
-    op_id = "get_endpoint_headers_api_v1_app__app_id__endpoint__endpoint_id__headers__get"
-)]
+#[aide_annotate(op_id = "v1.endpoint.get-headers")]
 pub(super) async fn get_endpoint_headers(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
@@ -38,15 +36,13 @@ pub(super) async fn get_endpoint_headers(
 }
 
 /// Set the additional headers to be sent with the webhook
-#[aide_annotate(
-    op_id = "update_endpoint_headers_api_v1_app__app_id__endpoint__endpoint_id__headers__put"
-)]
+#[aide_annotate(op_id = "v1.endpoint.update-headers")]
 pub(super) async fn update_endpoint_headers(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
     ValidatedJson(data): ValidatedJson<EndpointHeadersIn>,
-) -> Result<JsonStatus<204, EmptyResponse>> {
+) -> Result<NoContent> {
     let endp = ctx!(
         endpoint::Entity::secure_find_by_id_or_uid(app.id.clone(), endpoint_id)
             .one(db)
@@ -58,19 +54,17 @@ pub(super) async fn update_endpoint_headers(
     data.update_model(&mut endp);
     ctx!(endp.update(db).await)?;
 
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContent)
 }
 
 /// Partially set the additional headers to be sent with the webhook
-#[aide_annotate(
-    op_id = "patch_endpoint_headers_api_v1_app__app_id__endpoint__endpoint_id__headers__patch"
-)]
+#[aide_annotate(op_id = "v1.endpoint.patch-headers")]
 pub(super) async fn patch_endpoint_headers(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
     ValidatedJson(data): ValidatedJson<EndpointHeadersPatchIn>,
-) -> Result<JsonStatus<204, EmptyResponse>> {
+) -> Result<NoContent> {
     let endp = ctx!(
         endpoint::Entity::secure_find_by_id_or_uid(app.id.clone(), endpoint_id)
             .one(db)
@@ -82,7 +76,7 @@ pub(super) async fn patch_endpoint_headers(
     data.update_model(&mut endp);
     ctx!(endp.update(db).await)?;
 
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContent)
 }
 
 #[cfg(test)]
diff --git a/server/svix-server/src/v1/endpoints/endpoint/mod.rs b/server/svix-server/src/v1/endpoints/endpoint/mod.rs
index 830b3c8a5..289007e4d 100644
--- a/server/svix-server/src/v1/endpoints/endpoint/mod.rs
+++ b/server/svix-server/src/v1/endpoints/endpoint/mod.rs
@@ -117,12 +117,36 @@ fn validate_url_unrequired(val: &UnrequiredField<Url>) -> std::result::Result<()
     }
 }
 
+fn example_channel_set() -> Vec<&'static str> {
+    vec!["project_123", "group_2"]
+}
+
+fn example_endpoint_description() -> &'static str {
+    "An example endpoint name"
+}
+
+fn example_filter_types() -> Vec<&'static str> {
+    vec!["user.signup", "user.deleted"]
+}
+
+fn endpoint_disabled_default() -> bool {
+    false
+}
+
+fn example_endpoint_url() -> &'static str {
+    "https://example.com/webhook/"
+}
+
+fn example_endpoint_version() -> u16 {
+    1
+}
+
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Validate, ModelIn, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointIn {
     #[serde(default)]
-    #[serde(skip_serializing_if = "String::is_empty")]
     #[validate(custom = "validate_no_control_characters")]
+    #[schemars(example = "example_endpoint_description")]
     pub description: String,
 
     #[validate(range(min = 1, message = "Endpoint rate limits must be at least one if set"))]
@@ -134,20 +158,25 @@ pub struct EndpointIn {
     pub uid: Option<EndpointUid>,
 
     #[validate(custom = "validate_url")]
+    #[schemars(url, length(min = 1, max = 65_536), example = "example_endpoint_url")]
     pub url: Url,
     #[validate(range(min = 1, message = "Endpoint versions must be at least one"))]
+    #[schemars(range(min = 1), example = "example_endpoint_version")]
     pub version: u16,
     #[serde(default)]
-    #[serde(skip_serializing_if = "std::ops::Not::not")]
+    #[schemars(example = "endpoint_disabled_default")]
     pub disabled: bool,
     #[serde(rename = "filterTypes")]
     #[validate(custom = "validate_event_types_ids")]
     #[validate]
     #[serde(skip_serializing_if = "Option::is_none")]
+    #[schemars(example = "example_filter_types", length(min = 1))]
     pub event_types_ids: Option<EventTypeNameSet>,
+    /// List of message channels this endpoint listens to (omit for all)
     #[validate(custom = "validate_channels_endpoint")]
     #[validate]
     #[serde(skip_serializing_if = "Option::is_none")]
+    #[schemars(example = "example_channel_set", length(min = 1, max = 10))]
     pub channels: Option<EventChannelSet>,
 
     #[validate]
@@ -203,6 +232,108 @@ impl ModelIn for EndpointIn {
     }
 }
 
+#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Validate, ModelIn, JsonSchema)]
+#[serde(rename_all = "camelCase")]
+struct EndpointUpdate {
+    #[serde(default)]
+    #[validate(custom = "validate_no_control_characters")]
+    #[schemars(example = "example_endpoint_description")]
+    pub description: String,
+
+    #[validate(range(min = 1, message = "Endpoint rate limits must be at least one if set"))]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub rate_limit: Option<u16>,
+
+    /// Optional unique identifier for the endpoint
+    #[validate]
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub uid: Option<EndpointUid>,
+
+    #[validate(custom = "validate_url")]
+    #[schemars(url, length(min = 1, max = 65_536), example = "example_endpoint_url")]
+    pub url: Url,
+
+    #[validate(range(min = 1, message = "Endpoint versions must be at least one"))]
+    #[schemars(example = "example_endpoint_version")]
+    pub version: u16,
+
+    #[serde(default)]
+    #[schemars(example = "endpoint_disabled_default")]
+    pub disabled: bool,
+
+    #[serde(rename = "filterTypes")]
+    #[validate(custom = "validate_event_types_ids")]
+    #[validate]
+    #[schemars(example = "example_filter_types", length(min = 1))]
+    pub event_types_ids: Option<EventTypeNameSet>,
+
+    /// List of message channels this endpoint listens to (omit for all)
+    #[validate(custom = "validate_channels_endpoint")]
+    #[validate]
+    #[schemars(example = "example_channel_set", length(min = 1, max = 10))]
+    pub channels: Option<EventChannelSet>,
+
+    #[serde(default)]
+    pub metadata: Metadata,
+}
+
+impl ModelIn for EndpointUpdate {
+    type ActiveModel = endpoint::ActiveModel;
+
+    fn update_model(self, model: &mut Self::ActiveModel) {
+        let EndpointUpdate {
+            description,
+            rate_limit,
+            uid,
+            url,
+            version,
+            disabled,
+            event_types_ids,
+            channels,
+            metadata: _,
+        } = self;
+
+        model.description = Set(description);
+        model.rate_limit = Set(rate_limit.map(|x| x.into()));
+        model.uid = Set(uid);
+        model.url = Set(url.into());
+        model.version = Set(version.into());
+        model.disabled = Set(disabled);
+        model.event_types_ids = Set(event_types_ids);
+        model.channels = Set(channels);
+    }
+}
+
+impl EndpointUpdate {
+    pub fn into_in_with_default_key(self) -> EndpointIn {
+        let EndpointUpdate {
+            description,
+            rate_limit,
+            uid,
+            url,
+            version,
+            disabled,
+            event_types_ids,
+            channels,
+            metadata,
+        } = self;
+
+        EndpointIn {
+            description,
+            rate_limit,
+            uid,
+            url,
+            version,
+            disabled,
+            event_types_ids,
+            channels,
+            metadata,
+
+            key: None,
+        }
+    }
+}
+
 #[derive(Clone, Debug, Default, Serialize, Deserialize, Validate, ModelIn, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointPatch {
@@ -323,15 +454,25 @@ fn validate_minimum_version_patch(
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointOutCommon {
+    /// An example endpoint name
     pub description: String,
     pub rate_limit: Option<u16>,
     /// Optional unique identifier for the endpoint
     pub uid: Option<EndpointUid>,
+    #[schemars(url, length(min = 1, max = 65_536), example = "example_endpoint_url")]
     pub url: String,
+    #[schemars(range(min = 1), example = "example_endpoint_version")]
     pub version: u16,
+    #[schemars(
+        example = "endpoint_disabled_default",
+        default = "endpoint_disabled_default"
+    )]
     pub disabled: bool,
     #[serde(rename = "filterTypes")]
+    #[schemars(example = "example_filter_types", length(min = 1))]
     pub event_types_ids: Option<EventTypeNameSet>,
+    /// List of message channels this endpoint listens to (omit for all)
+    #[schemars(example = "example_channel_set", length(min = 1, max = 10))]
     pub channels: Option<EventChannelSet>,
     pub created_at: DateTime<Utc>,
     pub updated_at: DateTime<Utc>,
@@ -394,9 +535,14 @@ pub struct RecoverIn {
     pub since: DateTime<Utc>,
 }
 
+fn endpoint_headers_example() -> HashMap<&'static str, &'static str> {
+    HashMap::from([("X-Example", "123"), ("X-Foobar", "Bar")])
+}
+
 #[derive(Clone, Debug, PartialEq, Eq, Validate, Deserialize, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointHeadersIn {
+    #[schemars(example = "endpoint_headers_example")]
     pub headers: EndpointHeaders,
 }
 
@@ -409,10 +555,19 @@ impl ModelIn for EndpointHeadersIn {
     }
 }
 
+fn sensitive_headers_example() -> HashSet<String> {
+    HashSet::from(["Authorization".to_string()])
+}
+
+/// The value of the headers is returned in the `headers` field.
+///
+/// Sensitive headers that have been redacted are returned in the sensitive field.
 #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Default, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointHeadersOut {
+    #[schemars(example = "endpoint_headers_example")]
     pub headers: HashMap<String, String>,
+    #[schemars(example = "sensitive_headers_example")]
     pub sensitive: HashSet<String>,
 }
 
@@ -440,10 +595,18 @@ impl From<EndpointHeaders> for EndpointHeadersOut {
     }
 }
 
+fn endpoint_headers_patch_example() -> EndpointHeadersPatch {
+    EndpointHeadersPatch(HashMap::from([
+        ("X-Example".to_string(), Some("123".to_string())),
+        ("X-Foobar".to_string(), Some("Bar".to_string())),
+    ]))
+}
+
 #[derive(Clone, Debug, PartialEq, Eq, Validate, Deserialize, Serialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EndpointHeadersPatchIn {
     #[validate]
+    #[schemars(example = "endpoint_headers_patch_example")]
     pub headers: EndpointHeadersPatch,
 }
 
@@ -510,6 +673,7 @@ impl EndpointStatsRange {
 }
 
 #[derive(Deserialize, Serialize, JsonSchema)]
+#[schemars(rename = "EndpointStats")]
 pub struct EndpointStatsOut {
     pub success: i64,
     pub pending: i64,
@@ -524,7 +688,7 @@ pub struct EndpointStatsQueryOut {
 }
 
 /// Get basic statistics for the endpoint.
-#[aide_annotate(op_id = "get_endpoint_stats_api_v1_app__app_id__endpoint__endpoint_id__stats__get")]
+#[aide_annotate(op_id = "v1.endpoint.get-stats")]
 async fn endpoint_stats(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
diff --git a/server/svix-server/src/v1/endpoints/endpoint/recovery.rs b/server/svix-server/src/v1/endpoints/endpoint/recovery.rs
index 42483ee1c..05758af6f 100644
--- a/server/svix-server/src/v1/endpoints/endpoint/recovery.rs
+++ b/server/svix-server/src/v1/endpoints/endpoint/recovery.rs
@@ -5,6 +5,7 @@ use sea_orm::{DatabaseConnection, QuerySelect};
 use svix_server_derive::aide_annotate;
 
 use super::RecoverIn;
+use crate::v1::utils::NoContentWithCode;
 use crate::{
     core::{
         permissions,
@@ -14,7 +15,7 @@ use crate::{
     db::models::{application, endpoint, messagedestination},
     error::{HttpError, Result, ValidationErrorItem},
     queue::{MessageTask, TaskQueueProducer},
-    v1::utils::{ApplicationEndpointPath, EmptyResponse, JsonStatus, ValidatedJson},
+    v1::utils::{ApplicationEndpointPath, ValidatedJson},
     AppState,
 };
 
@@ -69,9 +70,7 @@ async fn bulk_recover_failed_messages(
 }
 
 /// Resend all failed messages since a given time.
-#[aide_annotate(
-    op_id = "recover_failed_webhooks_api_v1_app__app_id__endpoint__endpoint_id__recover__post"
-)]
+#[aide_annotate(op_id = "v1.endpoint.recover")]
 pub(super) async fn recover_failed_webhooks(
     State(AppState {
         ref db, queue_tx, ..
@@ -79,7 +78,7 @@ pub(super) async fn recover_failed_webhooks(
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
     ValidatedJson(data): ValidatedJson<RecoverIn>,
-) -> Result<JsonStatus<202, EmptyResponse>> {
+) -> Result<NoContentWithCode<202>> {
     // Add five minutes so that people can easily just do `now() - two_weeks` without having to worry about clock sync
     let timeframe = chrono::Duration::days(14);
     let timeframe = timeframe + chrono::Duration::minutes(5);
@@ -106,5 +105,5 @@ pub(super) async fn recover_failed_webhooks(
         async move { bulk_recover_failed_messages(db, queue_tx, app, endp, data.since).await },
     );
 
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContentWithCode)
 }
diff --git a/server/svix-server/src/v1/endpoints/endpoint/secrets.rs b/server/svix-server/src/v1/endpoints/endpoint/secrets.rs
index 70f30b480..48186fc7f 100644
--- a/server/svix-server/src/v1/endpoints/endpoint/secrets.rs
+++ b/server/svix-server/src/v1/endpoints/endpoint/secrets.rs
@@ -20,7 +20,7 @@ use crate::{
     ctx,
     db::models::endpoint,
     error::{HttpError, Result},
-    v1::utils::{ApplicationEndpointPath, EmptyResponse, JsonStatus, ValidatedJson},
+    v1::utils::{ApplicationEndpointPath, NoContent, ValidatedJson},
     AppState,
 };
 
@@ -35,9 +35,7 @@ pub(super) fn generate_secret(
 ///
 /// This is used to verify the authenticity of the webhook.
 /// For more information please refer to [the consuming webhooks docs](https://docs.svix.com/consuming-webhooks/).
-#[aide_annotate(
-    op_id = "get_endpoint_secret_api_v1_app__app_id__endpoint__endpoint_id__secret__get"
-)]
+#[aide_annotate(op_id = "v1.endpoint.get-secret")]
 pub(super) async fn get_endpoint_secret(
     State(AppState { ref db, cfg, .. }): State<AppState>,
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
@@ -55,9 +53,7 @@ pub(super) async fn get_endpoint_secret(
 }
 
 /// Rotates the endpoint's signing secret.  The previous secret will be valid for the next 24 hours.
-#[aide_annotate(
-    op_id = "rotate_endpoint_secret_api_v1_app__app_id__endpoint__endpoint_id__secret_rotate__post"
-)]
+#[aide_annotate(op_id = "v1.endpoint.rotate-secret")]
 pub(super) async fn rotate_endpoint_secret(
     State(AppState {
         ref db,
@@ -68,7 +64,7 @@ pub(super) async fn rotate_endpoint_secret(
     Path(ApplicationEndpointPath { endpoint_id, .. }): Path<ApplicationEndpointPath>,
     permissions::Application { app }: permissions::Application,
     ValidatedJson(data): ValidatedJson<EndpointSecretRotateIn>,
-) -> Result<JsonStatus<204, EmptyResponse>> {
+) -> Result<NoContent> {
     let mut endp = ctx!(
         endpoint::Entity::secure_find_by_id_or_uid(app.id, endpoint_id)
             .one(db)
@@ -125,5 +121,5 @@ pub(super) async fn rotate_endpoint_secret(
         )
         .await?;
 
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContent)
 }
diff --git a/server/svix-server/src/v1/endpoints/event_type.rs b/server/svix-server/src/v1/endpoints/event_type.rs
index e1cf50839..8cef8270f 100644
--- a/server/svix-server/src/v1/endpoints/event_type.rs
+++ b/server/svix-server/src/v1/endpoints/event_type.rs
@@ -15,9 +15,10 @@ use crate::{
             patch_field_non_nullable, patch_field_nullable, UnrequiredField,
             UnrequiredNullableField,
         },
-        validate_no_control_characters, validate_no_control_characters_unrequired, EmptyResponse,
-        EventTypeNamePath, JsonStatus, JsonStatusUpsert, ListOrdering, ListResponse, ModelIn,
-        ModelOut, Pagination, PaginationLimit, ReversibleIterator, ValidatedJson, ValidatedQuery,
+        validate_no_control_characters, validate_no_control_characters_unrequired,
+        EventTypeNamePath, JsonStatus, JsonStatusUpsert, ListResponse, ModelIn, ModelOut,
+        NoContent, Ordering, Pagination, PaginationLimit, ReversibleIterator, ValidatedJson,
+        ValidatedQuery,
     },
     AppState,
 };
@@ -36,14 +37,31 @@ use serde::{Deserialize, Serialize};
 use svix_server_derive::{aide_annotate, ModelIn, ModelOut};
 use validator::Validate;
 
+fn example_event_archived() -> bool {
+    false
+}
+
+fn event_type_description_example() -> &'static str {
+    "A user has signed up"
+}
+
+fn event_type_versioned_schemas_example() -> serde_json::Value {
+    serde_json::json!({ "1": eventtype::schema_example() })
+}
+
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Validate, ModelIn, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct EventTypeIn {
+    #[validate]
     pub name: EventTypeName,
     #[validate(custom = "validate_no_control_characters")]
+    #[schemars(example = "event_type_description_example")]
     pub description: String,
     #[serde(default, rename = "archived")]
+    #[schemars(example = "example_event_archived")]
     pub deleted: bool,
+    /// The schema for the event type for a specific version as a JSON schema.
+    #[schemars(example = "event_type_versioned_schemas_example")]
     pub schemas: Option<eventtype::Schema>,
     #[serde(skip_serializing_if = "Option::is_none")]
     pub feature_flag: Option<FeatureFlag>,
@@ -74,9 +92,13 @@ impl ModelIn for EventTypeIn {
 #[serde(rename_all = "camelCase")]
 struct EventTypeUpdate {
     #[validate(custom = "validate_no_control_characters")]
+    #[schemars(example = "event_type_description_example")]
     description: String,
     #[serde(default, rename = "archived")]
+    #[schemars(example = "example_event_archived")]
     deleted: bool,
+    /// The schema for the event type for a specific version as a JSON schema.
+    #[schemars(example = "event_type_versioned_schemas_example")]
     schemas: Option<eventtype::Schema>,
     #[serde(default, skip_serializing_if = "Option::is_none")]
     feature_flag: Option<FeatureFlag>,
@@ -144,9 +166,13 @@ impl ModelIn for EventTypePatch {
 #[serde(rename_all = "camelCase")]
 pub struct EventTypeOut {
     pub name: EventTypeName,
+    #[schemars(example = "event_type_description_example")]
     pub description: String,
     #[serde(rename = "archived")]
+    #[schemars(example = "example_event_archived", default = "example_event_archived")]
     pub deleted: bool,
+    /// The schema for the event type for a specific version as a JSON schema.
+    #[schemars(example = "event_type_versioned_schemas_example")]
     pub schemas: Option<eventtype::Schema>,
 
     pub created_at: DateTime<Utc>,
@@ -180,7 +206,7 @@ impl From<eventtype::Model> for EventTypeOut {
 }
 
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
-pub struct ListFetchOptions {
+pub struct ListFetchQueryParams {
     #[serde(default)]
     pub include_archived: bool,
     #[serde(default)]
@@ -188,11 +214,11 @@ pub struct ListFetchOptions {
 }
 
 /// Return the list of event types.
-#[aide_annotate(op_id = "list_event_types_api_v1_event_type__get")]
+#[aide_annotate(op_id = "v1.event-type.list")]
 async fn list_event_types(
     State(AppState { ref db, .. }): State<AppState>,
     ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<EventTypeName>>>,
-    fetch_options: ValidatedQuery<ListFetchOptions>,
+    fetch_options: ValidatedQuery<ListFetchQueryParams>,
     permissions::ReadAll {
         org_id,
         feature_flags,
@@ -218,7 +244,7 @@ async fn list_event_types(
         eventtype::Column::Name,
         limit,
         iterator,
-        ListOrdering::Ascending,
+        Ordering::Ascending,
     );
 
     Ok(Json(EventTypeOut::list_response(
@@ -242,7 +268,7 @@ async fn list_event_types(
 /// Unarchiving an event type will allow endpoints to filter on it and messages to be sent with it.
 /// Endpoints filtering on the event type before archival will continue to filter on it.
 /// This operation does not preserve the description and schemas.
-#[aide_annotate(op_id = "create_event_type_api_v1_event_type__post")]
+#[aide_annotate(op_id = "v1.event-type.create")]
 async fn create_event_type(
     State(AppState { ref db, .. }): State<AppState>,
     permissions::Organization { org_id }: permissions::Organization,
@@ -280,7 +306,7 @@ async fn create_event_type(
 }
 
 /// Get an event type.
-#[aide_annotate(op_id = "get_event_type_api_v1_event_type__event_type_name___get")]
+#[aide_annotate(op_id = "v1.event-type.get")]
 async fn get_event_type(
     State(AppState { ref db, .. }): State<AppState>,
     Path(EventTypeNamePath { event_type_name }): Path<EventTypeNamePath>,
@@ -300,7 +326,7 @@ async fn get_event_type(
 }
 
 /// Update an event type.
-#[aide_annotate(op_id = "update_event_type_api_v1_event_type__event_type_name___put")]
+#[aide_annotate(op_id = "v1.event-type.update")]
 async fn update_event_type(
     State(AppState { ref db, .. }): State<AppState>,
     Path(EventTypeNamePath { event_type_name }): Path<EventTypeNamePath>,
@@ -364,12 +390,12 @@ async fn patch_event_type(
 /// However, new messages can not be sent with it and endpoints can not filter on it.
 /// An event type can be unarchived with the
 /// [create operation](#operation/create_event_type_api_v1_event_type__post).
-#[aide_annotate(op_id = "delete_event_type_api_v1_event_type__event_type_name___delete")]
+#[aide_annotate(op_id = "v1.event-type.delete")]
 async fn delete_event_type(
     State(AppState { ref db, .. }): State<AppState>,
     Path(EventTypeNamePath { event_type_name }): Path<EventTypeNamePath>,
     permissions::Organization { org_id }: permissions::Organization,
-) -> Result<JsonStatus<204, EmptyResponse>> {
+) -> Result<NoContent> {
     let evtype = ctx!(
         eventtype::Entity::secure_find_by_name(org_id, event_type_name)
             .one(db)
@@ -380,7 +406,7 @@ async fn delete_event_type(
     let mut evtype: eventtype::ActiveModel = evtype.into();
     evtype.deleted = Set(true);
     ctx!(evtype.update(db).await)?;
-    Ok(JsonStatus(EmptyResponse {}))
+    Ok(NoContent)
 }
 
 const GENERATE_SCHEMA_EXAMPLE_DESCRIPTION: &str =
@@ -471,12 +497,12 @@ pub fn router() -> ApiRouter<AppState> {
 #[cfg(test)]
 mod tests {
 
-    use super::ListFetchOptions;
+    use super::ListFetchQueryParams;
     use serde_json::json;
 
     #[test]
     fn test_list_fetch_options_default() {
-        let l: ListFetchOptions = serde_json::from_value(json!({})).unwrap();
+        let l: ListFetchQueryParams = serde_json::from_value(json!({})).unwrap();
         assert!(!l.include_archived);
         assert!(!l.with_content);
     }
diff --git a/server/svix-server/src/v1/endpoints/health.rs b/server/svix-server/src/v1/endpoints/health.rs
index 9ddeb430a..6584e4e41 100644
--- a/server/svix-server/src/v1/endpoints/health.rs
+++ b/server/svix-server/src/v1/endpoints/health.rs
@@ -3,19 +3,24 @@
 
 use std::time::Duration;
 
-use aide::axum::ApiRouter;
-use axum::{extract::State, http::StatusCode, routing::get, Json};
+use aide::axum::{
+    routing::{get, get_with},
+    ApiRouter,
+};
+use axum::{extract::State, http::StatusCode, Json};
 use sea_orm::{query::Statement, ConnectionTrait, DatabaseBackend};
 use serde::{Deserialize, Serialize};
+use svix_server_derive::aide_annotate;
 
 use crate::{
     core::cache::{kv_def, CacheBehavior, CacheKey, CacheValue},
     queue::QueueTask,
+    v1::utils::{openapi_tag, NoContent},
     AppState,
 };
 
-async fn ping() -> StatusCode {
-    StatusCode::NO_CONTENT
+async fn ping() -> NoContent {
+    NoContent
 }
 
 #[derive(Debug, Deserialize, Serialize)]
@@ -75,6 +80,8 @@ pub struct HealthReport {
 struct HealthCheckCacheValue(());
 kv_def!(HealthCheckCacheKey, HealthCheckCacheValue);
 
+/// Verify the API server is up and running.
+#[aide_annotate(op_id = "v1.health.get")]
 async fn health(
     State(AppState {
         ref db,
@@ -123,7 +130,14 @@ async fn health(
 }
 
 pub fn router() -> ApiRouter<AppState> {
+    let tag = openapi_tag("Health");
+
     ApiRouter::new()
-        .route("/health/ping/", get(ping).head(ping))
-        .route("/health/", get(health).head(health))
+        .api_route("/health/ping/", get(ping).head(ping))
+        .api_route_with(
+            "/health/",
+            get_with(health, |op| op.response::<204, ()>().with(health_operation))
+                .head_with(health, health_operation),
+            tag,
+        )
 }
diff --git a/server/svix-server/src/v1/endpoints/message.rs b/server/svix-server/src/v1/endpoints/message.rs
index 2134b3666..0116f7d92 100644
--- a/server/svix-server/src/v1/endpoints/message.rs
+++ b/server/svix-server/src/v1/endpoints/message.rs
@@ -15,8 +15,8 @@ use crate::{
     queue::MessageTaskBatch,
     v1::utils::{
         apply_pagination_desc, iterator_from_before_or_after, openapi_tag, validation_error,
-        ApplicationMsgPath, EventTypesQuery, JsonStatus, ListResponse, ModelIn, ModelOut,
-        PaginationLimit, ReversibleIterator, ValidatedJson, ValidatedQuery,
+        ApplicationMsgPath, EventTypesQueryParams, JsonStatus, ListResponse, ModelIn, ModelOut,
+        PaginationDescending, PaginationLimit, ReversibleIterator, ValidatedJson, ValidatedQuery,
     },
     AppState,
 };
@@ -36,11 +36,11 @@ use sea_orm::{entity::prelude::*, IntoActiveModel};
 use sea_orm::{sea_query::Expr, ActiveValue::Set};
 use serde::{Deserialize, Serialize};
 
+use serde_json::value::RawValue;
 use svix_server_derive::{aide_annotate, ModelIn, ModelOut};
 use validator::{Validate, ValidationError};
 
 use crate::db::models::message;
-use crate::v1::utils::Pagination;
 
 pub fn validate_channels_msg(
     channels: &EventChannelSet,
@@ -56,38 +56,87 @@ pub fn validate_channels_msg(
     }
 }
 
-pub fn validate_message_in_payload(
-    payload: &serde_json::Value,
+#[derive(Clone, Debug, Deserialize, Serialize)]
+pub struct RawPayload(pub Box<RawValue>);
+
+impl JsonSchema for RawPayload {
+    fn schema_name() -> String {
+        "RawPayload".to_string()
+    }
+
+    fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
+        serde_json::Value::json_schema(gen)
+    }
+
+    fn is_referenceable() -> bool {
+        false
+    }
+}
+
+impl Eq for RawPayload {}
+
+impl PartialEq for RawPayload {
+    fn eq(&self, other: &Self) -> bool {
+        self.0.get() == other.0.get()
+    }
+}
+
+impl RawPayload {
+    pub fn from_string(val: String) -> serde_json::Result<Self> {
+        Ok(Self(RawValue::from_string(val)?))
+    }
+}
+
+pub fn validate_raw_payload_is_object(
+    payload: &RawPayload,
 ) -> std::result::Result<(), ValidationError> {
-    match payload {
-        serde_json::Value::Object(_) => Ok(()),
-        _ => Err(validation_error(
+    // Verify it's an object/map
+    if payload.0.get().starts_with('{') {
+        Ok(())
+    } else {
+        Err(validation_error(
             Some("payload"),
             Some("Payload must be an object."),
-        )),
+        ))
     }
 }
 
 #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, Validate, ModelIn, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageIn {
+    /// Optional unique identifier for the message
     #[validate]
     #[serde(rename = "eventId", skip_serializing_if = "Option::is_none")]
     pub uid: Option<MessageUid>,
     #[validate]
     pub event_type: EventTypeName,
-    #[validate(custom = "validate_message_in_payload")]
+    #[validate(custom = "validate_raw_payload_is_object")]
     #[serde(alias = "payload", alias = "data")]
-    pub payload: serde_json::Value,
+    #[schemars(example = "example_payload")]
+    pub payload: RawPayload,
+    /// List of free-form identifiers that endpoints can filter by
     #[validate(custom = "validate_channels_msg")]
     #[validate]
     #[serde(skip_serializing_if = "Option::is_none")]
+    #[schemars(example = "example_channel_set", length(min = 1, max = 5))]
     pub channels: Option<EventChannelSet>,
     #[validate(range(min = 5, max = 90))]
     #[serde(default = "default_90")]
+    #[schemars(example = "default_90")]
     pub payload_retention_period: i64,
 }
 
+fn example_channel_set() -> Vec<&'static str> {
+    vec!["project_123", "group_2"]
+}
+
+fn example_payload() -> serde_json::Value {
+    serde_json::json!({
+        "email": "test@example.com",
+        "username": "test_user"
+    })
+}
+
 // FIXME: This can and should be a derive macro
 impl ModelIn for MessageIn {
     type ActiveModel = message::ActiveModel;
@@ -104,7 +153,9 @@ impl ModelIn for MessageIn {
         let expiration = Utc::now() + Duration::days(payload_retention_period);
 
         model.uid = Set(uid);
-        model.payload = Set(Some(payload));
+        model.payload = Set(Some(
+            serde_json::from_str(payload.0.get()).expect("It has to be valid"),
+        ));
         model.event_type = Set(event_type);
         model.expiration = Set(expiration.with_timezone(&Utc).into());
         model.channels = Set(channels);
@@ -114,10 +165,14 @@ impl ModelIn for MessageIn {
 #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, ModelOut, JsonSchema)]
 #[serde(rename_all = "camelCase")]
 pub struct MessageOut {
+    /// Optional unique identifier for the message
     #[serde(rename = "eventId")]
     pub uid: Option<MessageUid>,
     pub event_type: EventTypeName,
-    pub payload: serde_json::Value,
+    #[schemars(example = "example_payload")]
+    pub payload: RawPayload,
+    /// List of free-form identifiers that endpoints can filter by
+    #[schemars(length(min = 1, max = 5), example = "example_channel_set")]
     pub channels: Option<EventChannelSet>,
     pub id: MessageId,
     #[serde(rename = "timestamp")]
@@ -127,7 +182,7 @@ pub struct MessageOut {
 impl MessageOut {
     fn without_payload(model: message::Model) -> Self {
         Self {
-            payload: serde_json::json!({}),
+            payload: RawPayload::from_string("{}".to_string()).expect("Can never fail"),
             ..model.into()
         }
     }
@@ -139,10 +194,11 @@ impl From<message::Model> for MessageOut {
         Self {
             uid: model.uid,
             event_type: model.event_type,
-            payload: match model.payload {
-                Some(payload) => payload,
-                None => serde_json::json!({ "expired": true }),
-            },
+            payload: RawPayload::from_string(match model.payload {
+                Some(payload) => serde_json::to_string(&payload).expect("Can never fail"),
+                None => r#"{"expired":true}"#.to_string(),
+            })
+            .expect("Can never fail"),
             channels: model.channels,
             id: model.id,
             created_at: model.created_at.into(),
@@ -174,17 +230,17 @@ pub struct ListMessagesQueryParams {
 /// The `before` parameter lets you filter all items created before a certain date and is ignored if an iterator is passed.
 /// The `after` parameter lets you filter all items created after a certain date and is ignored if an iterator is passed.
 /// `before` and `after` cannot be used simultaneously.
-#[aide_annotate(op_id = "list_messages_api_v1_app__app_id__msg__get")]
+#[aide_annotate(op_id = "v1.message.list")]
 async fn list_messages(
     State(AppState { ref db, .. }): State<AppState>,
-    ValidatedQuery(pagination): ValidatedQuery<Pagination<ReversibleIterator<MessageId>>>,
+    ValidatedQuery(pagination): ValidatedQuery<PaginationDescending<ReversibleIterator<MessageId>>>,
     ValidatedQuery(ListMessagesQueryParams {
         channel,
         with_content,
         before,
         after,
     }): ValidatedQuery<ListMessagesQueryParams>,
-    EventTypesQuery(event_types): EventTypesQuery,
+    EventTypesQueryParams(event_types): EventTypesQueryParams,
     permissions::Application { app }: permissions::Application,
 ) -> Result<Json<ListResponse<MessageOut>>> {
     let PaginationLimit(limit) = pagination.limit;
@@ -235,7 +291,7 @@ pub struct CreateMessageQueryParams {
 /// Messages can also have `channels`, which similar to event types let endpoints filter by them. Unlike event types, messages can have multiple channels, and channels don't imply a specific message content or schema.
 ///
 /// The `payload` property is the webhook's body (the actual webhook message). Svix supports payload sizes of up to ~350kb, though it's generally a good idea to keep webhook payloads small, probably no larger than 40kb.
-#[aide_annotate(op_id = "create_message_api_v1_app__app_id__msg__post")]
+#[aide_annotate(op_id = "v1.message.create")]
 async fn create_message(
     State(AppState {
         ref db,
@@ -301,7 +357,7 @@ pub struct GetMessageQueryParams {
 }
 
 /// Get a message by its ID or eventID.
-#[aide_annotate(op_id = "get_message_api_v1_app__app_id__msg__msg_id___get")]
+#[aide_annotate(op_id = "v1.message.get")]
 async fn get_message(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationMsgPath { msg_id, .. }): Path<ApplicationMsgPath>,
@@ -325,7 +381,7 @@ async fn get_message(
 /// Delete the given message's payload. Useful in cases when a message was accidentally sent with sensitive content.
 ///
 /// The message can't be replayed or resent once its payload has been deleted or expired.
-#[aide_annotate(op_id = "expunge_message_payload_api_v1_app__app_id__msg__msg_id__content__delete")]
+#[aide_annotate(op_id = "v1.message.expunge-content")]
 async fn expunge_message_content(
     State(AppState { ref db, .. }): State<AppState>,
     Path(ApplicationMsgPath { msg_id, .. }): Path<ApplicationMsgPath>,
diff --git a/server/svix-server/src/v1/utils/mod.rs b/server/svix-server/src/v1/utils/mod.rs
index 2858c2601..cf0dbc6e9 100644
--- a/server/svix-server/src/v1/utils/mod.rs
+++ b/server/svix-server/src/v1/utils/mod.rs
@@ -50,6 +50,15 @@ const PAGINATION_LIMIT_CAP_LIMIT: u64 = 250;
 // figure at some point
 const PAGINATION_LIMIT_ERROR: &str = "Given limit must not exceed 250";
 
+#[derive(Debug, Deserialize, Validate, JsonSchema)]
+pub struct PaginationDescending<T: Validate + JsonSchema> {
+    #[validate]
+    #[serde(default = "default_limit")]
+    pub limit: PaginationLimit,
+    #[validate]
+    pub iterator: Option<T>,
+}
+
 #[derive(Debug, Deserialize, Validate, JsonSchema)]
 pub struct Pagination<T: Validate + JsonSchema> {
     #[validate]
@@ -57,10 +66,11 @@ pub struct Pagination<T: Validate + JsonSchema> {
     pub limit: PaginationLimit,
     #[validate]
     pub iterator: Option<T>,
-    pub order: Option<ListOrdering>,
+    pub order: Option<Ordering>,
 }
 
 #[derive(Debug, JsonSchema)]
+#[schemars(transparent)]
 pub struct PaginationLimit(pub u64);
 
 impl<'de> Deserialize<'de> for PaginationLimit {
@@ -138,6 +148,10 @@ impl<T: Validate + JsonSchema> JsonSchema for ReversibleIterator<T> {
     fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
         T::json_schema(gen)
     }
+
+    fn is_referenceable() -> bool {
+        false
+    }
 }
 
 /// For use in creating a [`ReversibleIterator`] from `before` and `after` timestamps should one not
@@ -196,9 +210,9 @@ pub fn apply_pagination<
     sort_column: C,
     limit: u64,
     iterator: Option<ReversibleIterator<I>>,
-    ordering: ListOrdering,
+    ordering: Ordering,
 ) -> Q {
-    use ListOrdering::*;
+    use Ordering::*;
     use ReversibleIterator::*;
 
     let query = query.limit(limit + 1);
@@ -222,10 +236,56 @@ pub fn apply_pagination<
     }
 }
 
+/// A response with no body content and a specific response code, specified by
+/// the generic parameter `N`.
+pub struct NoContentWithCode<const N: u16>;
+
+impl<const N: u16> IntoResponse for NoContentWithCode<N> {
+    fn into_response(self) -> axum::response::Response {
+        (StatusCode::from_u16(N).unwrap(), ()).into_response()
+    }
+}
+
+impl<const N: u16> OperationOutput for NoContentWithCode<N> {
+    type Inner = Self;
+
+    fn operation_response(
+        ctx: &mut aide::gen::GenContext,
+        operation: &mut aide::openapi::Operation,
+    ) -> Option<aide::openapi::Response> {
+        <() as OperationOutput>::operation_response(ctx, operation)
+    }
+
+    fn inferred_responses(
+        ctx: &mut aide::gen::GenContext,
+        operation: &mut aide::openapi::Operation,
+    ) -> Vec<(Option<u16>, aide::openapi::Response)> {
+        if let Some(response) = Self::operation_response(ctx, operation) {
+            vec![(Some(N), response)]
+        } else {
+            vec![]
+        }
+    }
+}
+
+/// A response with no body content and HTTP status code 204, the standard code
+/// for such responses.
+#[derive(OperationIo)]
+#[aide(output_with = "()")]
+pub struct NoContent;
+
+impl IntoResponse for NoContent {
+    fn into_response(self) -> axum::response::Response {
+        NoContentWithCode::<204>::into_response(NoContentWithCode)
+    }
+}
+
 #[derive(Serialize, JsonSchema)]
 pub struct EmptyResponse {}
 
-#[derive(Serialize, Deserialize, Clone, JsonSchema)]
+// If you change the internal representation of this then you must also update
+// it in the `JsonSchema` impl below to match.
+#[derive(Serialize, Deserialize, Clone)]
 #[serde(rename_all = "camelCase")]
 pub struct ListResponse<T> {
     pub data: Vec<T>,
@@ -235,15 +295,53 @@ pub struct ListResponse<T> {
     pub done: bool,
 }
 
+// This custom impl is needed because we want to customize the name of the
+// schema that goes into the spec, but that can only be done by having a custom
+// `JsonSchema` implementation.
+// Tracking issue: https://github.com/GREsau/schemars/issues/193
+impl<T: JsonSchema> JsonSchema for ListResponse<T> {
+    fn schema_name() -> String {
+        let data_type_name = T::schema_name();
+        format!("ListResponse_{data_type_name}_")
+    }
+
+    fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
+        fn example_iterator() -> &'static str {
+            "iterator"
+        }
+
+        fn example_prev_iterator() -> &'static str {
+            "-iterator"
+        }
+
+        // The actual schema generation is still delegated to the derive macro.
+        #[derive(JsonSchema)]
+        #[allow(unused)]
+        #[serde(rename_all = "camelCase")]
+        struct ListResponse<T> {
+            pub data: Vec<T>,
+            #[schemars(example = "example_iterator")]
+            pub iterator: Option<String>,
+            #[serde(skip_serializing_if = "Option::is_none")]
+            #[schemars(example = "example_prev_iterator")]
+            pub prev_iterator: Option<String>,
+            pub done: bool,
+        }
+
+        ListResponse::<T>::json_schema(gen)
+    }
+}
+
 pub trait ModelIn {
     type ActiveModel;
 
     fn update_model(self, model: &mut Self::ActiveModel);
 }
 
+/// Defines the ordering in a listing of results.
 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
 #[serde(rename_all = "camelCase")]
-pub enum ListOrdering {
+pub enum Ordering {
     Ascending,
     Descending,
 }
@@ -452,10 +550,10 @@ impl<T: JsonSchema> OperationInput for ValidatedQuery<T> {
 
 // A special wrapper to handle query parameter lists. serde_qs and serde_urlencode can't
 // handle url query param arrays as flexibly as we need to support in our API
-pub struct EventTypesQuery(pub Option<EventTypeNameSet>);
+pub struct EventTypesQueryParams(pub Option<EventTypeNameSet>);
 
 #[async_trait]
-impl<S> FromRequestParts<S> for EventTypesQuery
+impl<S> FromRequestParts<S> for EventTypesQueryParams
 where
     S: Send + Sync,
 {
@@ -465,13 +563,14 @@ where
         let pairs = form_urlencoded::parse(parts.uri.query().unwrap_or_default().as_bytes());
 
         let event_types: HashSet<EventTypeName> = pairs
-            .filter_map(|(key, value)| {
+            .filter(|(key, _)|
                 // want to handle both `?event_types=`, `?event_types[]=`, and `?event_types[1]=`
-                if key == "event_types" || (key.starts_with("event_types[") && key.ends_with(']')) {
-                    Some(EventTypeName(value.into_owned()))
-                } else {
-                    None
-                }
+                key == "event_types" || (key.starts_with("event_types[") && key.ends_with(']')))
+            .flat_map(|(_, value)| {
+                value
+                    .split(',')
+                    .map(|x| EventTypeName(x.to_owned()))
+                    .collect::<Vec<_>>()
             })
             .collect();
 
@@ -487,7 +586,19 @@ where
     }
 }
 
-impl OperationInput for EventTypesQuery {}
+impl OperationInput for EventTypesQueryParams {
+    fn operation_input(ctx: &mut aide::gen::GenContext, operation: &mut aide::openapi::Operation) {
+        // This struct must match what `EventTypesQuery` would be if we used a
+        // simple `#[derive(Deserialize)]` on it.
+        #[derive(JsonSchema)]
+        struct EventTypesQueryParams {
+            #[allow(unused)]
+            event_types: Option<EventTypeNameSet>,
+        }
+
+        Query::<EventTypesQueryParams>::operation_input(ctx, operation);
+    }
+}
 
 pub async fn api_not_implemented() -> Result<()> {
     Err(HttpError::not_implemented(None, None).into())
diff --git a/server/svix-server/src/v1/utils/patch.rs b/server/svix-server/src/v1/utils/patch.rs
index ef6c1326b..320bfd04d 100644
--- a/server/svix-server/src/v1/utils/patch.rs
+++ b/server/svix-server/src/v1/utils/patch.rs
@@ -191,7 +191,7 @@ impl<T: JsonSchema> JsonSchema for UnrequiredField<T> {
     }
 
     fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
-        Option::<T>::json_schema(gen)
+        gen.subschema_for::<T>()
     }
 }
 
@@ -205,7 +205,7 @@ impl<T: JsonSchema> JsonSchema for UnrequiredNullableField<T> {
     }
 
     fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema {
-        Option::<T>::json_schema(gen)
+        gen.subschema_for::<Option<T>>()
     }
 }
 
diff --git a/server/svix-server/src/worker.rs b/server/svix-server/src/worker.rs
index 25921f1e7..43a396c9d 100644
--- a/server/svix-server/src/worker.rs
+++ b/server/svix-server/src/worker.rs
@@ -7,7 +7,7 @@ use crate::core::cache::{kv_def, Cache, CacheBehavior, CacheKey, CacheValue};
 use crate::core::cryptography::Encryption;
 use crate::core::message_app::{CreateMessageApp, CreateMessageEndpoint};
 use crate::core::operational_webhooks::{
-    EndpointDisabledEvent, MessageAttemptEvent, OperationalWebhook, OperationalWebhookSender,
+    EndpointDisabledEventData, MessageAttemptEvent, OperationalWebhook, OperationalWebhookSender,
 };
 use crate::core::types::{
     ApplicationId, ApplicationUid, BaseId, EndpointHeaders, EndpointId, EndpointSecretInternal,
@@ -19,9 +19,7 @@ use crate::core::webhook_http_client::{
 };
 use crate::db::models::{endpoint, eventtype, message, messageattempt, messagedestination};
 use crate::error::{Error, ErrorType, HttpError, Result};
-use crate::queue::{
-    MessageTask, MessageTaskBatch, QueueTask, TaskQueueConsumer, TaskQueueProducer,
-};
+use crate::queue::{MessageTask, QueueTask, TaskQueueConsumer, TaskQueueProducer};
 use crate::v1::utils::get_unix_timestamp;
 use crate::{ctx, err_cache, err_generic, err_validation};
 
@@ -29,14 +27,14 @@ use chrono::Utc;
 
 use futures::future;
 use http::{HeaderValue, StatusCode, Version};
-use ipnet::IpNet;
 use lazy_static::lazy_static;
 use p256::ecdsa::{signature, Signature};
 use rand::Rng;
 
 use sea_orm::prelude::DateTimeUtc;
 use sea_orm::{
-    ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, QueryFilter, Set, TryIntoModel,
+    ActiveModelBehavior, ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait,
+    QueryFilter, Set, TryIntoModel,
 };
 use serde::{Deserialize, Serialize};
 use tokio::time::sleep;
@@ -284,6 +282,7 @@ struct WorkerContext<'a> {
     db: &'a DatabaseConnection,
     queue_tx: &'a TaskQueueProducer,
     op_webhook_sender: &'a OperationalWebhookSender,
+    webhook_client: &'a WebhookClient,
 }
 
 struct FailedDispatch(messageattempt::ActiveModel, Error);
@@ -365,12 +364,8 @@ async fn make_http_call(
         created_at,
     }: PendingDispatch,
     msg_dest: &messagedestination::Model,
-    whitelist_subnets: &Option<Arc<Vec<IpNet>>>,
+    client: &WebhookClient,
 ) -> Result<CompletedDispatch> {
-    let client = WebhookClient::new(
-        whitelist_subnets.clone(),
-        Some(Arc::new(vec!["backend".to_owned()])),
-    );
     let req = RequestBuilder::new()
         .method(method)
         .uri_str(&url)
@@ -643,7 +638,7 @@ async fn handle_failed_dispatch(
                 op_webhook_sender
                     .send_operational_webhook(
                         org_id,
-                        OperationalWebhook::EndpointDisabled(EndpointDisabledEvent {
+                        OperationalWebhook::EndpointDisabled(EndpointDisabledEventData {
                             app_id: app_id.clone(),
                             app_uid: app_uid.cloned(),
                             endpoint_id: msg_task.endpoint_id.clone(),
@@ -685,24 +680,12 @@ async fn dispatch_message_task(
     msg_task: MessageTask,
     payload: &str,
     endp: CreateMessageEndpoint,
-    msg_dest: Option<messagedestination::Model>,
+    msg_dest: messagedestination::Model,
 ) -> Result<()> {
-    let WorkerContext { cfg, db, .. } = worker_context;
+    let WorkerContext { webhook_client, .. } = worker_context;
 
     tracing::trace!("Dispatch start");
 
-    let msg_dest = if let Some(msg_dest) = msg_dest {
-        msg_dest
-    } else {
-        ctx!(
-            messagedestination::Entity::secure_find_by_msg(msg_task.msg_id.clone())
-                .filter(messagedestination::Column::EndpId.eq(endp.id.clone()))
-                .one(*db)
-                .await
-        )?
-        .ok_or_else(|| err_generic!("Msg dest not found {} {}", msg_task.msg_id, endp.id))?
-    };
-
     if (msg_dest.status != MessageStatus::Pending && msg_dest.status != MessageStatus::Sending)
         && (msg_task.trigger_type != MessageAttemptTriggerType::Manual)
     {
@@ -729,13 +712,7 @@ async fn dispatch_message_task(
     let dispatch = prepare_dispatch(worker_context, dispatch_context.clone()).await?;
     let completed = match dispatch {
         IncompleteDispatch::Pending(pending) => {
-            make_http_call(
-                dispatch_context.clone(),
-                pending,
-                &msg_dest,
-                &cfg.whitelist_subnets,
-            )
-            .await?
+            make_http_call(dispatch_context.clone(), pending, &msg_dest, webhook_client).await?
         }
         IncompleteDispatch::Failed(failed) => CompletedDispatch::Failed(failed),
     };
@@ -812,32 +789,50 @@ async fn process_queue_task_inner(
     queue_task: QueueTask,
 ) -> Result<()> {
     let WorkerContext { db, cache, .. }: WorkerContext<'_> = worker_context;
+    let span = tracing::Span::current();
 
-    if queue_task == QueueTask::HealthCheck {
-        return Ok(());
-    }
+    let (msg, force_endpoint, destination, trigger_type, attempt_count) = match queue_task {
+        QueueTask::HealthCheck => return Ok(()),
+        QueueTask::MessageV1(task) => {
+            let msg = ctx!(
+                message::Entity::find_by_id(task.msg_id.clone())
+                    .one(db)
+                    .await
+            )?
+            .ok_or_else(|| err_generic!("Unexpected: message doesn't exist"))?;
 
-    let span = tracing::Span::current();
+            let destination = ctx!(
+                messagedestination::Entity::secure_find_by_msg(task.msg_id.clone())
+                    .filter(messagedestination::Column::EndpId.eq(task.endpoint_id.clone()))
+                    .one(db)
+                    .await
+            )?
+            .ok_or_else(|| {
+                err_generic!(format!(
+                    "MessageDestination not found for message {}",
+                    &task.msg_id
+                ))
+            })?;
 
-    let (msg_id, trigger_type) = match &queue_task {
-        QueueTask::MessageBatch(MessageTaskBatch {
-            msg_id,
-            trigger_type,
-            ..
-        }) => (msg_id, trigger_type),
-        QueueTask::MessageV1(MessageTask {
-            msg_id,
-            trigger_type,
-            ..
-        }) => (msg_id, trigger_type),
-
-        QueueTask::HealthCheck => unreachable!(),
+            (
+                msg,
+                Some(task.endpoint_id),
+                Some(destination),
+                task.trigger_type,
+                task.attempt_count,
+            )
+        }
+        QueueTask::MessageBatch(task) => {
+            let msg = ctx!(message::Entity::find_by_id(task.msg_id).one(db).await)?
+                .ok_or_else(|| err_generic!("Unexpected: message doesn't exist"))?;
+            (msg, None, None, task.trigger_type, 0)
+        }
     };
 
-    span.record("msg_id", &msg_id.0);
+    span.record("msg_id", &msg.id.0);
+    span.record("app_id", &msg.app_id.0);
+    span.record("org_id", &msg.org_id.0);
 
-    let msg = ctx!(message::Entity::find_by_id(msg_id.clone()).one(db).await)?
-        .ok_or_else(|| err_generic!("Unexpected: message doesn't exist"))?;
     let payload = match msg
         .payload
         .as_ref()
@@ -850,9 +845,6 @@ async fn process_queue_task_inner(
         }
     };
 
-    span.record("app_id", &msg.app_id.0);
-    span.record("org_id", &msg.org_id.0);
-
     let create_message_app = match CreateMessageApp::layered_fetch(
         cache,
         db,
@@ -871,52 +863,18 @@ async fn process_queue_task_inner(
     };
 
     let endpoints: Vec<CreateMessageEndpoint> = create_message_app
-        .filtered_endpoints(*trigger_type, &msg.event_type, msg.channels.as_ref())
+        .filtered_endpoints(trigger_type, &msg.event_type, msg.channels.as_ref())
         .iter()
-        .filter(|endpoint| match &queue_task {
-            QueueTask::HealthCheck => unreachable!(),
-            QueueTask::MessageV1(task) => task.endpoint_id == endpoint.id,
-            QueueTask::MessageBatch(_) => true,
+        .filter(|endpoint| match force_endpoint.as_ref() {
+            Some(endp_id) => endp_id == &endpoint.id,
+            None => true,
         })
         .cloned()
         .collect();
 
-    let futures: Vec<_> = match &queue_task {
-        QueueTask::HealthCheck => unreachable!(),
-
-        QueueTask::MessageV1(task) => {
-            let endpoint = match endpoints.into_iter().next() {
-                Some(ep) => ep,
-                None => {
-                    return Ok(());
-                }
-            };
-
-            let destination = ctx!(
-                messagedestination::Entity::secure_find_by_msg(task.msg_id.clone())
-                    .filter(messagedestination::Column::EndpId.eq(endpoint.id.clone()))
-                    .one(db)
-                    .await
-            )?
-            .ok_or_else(|| {
-                err_generic!(format!(
-                    "MessageDestination not found for message {}",
-                    &task.msg_id
-                ))
-            })?;
-
-            vec![dispatch_message_task(
-                &worker_context,
-                &msg,
-                &create_message_app,
-                task.clone(),
-                &payload,
-                endpoint,
-                Some(destination),
-            )]
-        }
-
-        QueueTask::MessageBatch(task) => {
+    let destinations = match destination {
+        Some(d) => vec![d],
+        None => {
             let destinations: Vec<_> = endpoints
                 .iter()
                 .map(|endpoint| messagedestination::ActiveModel {
@@ -924,7 +882,7 @@ async fn process_queue_task_inner(
                     endp_id: Set(endpoint.id.clone()),
                     next_attempt: Set(Some(Utc::now().into())),
                     status: Set(MessageStatus::Sending),
-                    ..Default::default()
+                    ..messagedestination::ActiveModel::new()
                 })
                 .collect();
 
@@ -934,32 +892,37 @@ async fn process_queue_task_inner(
                     .await
             )?;
 
-            endpoints
+            let dests: std::result::Result<_, _> = destinations
                 .into_iter()
-                .zip(destinations)
-                .map(|(endpoint, destination)| {
-                    let task = MessageTask {
-                        msg_id: msg_id.clone(),
-                        app_id: task.app_id.clone(),
-                        endpoint_id: endpoint.id.clone(),
-                        attempt_count: 0,
-                        trigger_type: *trigger_type,
-                    };
-
-                    dispatch_message_task(
-                        &worker_context,
-                        &msg,
-                        &create_message_app,
-                        task,
-                        &payload,
-                        endpoint,
-                        destination.try_into_model().ok(),
-                    )
-                })
-                .collect()
+                .map(|d| d.try_into_model())
+                .collect();
+            ctx!(dests)?
         }
     };
 
+    let futures = endpoints
+        .into_iter()
+        .zip(destinations)
+        .map(|(endpoint, destination)| {
+            let task = MessageTask {
+                msg_id: msg.id.clone(),
+                app_id: create_message_app.id.clone(),
+                endpoint_id: endpoint.id.clone(),
+                attempt_count,
+                trigger_type,
+            };
+
+            dispatch_message_task(
+                &worker_context,
+                &msg,
+                &create_message_app,
+                task,
+                &payload,
+                endpoint,
+                destination,
+            )
+        });
+
     let join = future::join_all(futures).await;
 
     let errs: Vec<_> = join.iter().filter(|x| x.is_err()).collect();
@@ -999,6 +962,11 @@ pub async fn queue_handler(
         tracing::info!("Worker concurrent task limit: {}", task_limit);
     }
 
+    let webhook_client = WebhookClient::new(
+        cfg.whitelist_subnets.clone(),
+        Some(Arc::new(vec!["backend".to_owned()])),
+    );
+
     tokio::spawn(
         async move {
             let mut interval = tokio::time::interval(Duration::from_millis(500));
@@ -1054,6 +1022,7 @@ pub async fn queue_handler(
                     let queue_tx = queue_tx.clone();
                     let queue_task = delivery.task.clone();
                     let op_webhook_sender = op_webhook_sender.clone();
+                    let webhook_client = webhook_client.clone();
 
                     tokio::spawn(async move {
                         NUM_WORKERS.fetch_add(1, Ordering::Relaxed);
@@ -1063,6 +1032,7 @@ pub async fn queue_handler(
                             cache: &cache,
                             op_webhook_sender: &op_webhook_sender,
                             queue_tx: &queue_tx,
+                            webhook_client: &webhook_client,
                         };
 
                         let queue_task =
@@ -1071,13 +1041,13 @@ pub async fn queue_handler(
                             .await
                             .is_err()
                         {
-                            if let Err(err) = queue_tx.nack(delivery).await {
+                            if let Err(err) = delivery.nack().await {
                                 tracing::error!(
                                     "Error sending 'nack' to Redis after task execution error: {}",
                                     err
                                 );
                             }
-                        } else if let Err(err) = queue_tx.ack(delivery).await {
+                        } else if let Err(err) = delivery.ack().await {
                             tracing::error!(
                                 "Error sending 'ack' to Redis after successful task execution: {}",
                                 err
diff --git a/server/svix-server_derive/src/lib.rs b/server/svix-server_derive/src/lib.rs
index e45ded46e..c7992361e 100644
--- a/server/svix-server_derive/src/lib.rs
+++ b/server/svix-server_derive/src/lib.rs
@@ -188,6 +188,24 @@ pub fn aide_annotate(
                 .id(#operation_id)
                 .summary(#operation_summary)
                 .description(#description)
+                .response_with::<401, ::axum::Json<crate::error::StandardHttpError>, _>(|op| {
+                    op.description("Unauthorized")
+                })
+                .response_with::<403, ::axum::Json<crate::error::StandardHttpError>, _>(|op| {
+                    op.description("Forbidden")
+                })
+                .response_with::<404, ::axum::Json<crate::error::StandardHttpError>, _>(|op| {
+                    op.description("Not Found")
+                })
+                .response_with::<409, ::axum::Json<crate::error::StandardHttpError>, _>(|op| {
+                    op.description("Conflict")
+                })
+                .response_with::<422, ::axum::Json<crate::error::ValidationHttpError>, _>(|op| {
+                    op.description("Validation Error")
+                })
+                .response_with::<429, ::axum::Json<crate::error::StandardHttpError>, _>(|op| {
+                    op.description("Too Many Requests")
+                })
         }
     };
     proc_macro::TokenStream::from(out)
diff --git a/yarn.lock b/yarn.lock
index d5bcd3e83..6a4112fb8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,28 +2,38 @@
 # yarn lockfile v1
 
 
-"@nestjs/common@8.2.3":
-  version "8.2.3"
-  resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-8.2.3.tgz#77ac1ef59c36dd9ae131f5c5ddabfc6258802d1c"
-  integrity sha512-slXVVMc9tZG6ZaARXkTUsSqZbkEcc0hVKb4mPLxS9mjXmDspUleGQakZ5OzniiEWqzO299BVlEbm6TGyoGbpNg==
+"@lukeed/csprng@^1.0.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@lukeed/csprng/-/csprng-1.1.0.tgz#1e3e4bd05c1cc7a0b2ddbd8a03f39f6e4b5e6cfe"
+  integrity sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==
+
+"@nestjs/axios@0.0.8":
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/@nestjs/axios/-/axios-0.0.8.tgz#4e321e36b6bc3ab0f02d80bafe04ae39edfdcacf"
+  integrity sha512-oJyfR9/h9tVk776il0829xyj3b2e81yTu6HjPraxynwNtMNGqZBHHmAQL24yMB3tVbBM0RvG3eUXH8+pRCGwlg==
+  dependencies:
+    axios "0.27.2"
+
+"@nestjs/common@9.3.11":
+  version "9.3.11"
+  resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-9.3.11.tgz#95a54a2dd0fec0a7abc1edba793c53a53b59c783"
+  integrity sha512-IFZ2G/5UKWC2Uo7tJ4SxGed2+aiA+sJyWeWsGTogKVDhq90oxVBToh+uCDeI31HNUpqYGoWmkletfty42zUd8A==
   dependencies:
-    axios "0.24.0"
+    uid "2.0.1"
     iterare "1.2.1"
-    tslib "2.3.1"
-    uuid "8.3.2"
+    tslib "2.5.0"
 
-"@nestjs/core@8.2.3":
-  version "8.2.3"
-  resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-8.2.3.tgz#26fb3858df586b00362d1bd492ba432698590d67"
-  integrity sha512-CP/Z+uTEdblTZQXRf+xvZHvESZ6v2vxX/YaRcpJDv/ytgxxOafmOJ/RDKSzNOGBkt8kVwYNFpWXzzll4P5AJ0g==
+"@nestjs/core@9.3.11":
+  version "9.3.11"
+  resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-9.3.11.tgz#1be65db0e889f8f12b87aec12c9cf66ea6043205"
+  integrity sha512-CI27a2JFd5rvvbgkalWqsiwQNhcP4EAG5BUK8usjp29wVp1kx30ghfBT8FLqIgmkRVo65A0IcEnWsxeXMntkxQ==
   dependencies:
+    uid "2.0.1"
     "@nuxtjs/opencollective" "0.3.2"
     fast-safe-stringify "2.1.1"
     iterare "1.2.1"
-    object-hash "2.2.0"
     path-to-regexp "3.2.0"
-    tslib "2.3.1"
-    uuid "8.3.2"
+    tslib "2.5.0"
 
 "@nuxtjs/opencollective@0.3.2":
   version "0.3.2"
@@ -34,25 +44,26 @@
     consola "^2.15.0"
     node-fetch "^2.6.1"
 
-"@openapitools/openapi-generator-cli@^2.4.18":
-  version "2.4.18"
-  resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.4.18.tgz#00864c64eab7edad769039cd282d377ddb51a8dd"
-  integrity sha512-43qJVsQh0uqAkwciuuOZr5ckWqebxxKm5I1K3T6D7NCXL8RG7ssKH0vmkk37Gi4OAW58wgFuuzN+1l9xm4ga6g==
+"@openapitools/openapi-generator-cli@^2.6.0":
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-2.6.0.tgz#5e4afad66394b4ab907847c454066ac37608644c"
+  integrity sha512-M/aOpR7G+Y1nMf+ofuar8pGszajgfhs1aSPSijkcr2tHTxKAI3sA3YYcOGbszxaNRKFyvOcDq+KP9pcJvKoCHg==
   dependencies:
-    "@nestjs/common" "8.2.3"
-    "@nestjs/core" "8.2.3"
+    "@nestjs/axios" "0.0.8"
+    "@nestjs/common" "9.3.11"
+    "@nestjs/core" "9.3.11"
     "@nuxtjs/opencollective" "0.3.2"
     chalk "4.1.2"
     commander "8.3.0"
-    compare-versions "3.6.0"
-    concurrently "6.4.0"
+    compare-versions "4.1.4"
+    concurrently "6.5.1"
     console.table "0.10.0"
-    fs-extra "10.0.0"
+    fs-extra "10.1.0"
     glob "7.1.6"
-    inquirer "8.2.0"
+    inquirer "8.2.5"
     lodash "4.17.21"
     reflect-metadata "0.1.13"
-    rxjs "7.4.0"
+    rxjs "7.8.0"
     tslib "2.0.3"
 
 ajv-formats@2.1.1:
@@ -113,12 +124,18 @@ async@3.2.1:
   resolved "https://registry.yarnpkg.com/async/-/async-3.2.1.tgz#d3274ec66d107a47476a4c49136aacdb00665fc8"
   integrity sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==
 
-axios@0.24.0:
-  version "0.24.0"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
-  integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+axios@0.27.2:
+  version "0.27.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+  integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
   dependencies:
-    follow-redirects "^1.14.4"
+    follow-redirects "^1.14.9"
+    form-data "^4.0.0"
 
 axios@^0.26.1:
   version "0.26.1"
@@ -237,6 +254,13 @@ color-name@~1.1.4:
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
   integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
 
+combined-stream@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
 commander@2.20.3:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -247,10 +271,10 @@ commander@8.3.0:
   resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
   integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
 
-compare-versions@3.6.0:
-  version "3.6.0"
-  resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.6.0.tgz#1a5689913685e5a87637b8d3ffca75514ec41d62"
-  integrity sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==
+compare-versions@4.1.4:
+  version "4.1.4"
+  resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-4.1.4.tgz#3571f4d610924d4414846a4183d386c8f3d51112"
+  integrity sha512-FemMreK9xNyL8gQevsdRMrvO4lFCkQP7qbuktn1q8ndcNk1+0mz7lgE7b/sNvbhVgY4w6tMN1FDp6aADjqw2rw==
 
 compute-gcd@^1.2.1:
   version "1.2.1"
@@ -276,10 +300,10 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
 
-concurrently@6.4.0:
-  version "6.4.0"
-  resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.4.0.tgz#5387ee86be435a0eb51c292ade8a00acf479f170"
-  integrity sha512-HZ3D0RTQMH3oS4gvtYj1P+NBc6PzE2McEra6yEFcQKrUQ9HvtTGU4Dbne083F034p+LRb7kWU0tPRNvSGs1UCQ==
+concurrently@6.5.1:
+  version "6.5.1"
+  resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-6.5.1.tgz#4518c67f7ac680cf5c34d5adf399a2a2047edc8c"
+  integrity sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==
   dependencies:
     chalk "^4.1.0"
     date-fns "^2.16.1"
@@ -319,6 +343,11 @@ defaults@^1.0.3:
   dependencies:
     clone "^1.0.2"
 
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
 easy-table@1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.1.0.tgz#86f9ab4c102f0371b7297b92a651d5824bc8cb73"
@@ -390,20 +419,29 @@ find-up@^4.1.0:
     locate-path "^5.0.0"
     path-exists "^4.0.0"
 
-follow-redirects@^1.14.4:
-  version "1.14.8"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
-  integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
-
 follow-redirects@^1.14.8:
   version "1.14.9"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7"
   integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==
 
-fs-extra@10.0.0:
-  version "10.0.0"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
-  integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==
+follow-redirects@^1.14.9:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
+  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
+fs-extra@10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+  integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
   dependencies:
     graceful-fs "^4.2.0"
     jsonfile "^6.0.1"
@@ -483,10 +521,10 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4:
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
 
-inquirer@8.2.0:
-  version "8.2.0"
-  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.0.tgz#f44f008dd344bbfc4b30031f45d984e034a3ac3a"
-  integrity sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==
+inquirer@8.2.5:
+  version "8.2.5"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8"
+  integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==
   dependencies:
     ansi-escapes "^4.2.1"
     chalk "^4.1.1"
@@ -498,10 +536,11 @@ inquirer@8.2.0:
     mute-stream "0.0.8"
     ora "^5.4.1"
     run-async "^2.4.0"
-    rxjs "^7.2.0"
+    rxjs "^7.5.5"
     string-width "^4.1.0"
     strip-ansi "^6.0.0"
     through "^2.3.6"
+    wrap-ansi "^7.0.0"
 
 is-fullwidth-code-point@^3.0.0:
   version "3.0.0"
@@ -598,6 +637,11 @@ mime-db@1.48.0:
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
   integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
 
+mime-db@1.52.0:
+  version "1.52.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
 mime-format@2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/mime-format/-/mime-format-2.0.1.tgz#1274876d58bc803332427a515f5f7036e07b9413"
@@ -612,6 +656,13 @@ mime-types@2.1.31:
   dependencies:
     mime-db "1.48.0"
 
+mime-types@^2.1.12:
+  version "2.1.35"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+  dependencies:
+    mime-db "1.52.0"
+
 mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -662,11 +713,6 @@ oas-resolver-browser@2.5.2:
     yaml "^1.10.0"
     yargs "^15.3.1"
 
-object-hash@2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
-  integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
-
 once@^1.3.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -833,12 +879,12 @@ run-async@^2.4.0:
   resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
   integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
 
-rxjs@7.4.0, rxjs@^7.2.0:
-  version "7.4.0"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.4.0.tgz#a12a44d7eebf016f5ff2441b87f28c9a51cebc68"
-  integrity sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==
+rxjs@7.8.0:
+  version "7.8.0"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
+  integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==
   dependencies:
-    tslib "~2.1.0"
+    tslib "^2.1.0"
 
 rxjs@^6.6.3:
   version "6.6.7"
@@ -847,6 +893,13 @@ rxjs@^6.6.3:
   dependencies:
     tslib "^1.9.0"
 
+rxjs@^7.5.5:
+  version "7.8.1"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
+  integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
+  dependencies:
+    tslib "^2.1.0"
+
 safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -948,26 +1001,33 @@ tslib@2.0.3:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.3.tgz#8e0741ac45fc0c226e58a17bfc3e64b9bc6ca61c"
   integrity sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==
 
-tslib@2.3.1:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01"
-  integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==
+tslib@2.5.0:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
+  integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
 
 tslib@^1.9.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
 
-tslib@~2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
-  integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
+tslib@^2.1.0:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338"
+  integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==
 
 type-fest@^0.21.3:
   version "0.21.3"
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
   integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
 
+uid@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/uid/-/uid-2.0.1.tgz#a3f57c962828ea65256cd622fc363028cdf4526b"
+  integrity sha512-PF+1AnZgycpAIEmNtjxGBVmKbZAQguaa4pBUq6KNaGEcpzZ2klCNZLM34tsjp76maN00TttiiUf6zkIBpJQm2A==
+  dependencies:
+    "@lukeed/csprng" "^1.0.0"
+
 universalify@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"


Test patch:
diff --git a/bridge/run-tests.sh b/bridge/run-tests.sh
new file mode 100755
index 000000000..9c988e95a
--- /dev/null
+++ b/bridge/run-tests.sh
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+
+AWS_DEFAULT_REGION="elasticmq" \
+AWS_ACCESS_KEY_ID="x" \
+AWS_SECRET_ACCESS_KEY="x" \
+PUBSUB_EMULATOR_HOST=localhost:8085 \
+PUBSUB_PROJECT_ID=local-project \
+cargo test --all-features -- "$@"
diff --git a/bridge/svix-bridge-plugin-queue/tests/gcp_pubsub_consumer.rs b/bridge/svix-bridge-plugin-queue/tests/gcp_pubsub_consumer.rs
new file mode 100644
index 000000000..2c357fb0b
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/tests/gcp_pubsub_consumer.rs
@@ -0,0 +1,426 @@
+//! Use the `testing-docker-compose.yml` in the repo root to run the dependencies for testing,
+//! including the gcloud pubsub emulator.
+//!
+//! Use `run-tests.sh` to use the requisite environment for testing.
+
+use google_cloud_googleapis::pubsub::v1::{DeadLetterPolicy, PubsubMessage};
+use google_cloud_pubsub::client::{Client, ClientConfig};
+use google_cloud_pubsub::subscription::{Subscription, SubscriptionConfig};
+use google_cloud_pubsub::topic::Topic;
+use std::time::Duration;
+
+use serde_json::json;
+use svix_bridge_plugin_queue::{
+    config::GCPPubSubInputOpts, CreateMessageRequest, GCPPubSubConsumerPlugin,
+};
+use svix_bridge_types::{
+    svix::api::MessageIn, JsReturn, SenderInput, SenderOutputOpts, SvixOptions,
+    SvixSenderOutputOpts, TransformerJob,
+};
+use wiremock::matchers::{body_partial_json, method};
+use wiremock::{Mock, MockServer, ResponseTemplate};
+
+const DEFAULT_PUBSUB_EMULATOR_HOST: &str = "localhost:8085";
+
+fn get_test_plugin(
+    svix_url: String,
+    subscription_id: String,
+    use_transformation: bool,
+) -> GCPPubSubConsumerPlugin {
+    GCPPubSubConsumerPlugin::new(
+        "test".into(),
+        GCPPubSubInputOpts {
+            subscription_id,
+            credentials_file: None,
+        },
+        if use_transformation {
+            // The actual script doesn't matter since the test case will be performing the
+            // transformation, not the actual JS executor.
+            Some(String::from("function handle(x) { return x; }"))
+        } else {
+            None
+        },
+        SenderOutputOpts::Svix(SvixSenderOutputOpts {
+            token: "xxxx".to_string(),
+            options: Some(SvixOptions {
+                server_url: Some(svix_url),
+                ..Default::default()
+            }),
+        }),
+    )
+}
+
+async fn mq_connection() -> Client {
+    // The `Default` impl for `ClientConfig` looks for this env var. When set it branches for
+    // local-mode use using the addr in the env var and a hardcoded project id of `local-project`.
+    if std::env::var("PUBSUB_EMULATOR_HOST").is_err() {
+        std::env::set_var("PUBSUB_EMULATOR_HOST", DEFAULT_PUBSUB_EMULATOR_HOST);
+    }
+    Client::new(ClientConfig::default()).await.unwrap()
+}
+
+fn random_chars() -> impl Iterator<Item = char> {
+    std::iter::repeat_with(fastrand::alphanumeric)
+}
+
+async fn create_test_queue(client: &Client) -> (Topic, Subscription) {
+    let topic_name: String = "topic-".chars().chain(random_chars().take(8)).collect();
+    // Need to define a dead letter topic to avoid the "bad" test cases from pulling the nacked
+    // messages again and again.
+    let dead_letter_topic_name: String = "topic-".chars().chain(random_chars().take(8)).collect();
+    let subscription_name: String = "subscription-"
+        .chars()
+        .chain(random_chars().take(8))
+        .collect();
+
+    let topic = client.create_topic(&topic_name, None, None).await.unwrap();
+    let dead_letter_topic = client
+        .create_topic(&dead_letter_topic_name, None, None)
+        .await
+        .unwrap();
+    let subscription = client
+        .create_subscription(
+            &subscription_name,
+            &topic_name,
+            SubscriptionConfig {
+                // Messages published to the topic need to supply a unique ID to make use of this
+                enable_exactly_once_delivery: true,
+                dead_letter_policy: Some(DeadLetterPolicy {
+                    dead_letter_topic: dead_letter_topic.fully_qualified_name().into(),
+                    max_delivery_attempts: MAX_DELIVERY_ATTEMPTS,
+                }),
+                ..Default::default()
+            },
+            None,
+        )
+        .await
+        .unwrap();
+
+    (topic, subscription)
+}
+
+async fn publish(topic: &Topic, payload: &str) {
+    let publisher = topic.new_publisher(None);
+    let awaiter = publisher
+        .publish(PubsubMessage {
+            data: payload.to_owned().into_bytes(),
+            message_id: random_chars().take(6).collect(),
+            ..Default::default()
+        })
+        .await;
+    awaiter.get().await.unwrap();
+}
+
+/// General "pause while we wait for messages to travel" beat. If you're seeing flakes, bump this up.
+const WAIT_MS: u64 = 100;
+/// Controls how many times a message can be nack'd before it lands on the dead letter topic.
+const MAX_DELIVERY_ATTEMPTS: i32 = 5;
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request.
+#[tokio::test]
+async fn test_consume_ok() {
+    let client = mq_connection().await;
+    let (topic, subscription) = create_test_queue(&client).await;
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            "hi": "there",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), subscription.id(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&topic, &serde_json::to_string(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+
+    subscription.delete(None).await.ok();
+    topic.delete(None).await.ok();
+}
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request, but this time transform the payload.
+#[tokio::test]
+async fn test_consume_transformed_ok() {
+    let client = mq_connection().await;
+    let (topic, subscription) = create_test_queue(&client).await;
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        // The transformed bit of the payload
+        .and(body_partial_json(json!({ "payload": { "good": "bye" } })))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            // The adjustment made via the transformation...
+            "good": "bye",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let mut plugin = get_test_plugin(mock_server.uri(), subscription.id(), true);
+    let (transformer_tx, mut transformer_rx) =
+        tokio::sync::mpsc::unbounded_channel::<TransformerJob>();
+    let _handle = tokio::spawn(async move {
+        while let Some(x) = transformer_rx.recv().await {
+            let mut out = x.payload;
+            // Prune out the "hi" key.
+            out["message"]["payload"]
+                .as_object_mut()
+                .unwrap()
+                .remove("hi");
+            // Add the "good" key.
+            out["message"]["payload"]["good"] = json!("bye");
+            x.callback_tx.send(Ok(JsReturn::Object(out))).ok();
+        }
+    });
+    plugin.set_transformer(Some(transformer_tx));
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&topic, &serde_json::to_string(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+
+    subscription.delete(None).await.ok();
+    topic.delete(None).await.ok();
+}
+
+#[tokio::test]
+async fn test_missing_app_id_nack() {
+    let client = mq_connection().await;
+    let (topic, subscription) = create_test_queue(&client).await;
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), subscription.id(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &topic,
+        &serde_json::to_string(&json!({
+            // No app id
+            "message": {
+                "eventType": "testing.things",
+                "payload": {
+                    "hi": "there",
+                }
+            },
+
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+
+    subscription.delete(None).await.ok();
+    topic.delete(None).await.ok();
+}
+
+#[tokio::test]
+async fn test_missing_event_type_nack() {
+    let client = mq_connection().await;
+    let (topic, subscription) = create_test_queue(&client).await;
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), subscription.id(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &topic,
+        &serde_json::to_string(&json!({
+            "app_id": "app_1234",
+            "message": {
+                // No event type
+                "payload": {
+                    "hi": "there",
+                }
+            },
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+
+    subscription.delete(None).await.ok();
+    topic.delete(None).await.ok();
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix
+#[tokio::test]
+async fn test_consume_svix_503() {
+    let client = mq_connection().await;
+    let (topic, subscription) = create_test_queue(&client).await;
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(503))
+        .named("create_message")
+        // N.b. this test case is different than other backend flavors of these since there's a
+        // minimum of 5 delivery attempts made before messages are forwarded to the dead letter topic.
+        // In other cases this can happen immediately, but not with gcp pubsub.
+        .up_to_n_times(MAX_DELIVERY_ATTEMPTS.try_into().unwrap())
+        .expect(1..);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), subscription.id(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &topic,
+        &serde_json::to_string(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+
+    subscription.delete(None).await.ok();
+    topic.delete(None).await.ok();
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix because idk, the servers are all offline??
+#[tokio::test]
+async fn test_consume_svix_offline() {
+    let client = mq_connection().await;
+    let (topic, subscription) = create_test_queue(&client).await;
+
+    let mock_server = MockServer::start().await;
+
+    let plugin = get_test_plugin(mock_server.uri(), subscription.id(), false);
+
+    // bye-bye svix...
+    drop(mock_server);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &topic,
+        &serde_json::to_string(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+
+    subscription.delete(None).await.ok();
+    topic.delete(None).await.ok();
+}
diff --git a/bridge/svix-bridge-plugin-queue/tests/rabbitmq_consumer.rs b/bridge/svix-bridge-plugin-queue/tests/rabbitmq_consumer.rs
new file mode 100644
index 000000000..00015271e
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/tests/rabbitmq_consumer.rs
@@ -0,0 +1,422 @@
+//! Requires a rabbitmq node to be running on localhost:5672 (the default port) and using the
+//! default guest/guest credentials.
+//! Try using the `testing-docker-compose.yml` in the repo root to get this going.
+
+use generic_queue::rabbitmq::FieldTable;
+use lapin::{options::QueueDeclareOptions, Channel, Connection, ConnectionProperties, Queue};
+use serde_json::json;
+use std::time::Duration;
+use svix_bridge_plugin_queue::{
+    config::RabbitMqInputOpts, CreateMessageRequest, RabbitMqConsumerPlugin,
+};
+use svix_bridge_types::{
+    svix::api::MessageIn, JsReturn, SenderInput, SenderOutputOpts, SvixOptions,
+    SvixSenderOutputOpts, TransformerJob,
+};
+use wiremock::matchers::{body_partial_json, method};
+use wiremock::{Mock, MockServer, ResponseTemplate};
+
+fn get_test_plugin(
+    svix_url: String,
+    mq_uri: &str,
+    queue_name: &str,
+    use_transformation: bool,
+) -> RabbitMqConsumerPlugin {
+    RabbitMqConsumerPlugin::new(
+        "test".into(),
+        RabbitMqInputOpts {
+            uri: mq_uri.to_string(),
+            queue_name: queue_name.to_string(),
+            consumer_tag: None,
+            consume_opts: None,
+            consume_args: None,
+            requeue_on_nack: false,
+        },
+        if use_transformation {
+            // The actual script doesn't matter since the test case will be performing the
+            // transformation, not the actual JS executor.
+            Some(String::from("function handle(x) { return x; }"))
+        } else {
+            None
+        },
+        SenderOutputOpts::Svix(SvixSenderOutputOpts {
+            token: "xxxx".to_string(),
+            options: Some(SvixOptions {
+                server_url: Some(svix_url),
+                ..Default::default()
+            }),
+        }),
+    )
+}
+
+async fn declare_queue(name: &str, channel: &Channel) -> Queue {
+    channel
+        .queue_declare(
+            name,
+            QueueDeclareOptions {
+                auto_delete: true,
+                ..Default::default()
+            },
+            FieldTable::default(),
+        )
+        .await
+        .unwrap()
+}
+
+async fn mq_connection(uri: &str) -> Connection {
+    let options = ConnectionProperties::default()
+        .with_connection_name("test".into())
+        .with_executor(tokio_executor_trait::Tokio::current())
+        .with_reactor(tokio_reactor_trait::Tokio);
+    Connection::connect(uri, options).await.unwrap()
+}
+
+async fn publish(channel: &Channel, queue_name: &str, payload: &[u8]) {
+    let confirm = channel
+        .basic_publish(
+            "",
+            queue_name,
+            Default::default(),
+            payload,
+            Default::default(),
+        )
+        .await
+        .unwrap();
+    confirm.await.unwrap();
+}
+
+/// General "pause while we wait for messages to travel" beat. If you're seeing flakes, bump this up.
+const WAIT_MS: u64 = 200;
+/// These tests assume a "vanilla" rabbitmq instance, using the default port, creds, exchange...
+const MQ_URI: &str = "amqp://guest:guest@localhost:5672/%2f";
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request.
+#[tokio::test]
+async fn test_consume_ok() {
+    let mq_conn = mq_connection(MQ_URI).await;
+    let channel = mq_conn.create_channel().await.unwrap();
+    // setup the queue before running the consumer or the consumer will error out
+    let queue = declare_queue("", &channel).await;
+    let queue_name = queue.name().as_str();
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            "hi": "there",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), MQ_URI, queue_name, false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&channel, queue_name, &serde_json::to_vec(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+    channel
+        .queue_delete(queue_name, Default::default())
+        .await
+        .ok();
+}
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request, but this time transform the payload.
+#[tokio::test]
+async fn test_consume_transformed_ok() {
+    let mq_conn = mq_connection(MQ_URI).await;
+    let channel = mq_conn.create_channel().await.unwrap();
+    // setup the queue before running the consumer or the consumer will error out
+    let queue = declare_queue("", &channel).await;
+    let queue_name = queue.name().as_str();
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .and(body_partial_json(json!({ "payload": { "good": "bye" } })))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            // The adjustment made via the transformation...
+            "good": "bye",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let mut plugin = get_test_plugin(mock_server.uri(), MQ_URI, queue_name, true);
+    let (transformer_tx, mut transformer_rx) =
+        tokio::sync::mpsc::unbounded_channel::<TransformerJob>();
+    let _handle = tokio::spawn(async move {
+        while let Some(x) = transformer_rx.recv().await {
+            let mut out = x.payload;
+            // Prune out the "hi" key.
+            out["message"]["payload"]
+                .as_object_mut()
+                .unwrap()
+                .remove("hi");
+            // Add the "good" key.
+            out["message"]["payload"]["good"] = json!("bye");
+            x.callback_tx.send(Ok(JsReturn::Object(out))).ok();
+        }
+    });
+    plugin.set_transformer(Some(transformer_tx));
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&channel, queue_name, &serde_json::to_vec(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+    channel
+        .queue_delete(queue_name, Default::default())
+        .await
+        .ok();
+}
+
+#[tokio::test]
+async fn test_missing_app_id_nack() {
+    let mq_conn = mq_connection(MQ_URI).await;
+    let channel = mq_conn.create_channel().await.unwrap();
+    // setup the queue before running the consumer or the consumer will error out
+    let queue = declare_queue("", &channel).await;
+    let queue_name = queue.name().as_str();
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), MQ_URI, queue_name, false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &channel,
+        queue_name,
+        &serde_json::to_vec(&json!({
+            // No app id
+            "message": {
+                "eventType": "testing.things",
+                "payload": {
+                    "hi": "there",
+                }
+            },
+
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+    channel
+        .queue_delete(queue_name, Default::default())
+        .await
+        .ok();
+}
+
+#[tokio::test]
+async fn test_missing_event_type_nack() {
+    let mq_conn = mq_connection(MQ_URI).await;
+    let channel = mq_conn.create_channel().await.unwrap();
+    // setup the queue before running the consumer or the consumer will error out
+    let queue = declare_queue("", &channel).await;
+    let queue_name = queue.name().as_str();
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), MQ_URI, queue_name, false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &channel,
+        queue_name,
+        &serde_json::to_vec(&json!({
+            "app_id": "app_1234",
+            "message": {
+                // No event type
+                "payload": {
+                    "hi": "there",
+                }
+            },
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+    channel
+        .queue_delete(queue_name, Default::default())
+        .await
+        .ok();
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix
+#[tokio::test]
+async fn test_consume_svix_503() {
+    let mq_conn = mq_connection(MQ_URI).await;
+    let channel = mq_conn.create_channel().await.unwrap();
+    // setup the queue before running the consumer or the consumer will error out
+    let queue = declare_queue("", &channel).await;
+    let queue_name = queue.name().as_str();
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(503))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), MQ_URI, queue_name, false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &channel,
+        queue_name,
+        &serde_json::to_vec(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+    channel
+        .queue_delete(queue_name, Default::default())
+        .await
+        .ok();
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix because idk, the servers are all offline??
+#[tokio::test]
+async fn test_consume_svix_offline() {
+    let mq_conn = mq_connection(MQ_URI).await;
+    let channel = mq_conn.create_channel().await.unwrap();
+    // setup the queue before running the consumer or the consumer will error out
+    let queue = declare_queue("", &channel).await;
+    let queue_name = queue.name().as_str();
+
+    let mock_server = MockServer::start().await;
+
+    let plugin = get_test_plugin(mock_server.uri(), MQ_URI, queue_name, false);
+
+    // bye-bye svix...
+    drop(mock_server);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &channel,
+        queue_name,
+        &serde_json::to_vec(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+    channel
+        .queue_delete(queue_name, Default::default())
+        .await
+        .ok();
+}
diff --git a/bridge/svix-bridge-plugin-queue/tests/redis_stream_consumer.rs b/bridge/svix-bridge-plugin-queue/tests/redis_stream_consumer.rs
new file mode 100644
index 000000000..d16d62735
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/tests/redis_stream_consumer.rs
@@ -0,0 +1,381 @@
+//! Use the `testing-docker-compose.yml` in the repo root to run the dependencies for testing,
+//! including Redis.
+
+use std::time::Duration;
+
+use redis::{AsyncCommands, Client};
+use serde_json::json;
+use svix_bridge_plugin_queue::{config::RedisInputOpts, CreateMessageRequest, RedisConsumerPlugin};
+use svix_bridge_types::{
+    svix::api::MessageIn, JsReturn, SenderInput, SenderOutputOpts, SvixOptions,
+    SvixSenderOutputOpts, TransformerJob,
+};
+use wiremock::matchers::{body_partial_json, method};
+use wiremock::{Mock, MockServer, ResponseTemplate};
+
+fn get_test_plugin(
+    svix_url: String,
+    queue_key: String,
+    use_transformation: bool,
+) -> RedisConsumerPlugin {
+    RedisConsumerPlugin::new(
+        "test".into(),
+        RedisInputOpts {
+            dsn: "redis://localhost/".to_owned(),
+            max_connections: 8,
+            reinsert_on_nack: false,
+            queue_key,
+            consumer_group: "test_cg".to_owned(),
+            consumer_name: "test_cn".to_owned(),
+        },
+        if use_transformation {
+            // The actual script doesn't matter since the test case will be performing the
+            // transformation, not the actual JS executor.
+            Some(String::from("function handle(x) { return x; }"))
+        } else {
+            None
+        },
+        SenderOutputOpts::Svix(SvixSenderOutputOpts {
+            token: "xxxx".to_string(),
+            options: Some(SvixOptions {
+                server_url: Some(svix_url),
+                ..Default::default()
+            }),
+        }),
+    )
+}
+
+async fn redis_connection() -> Client {
+    Client::open("redis://localhost/").unwrap()
+}
+
+async fn create_test_stream(client: &Client) -> String {
+    let name: String = std::iter::repeat_with(fastrand::alphanumeric)
+        .take(8)
+        .collect();
+
+    let mut conn = client.get_async_connection().await.unwrap();
+
+    let _: () = conn
+        .xgroup_create_mkstream(&name, "test_cg", 0i8)
+        .await
+        .unwrap();
+
+    name
+}
+
+async fn delete_test_stream(client: &Client, key: &str) {
+    let mut conn = client.get_async_connection().await.unwrap();
+    let _: () = conn.del(key).await.unwrap();
+}
+
+async fn publish(client: &Client, key: &str, payload: &str) {
+    let mut conn = client.get_async_connection().await.unwrap();
+
+    let _: () = conn.xadd(key, "*", &[("payload", payload)]).await.unwrap();
+}
+
+/// General "pause while we wait for messages to travel" beat. If you're seeing flakes, bump this up.
+const WAIT_MS: u64 = 250;
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request.
+#[tokio::test]
+async fn test_consume_ok() {
+    let client = redis_connection().await;
+    let key = create_test_stream(&client).await;
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            "hi": "there",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), key.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&client, &key, &serde_json::to_string(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+
+    delete_test_stream(&client, &key).await;
+}
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request, but this time transform the payload.
+#[tokio::test]
+async fn test_consume_transformed_ok() {
+    let client = redis_connection().await;
+    let key = create_test_stream(&client).await;
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .and(body_partial_json(json!({ "payload": { "good": "bye" } })))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            // The adjustment made via the transformation...
+            "good": "bye",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let mut plugin = get_test_plugin(mock_server.uri(), key.clone(), true);
+    let (transformer_tx, mut transformer_rx) =
+        tokio::sync::mpsc::unbounded_channel::<TransformerJob>();
+    let _handle = tokio::spawn(async move {
+        while let Some(x) = transformer_rx.recv().await {
+            let mut out = x.payload;
+            // Prune out the "hi" key.
+            out["message"]["payload"]
+                .as_object_mut()
+                .unwrap()
+                .remove("hi");
+            // Add the "good" key.
+            out["message"]["payload"]["good"] = json!("bye");
+            x.callback_tx.send(Ok(JsReturn::Object(out))).ok();
+        }
+    });
+    plugin.set_transformer(Some(transformer_tx));
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&client, &key, &serde_json::to_string(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+
+    delete_test_stream(&client, &key).await;
+}
+
+#[tokio::test]
+async fn test_missing_app_id_nack() {
+    let client = redis_connection().await;
+    let key = create_test_stream(&client).await;
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), key.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &key,
+        &serde_json::to_string(&json!({
+            // No app id
+            "message": {
+                "eventType": "testing.things",
+                "payload": {
+                    "hi": "there",
+                }
+            },
+
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+
+    delete_test_stream(&client, &key).await
+}
+
+#[tokio::test]
+async fn test_missing_event_type_nack() {
+    let client = redis_connection().await;
+    let key = create_test_stream(&client).await;
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), key.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &key,
+        &serde_json::to_string(&json!({
+            "app_id": "app_1234",
+            "message": {
+                // No event type
+                "payload": {
+                    "hi": "there",
+                }
+            },
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+
+    delete_test_stream(&client, &key).await
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix
+#[tokio::test]
+async fn test_consume_svix_503() {
+    let client = redis_connection().await;
+    let key = create_test_stream(&client).await;
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(503))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), key.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &key,
+        &serde_json::to_string(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+
+    delete_test_stream(&client, &key).await
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix because idk, the servers are all offline??
+#[tokio::test]
+async fn test_consume_svix_offline() {
+    let client = redis_connection().await;
+    let key = create_test_stream(&client).await;
+
+    let mock_server = MockServer::start().await;
+
+    let plugin = get_test_plugin(mock_server.uri(), key.clone(), false);
+
+    // bye-bye svix...
+    drop(mock_server);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &key,
+        &serde_json::to_string(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+
+    delete_test_stream(&client, &key).await
+}
diff --git a/bridge/svix-bridge-plugin-queue/tests/sqs_consumer.rs b/bridge/svix-bridge-plugin-queue/tests/sqs_consumer.rs
new file mode 100644
index 000000000..4f637aba0
--- /dev/null
+++ b/bridge/svix-bridge-plugin-queue/tests/sqs_consumer.rs
@@ -0,0 +1,425 @@
+#![cfg(feature = "integration_tests")]
+
+//! Use the `testing-docker-compose.yml` in the repo root to run the dependencies for testing,
+//! including ElasticMQ.
+//!
+//! Use `run-tests.sh` to use the requisite environment for testing.
+
+use std::time::Duration;
+
+use aws_sdk_sqs::Client;
+use serde_json::json;
+use svix::api::MessageIn;
+use svix_bridge_plugin_queue::{
+    config::{SqsConsumerConfig, SqsInputOpts, SvixOptions},
+    CreateMessageRequest, SqsConsumerPlugin,
+};
+use svix_bridge_types::{JsReturn, Plugin, SenderOutputOpts, SvixSenderOutputOpts, TransformerJob};
+use wiremock::matchers::{body_partial_json, method};
+use wiremock::{Mock, MockServer, ResponseTemplate};
+
+const ROOT_URL: &str = "http://localhost:9324";
+
+fn get_test_plugin(
+    svix_url: String,
+    queue_dsn: String,
+    use_transformation: bool,
+) -> SqsConsumerPlugin {
+    SqsConsumerPlugin::new(
+        "test".into(),
+        SqsInputOpts {
+            queue_dsn,
+            override_endpoint: true,
+        },
+        if use_transformation {
+            // The actual script doesn't matter since the test case will be performing the
+            // transformation, not the actual JS executor.
+            Some(String::from("function handle(x) { return x; }"))
+        } else {
+            None
+        },
+        SenderOutputOpts::Svix(SvixSenderOutputOpts {
+            token: "xxxx".to_string(),
+            options: Some(SvixOptions {
+                server_url: Some(svix_url),
+                ..Default::default()
+            }),
+        }),
+    )
+}
+
+async fn mq_connection() -> Client {
+    let config = aws_config::from_env().endpoint_url(ROOT_URL).load().await;
+    Client::new(&config)
+}
+
+async fn create_test_queue(client: &Client) -> String {
+    let name: String = std::iter::repeat_with(fastrand::alphanumeric)
+        .take(8)
+        .collect();
+    client
+        .create_queue()
+        .queue_name(&name)
+        .send()
+        .await
+        .unwrap();
+
+    name
+}
+
+async fn publish(client: &Client, url: &str, payload: &str) {
+    client
+        .send_message()
+        .queue_url(url)
+        .message_body(payload)
+        .send()
+        .await
+        .unwrap();
+}
+
+/// General "pause while we wait for messages to travel" beat. If you're seeing flakes, bump this up.
+const WAIT_MS: u64 = 100;
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request.
+#[tokio::test]
+async fn test_consume_ok() {
+    let client = mq_connection().await;
+    let queue_name = create_test_queue(&client).await;
+
+    let queue_url = format!("{ROOT_URL}/queue/{queue_name}");
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            "hi": "there",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), queue_url.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&client, &queue_url, &serde_json::to_string(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+
+    client
+        .delete_queue()
+        .queue_url(&queue_url)
+        .send()
+        .await
+        .unwrap();
+}
+
+/// Push a msg on the queue.
+/// Check to see if the svix server sees a request, but this time transform the payload.
+#[tokio::test]
+async fn test_consume_transformed_ok() {
+    let client = mq_connection().await;
+    let queue_name = create_test_queue(&client).await;
+
+    let queue_url = format!("{ROOT_URL}/queue/{queue_name}");
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .and(body_partial_json(json!({ "payload": { "good": "bye" } })))
+        .respond_with(ResponseTemplate::new(202).set_body_json(json!({
+          "eventType": "testing.things",
+          "payload": {
+            "_SVIX_APP_ID": "app_1234",
+            "_SVIX_EVENT_TYPE": "testing.things",
+            // The adjustment made via the transformation...
+            "good": "bye",
+          },
+          "id": "msg_xxxx",
+          "timestamp": "2023-04-25T00:00:00Z"
+        })))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let mut plugin = get_test_plugin(mock_server.uri(), queue_url.clone(), true);
+    let (transformer_tx, mut transformer_rx) =
+        tokio::sync::mpsc::unbounded_channel::<TransformerJob>();
+    let _handle = tokio::spawn(async move {
+        while let Some(x) = transformer_rx.recv().await {
+            let mut out = x.payload;
+            // Prune out the "hi" key.
+            out["message"]["payload"]
+                .as_object_mut()
+                .unwrap()
+                .remove("hi");
+            // Add the "good" key.
+            out["message"]["payload"]["good"] = json!("bye");
+            x.callback_tx.send(Ok(JsReturn::Object(out))).ok();
+        }
+    });
+    plugin.set_transformer(Some(transformer_tx));
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    let msg = CreateMessageRequest {
+        app_id: "app_1234".into(),
+        message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+        post_options: None,
+    };
+
+    publish(&client, &queue_url, &serde_json::to_string(&msg).unwrap()).await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    handle.abort();
+
+    client
+        .delete_queue()
+        .queue_url(&queue_url)
+        .send()
+        .await
+        .unwrap();
+}
+
+#[tokio::test]
+async fn test_missing_app_id_nack() {
+    let client = mq_connection().await;
+    let queue_name = create_test_queue(&client).await;
+
+    let queue_url = format!("{ROOT_URL}/queue/{queue_name}");
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), queue_url.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &queue_url,
+        &serde_json::to_string(&json!({
+            // No app id
+            "message": {
+                "eventType": "testing.things",
+                "payload": {
+                    "hi": "there",
+                }
+            },
+
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+
+    client
+        .delete_queue()
+        .queue_url(&queue_url)
+        .send()
+        .await
+        .unwrap();
+}
+
+#[tokio::test]
+async fn test_missing_event_type_nack() {
+    let client = mq_connection().await;
+    let queue_name = create_test_queue(&client).await;
+
+    let queue_url = format!("{ROOT_URL}/queue/{queue_name}");
+
+    let mock_server = MockServer::start().await;
+    let mock = Mock::given(method("POST"))
+        // The response doesn't really matter, but we need to define it to be able to `expect(0)`.
+        .respond_with(ResponseTemplate::new(400))
+        .named("create_message")
+        // No requests should be made when the event type or app id are missing.
+        .expect(0);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), queue_url.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &queue_url,
+        &serde_json::to_string(&json!({
+            "app_id": "app_1234",
+            "message": {
+                // No event type
+                "payload": {
+                    "hi": "there",
+                }
+            },
+        }))
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+    handle.abort();
+
+    client
+        .delete_queue()
+        .queue_url(&queue_url)
+        .send()
+        .await
+        .unwrap();
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix
+#[tokio::test]
+async fn test_consume_svix_503() {
+    let client = mq_connection().await;
+    let queue_name = create_test_queue(&client).await;
+
+    let queue_url = format!("{ROOT_URL}/queue/{queue_name}");
+
+    let mock_server = MockServer::start().await;
+    // The mock will make asserts on drop (i.e. when the body of the test is returning).
+    // The `expect` call should ensure we see exactly 1 POST request.
+    // <https://docs.rs/wiremock/latest/wiremock/struct.Mock.html#method.expect>
+    let mock = Mock::given(method("POST"))
+        .respond_with(ResponseTemplate::new(503))
+        .named("create_message")
+        .expect(1);
+    mock_server.register(mock).await;
+
+    let plugin = get_test_plugin(mock_server.uri(), queue_url.clone(), false);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &queue_url,
+        &serde_json::to_string(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+
+    client
+        .delete_queue()
+        .queue_url(&queue_url)
+        .send()
+        .await
+        .unwrap();
+}
+
+/// Check that the plugin keeps running when it can't send a message to svix because idk, the servers are all offline??
+#[tokio::test]
+async fn test_consume_svix_offline() {
+    let client = mq_connection().await;
+    let queue_name = create_test_queue(&client).await;
+
+    let queue_url = format!("{ROOT_URL}/queue/{queue_name}");
+
+    let mock_server = MockServer::start().await;
+
+    let plugin = get_test_plugin(mock_server.uri(), queue_url.clone(), false);
+
+    // bye-bye svix...
+    drop(mock_server);
+
+    let handle = tokio::spawn(async move {
+        let fut = plugin.run();
+        fut.await
+    });
+    // Wait for the consumer to connect
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    publish(
+        &client,
+        &queue_url,
+        &serde_json::to_string(&CreateMessageRequest {
+            app_id: "app_1234".into(),
+            message: MessageIn::new("testing.things".into(), json!({"hi": "there"})),
+            post_options: None,
+        })
+        .unwrap(),
+    )
+    .await;
+
+    // Wait for the consumer to consume.
+    tokio::time::sleep(Duration::from_millis(WAIT_MS)).await;
+
+    assert!(!handle.is_finished());
+    handle.abort();
+
+    client
+        .delete_queue()
+        .queue_url(&queue_url)
+        .send()
+        .await
+        .unwrap();
+}
diff --git a/bridge/svix-bridge/src/config/tests.rs b/bridge/svix-bridge/src/config/tests.rs
new file mode 100644
index 000000000..133d3ff3b
--- /dev/null
+++ b/bridge/svix-bridge/src/config/tests.rs
@@ -0,0 +1,327 @@
+use super::Config;
+use crate::config::{LogFormat, LogLevel, SenderConfig};
+
+/// This is meant to be a kitchen sink config, hitting as many possible
+/// configuration options as possible to ensure they parse correctly.
+// FIXME: today, largely based on the examples. Should instead focus on coverage.
+const OMNIBUS: &str = r#"
+# Svix Bridge Example Configuration
+
+# Set the log level for the service. Supported: error, info, warn, debug, trace. Default: info
+#log_level: "debug"
+
+# The log format that all output will follow. Supported: default, json
+#log_format: "json"
+
+# Optional: configures an OTEL exporter forwarding spans to the specified collector
+opentelemetry:
+  address: "http://localhost:1234"
+  sample_ratio: 0.5
+  # Optional: default "svix-bridge"
+  service_name: "my-bridge"
+
+
+# The host/port to bind to for incoming HTTP requests.
+# Optional: default 0.0.0.0:5000
+# http_listen_address: "0.0.0.0:5000"
+
+
+# Senders consume JSON from their input, optionally transform, then forward to Svix.
+# Currently supported inputs are various message queue consumers while the sole
+# output is "svix" (which does a Create Message API request)
+senders:
+  # GCP Pub/Sub Consumer
+  - name: "gcp-example"
+    input:
+      type: "gcp-pubsub"
+      subscription_id: "my-subscription"
+      # Optional - will fallback to looking at env vars when left unset.
+      credentials_file: "/path/to/credentials.json"
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+  # RabbitMQ Consumer
+  - name: "rabbitmq-example"
+    input:
+      type: "rabbitmq"
+      # Required
+      uri: "amqp://guest:guest@localhost:5672/%2f"
+      # Required
+      queue_name: "my-queue"
+      # Optional (default: unset, managed by rabbitmq)
+      consumer_tag: "my-consumer-001"
+      # Optional: default true
+      requeue_on_nack: false
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+  # Redis Consumer
+  - name: "redis-example"
+    input:
+      type: "redis"
+      # Required
+      dsn: "redis://localhost:6379/"
+      # Required
+      queue_key: "my_queue"
+      # Required
+      consumer_name: "my_consumer"
+      # Required
+      consumer_group: "my_group"
+      # Required
+      max_connections: 4
+      # Optional: default true
+      reinsert_on_nack: true
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+  # SQS Consumer
+  # Also remember to set your AWS credentials in env vars to use this:
+  # - `AWS_DEFAULT_REGION`
+  # - `AWS_ACCESS_KEY_ID`
+  # - `AWS_SECRET_ACCESS_KEY`
+  - name: "sqs-example"
+    input:
+      type: "sqs"
+      # Required
+      queue_dsn: "http://localhost:19324/000000000000/local"
+      # Optional (default: false)
+      override_endpoint: true
+    # Optional - when unset, messages from the queue will be sent to Svix as-is.
+    transformation: |
+      function handler(input) {
+        return {
+          app_id: input.key,
+          message: {
+            eventType: input.event_type,
+            payload: input.data
+          }
+        };
+      }
+    output:
+      type: "svix"
+      # Required (the Svix token to use when creating messages with this consumer)
+      token: "XYZ"
+
+
+# Receivers are HTTP endpoints that can have webhooks sent to them.
+# When a webhook is POST'ed to a matching URL, it is (optionally) verified,
+# (optionally) transformed via a js function, then forwarded to an "output."
+#
+# Inputs types are "webhook" which allows you to configure a verification scheme
+# (either "svix" or "none") or "svix-webhook" which is a shorthand version.
+#
+# ```
+#   input:
+#     type: "webhook"
+#     path_id: "long-hand"
+#     verification:
+#       type: "svix"
+#       endpoint_secret: "whsec_XXXXX="
+#   # same as...
+#   input:
+#     type: "svix-webhook"
+#     path_id: "shorthand"
+#     endpoint_secret: "whsec_XXXXX="
+# ```
+#
+# The `path_id` in webhook and svix-webhook inputs represents the trailing
+# path segment that will connect to the given output.
+# For example, running bridge with the HTTP listen address set to
+# `localhost:5000`, the above examples would map to the following URLS:
+# - http://localhost:5000/webhooks/long-hand
+# - http://localhost:5000/webhooks/shorthand
+#
+receivers:
+  - name: "forward-to-gcp-example"
+    input:
+      type: "webhook"
+      path_id: "gcp"
+      verification:
+        type: "svix"
+        endpoint_secret: "whsec_XXXXX="
+    # Optional - when unset, webhooks received will be forwarded to the output as-is.
+    transformation: |
+      function handler(input) {
+        let event_type = input.eventType;
+        delete input.eventType;
+        return { event_type, ...input };
+      }
+    output:
+      type: "gcp-pubsub"
+      topic: "example"
+      # Optional - falls back to env otherwise, eg.
+      # - `GOOGLE_APPLICATION_CREDENTIALS`
+      # - `GOOGLE_APPLICATION_CREDENTIALS_JSON`
+      credentials_file: "/path/to/creds.json"
+
+  - name: "forward-to-rabbitmq-example"
+    input:
+      type: "webhook"
+      path_id: "rabbit"
+      verification:
+        type: "svix"
+        endpoint_secret: "whsec_XXXXX="
+    output:
+      type: "rabbitmq"
+      uri: "amqp://guest:guest@localhost:5672/%2f"
+      exchange: ""
+      routing_key: "example"
+
+  - name: "forward-to-redis-example"
+    input:
+      type: "webhook"
+      path_id: "redis"
+      verification:
+        type: "svix"
+        endpoint_secret: "whsec_XXXXX="
+    output:
+      type: "redis"
+      dsn: "redis://localhost:1234"
+      max_connections: 4
+      queue_key: "my_queue"
+
+  - name: "forward-to-sqs-example"
+    input:
+      type: "webhook"
+      path_id: "sqs"
+      verification:
+        type: "none"
+    output:
+      # Note that the SQS forwarder requires credentials to be set as environment vars:
+      # - `AWS_DEFAULT_REGION`
+      # - `AWS_ACCESS_KEY_ID`
+      # - `AWS_SECRET_ACCESS_KEY`
+      type: "sqs"
+      queue_dsn: "https://example.aws.com/my-queue"
+"#;
+
+#[test]
+fn test_sender_parses_ok() {
+    let conf: Result<SenderConfig, _> = serde_yaml::from_str(
+        r#"
+name: "from-rabbit-local-to-svix"
+input:
+    type: "rabbitmq"
+    queue_name: "local"
+    uri: "amqp://example.com/%2f"
+transformation: |
+    handler = (x) => ({ app_id: "app_1234", message: { eventType: "foo.bar", payload: x }})
+output:
+    type: "svix"
+    token: "XXXX"
+    "#,
+    );
+    conf.unwrap();
+}
+
+#[test]
+fn test_senders_parses_ok() {
+    let conf: Result<Vec<SenderConfig>, _> = serde_yaml::from_str(
+        r#"
+
+- name: "from-rabbit-local-to-svix"
+  input:
+    type: "rabbitmq"
+    queue_name: "local"
+    uri: "amqp://example.com/%2f"
+  transformation: |
+    handler = (x) => ({ app_id: "app_1234", message: { eventType: "foo.bar", payload: x }})
+  output:
+    type: "svix"
+    token: "XXXX"
+- name: "from-SQS-to-svix"
+  input:
+    type: "sqs"
+    queue_dsn: "http://sqs.example.com/foo/bar"
+  transformation: |
+    handler = (x) => ({ app_id: "app_1234", message: { eventType: "foo.bar", payload: x }})
+  output:
+    type: "svix"
+    token: "YYYY"
+"#,
+    );
+    let conf = conf.unwrap();
+    assert_eq!(conf.len(), 2);
+}
+
+#[test]
+fn test_omnibus_parses_ok() {
+    let conf: Result<Config, _> = serde_yaml::from_str(OMNIBUS);
+    conf.unwrap();
+}
+
+#[test]
+fn test_empty() {
+    let conf: Config = serde_yaml::from_str("").unwrap();
+    assert!(conf.senders.is_empty());
+    assert!(conf.receivers.is_empty());
+    assert_eq!(conf.http_listen_address, "0.0.0.0:5000".parse().unwrap());
+    assert!(conf.opentelemetry.is_none());
+    assert!(matches!(conf.log_format, LogFormat::Default));
+    assert!(matches!(conf.log_level, LogLevel::Info));
+}
+
+/// Don't particularly care about the parsed specifics here.
+/// This is more about making sure the examples we have in the repo actually parse.
+#[test]
+fn test_receivers_example() {
+    let fp = concat!(
+        env!("CARGO_MANIFEST_DIR"),
+        "/../svix-bridge.example.receivers.yaml"
+    );
+    let conf: Config = serde_yaml::from_slice(&std::fs::read(fp).unwrap()).unwrap();
+    assert!(conf.senders.is_empty());
+    assert!(!conf.receivers.is_empty());
+}
+
+/// Don't particularly care about the parsed specifics here.
+/// This is more about making sure the examples we have in the repo actually parse.
+#[test]
+fn test_senders_example() {
+    let fp = concat!(
+        env!("CARGO_MANIFEST_DIR"),
+        "/../svix-bridge.example.senders.yaml"
+    );
+    let conf: Config = serde_yaml::from_slice(&std::fs::read(fp).unwrap()).unwrap();
+    assert!(!conf.senders.is_empty());
+    assert!(conf.receivers.is_empty());
+}
diff --git a/bridge/svix-bridge/src/runtime/tests.rs b/bridge/svix-bridge/src/runtime/tests.rs
new file mode 100644
index 000000000..ea0bcd33a
--- /dev/null
+++ b/bridge/svix-bridge/src/runtime/tests.rs
@@ -0,0 +1,56 @@
+use super::run_script_inner;
+use serde_json::json;
+use svix_bridge_types::JsReturn;
+
+// Really just trying to figure out if the deno runtime is working the way I hope.
+#[test]
+fn test_happy_fn() {
+    let src = r#"
+    function handler(input) {
+        return { "x": 123, ...input };
+    }
+    "#
+    .to_string();
+    let res = run_script_inner(&json!({ "y": 456 }), src).unwrap();
+    match res {
+        JsReturn::Object(v) => {
+            assert_eq!(v["x"].as_i64(), Some(123));
+            assert_eq!(v["y"].as_i64(), Some(456));
+        }
+        JsReturn::Invalid => panic!("got unexpected return value"),
+    }
+}
+
+#[test]
+fn test_invalid_output_bool() {
+    let src = r#"
+    function handler(input) {
+        return false;
+    }
+    "#
+    .to_string();
+    let res = run_script_inner(&json!({}), src).unwrap();
+    match res {
+        JsReturn::Invalid => (),
+        JsReturn::Object(_) => panic!("got unexpected return value"),
+    }
+}
+
+#[test]
+// FIXME: serde decodes arrays with keys like "0", "1"... in this situation, failing the test.
+#[ignore]
+fn test_invalid_output_array() {
+    let src = r#"
+    function handler(input) {
+        return [1, 2];
+    }
+    "#
+    .to_string();
+    let res = run_script_inner(&json!({}), src).unwrap();
+    match res {
+        JsReturn::Invalid => (),
+        JsReturn::Object(_) => {
+            panic!("got unexpected return value");
+        }
+    }
+}
diff --git a/bridge/svix-bridge/src/webhook_receiver/tests.rs b/bridge/svix-bridge/src/webhook_receiver/tests.rs
new file mode 100644
index 000000000..a95a7aefa
--- /dev/null
+++ b/bridge/svix-bridge/src/webhook_receiver/tests.rs
@@ -0,0 +1,322 @@
+use super::router;
+use crate::webhook_receiver::{
+    types::{IntegrationState, InternalState},
+    verification::{NoVerifier, SvixVerifier},
+};
+use axum::{
+    body::Body,
+    http::{Request, StatusCode},
+};
+use serde_json::json;
+use std::sync::Arc;
+use svix_bridge_types::{
+    async_trait, svix::webhooks::Webhook, JsObject, JsReturn, ReceiverOutput, TransformerJob,
+};
+use tower::Service;
+use tower::ServiceExt;
+
+struct FakeReceiverOutput {
+    tx: tokio::sync::mpsc::UnboundedSender<JsObject>,
+}
+
+impl FakeReceiverOutput {
+    pub fn new() -> (Self, tokio::sync::mpsc::UnboundedReceiver<JsObject>) {
+        let (tx, rx) = tokio::sync::mpsc::unbounded_channel();
+        (Self { tx }, rx)
+    }
+}
+
+#[async_trait]
+impl ReceiverOutput for FakeReceiverOutput {
+    fn name(&self) -> &str {
+        "fake output"
+    }
+
+    async fn handle(&self, payload: JsObject) -> std::io::Result<()> {
+        self.tx.send(payload).unwrap();
+        Ok(())
+    }
+}
+
+#[tokio::test]
+async fn test_forwarding_no_verification() {
+    let (tx, _rx) = tokio::sync::mpsc::unbounded_channel();
+    let (a_output, mut a_rx) = FakeReceiverOutput::new();
+    let state_map = [(
+        "a".into(),
+        IntegrationState {
+            verifier: NoVerifier.into(),
+            output: Arc::new(Box::new(a_output)),
+            transformation: None,
+        },
+    )]
+    .into_iter()
+    .collect();
+    let state = InternalState::new(state_map, tx);
+    let app = router().with_state(state);
+    let response = app
+        .oneshot(
+            Request::builder()
+                .uri("/webhook/a")
+                .method("POST")
+                .header("content-type", "application/json")
+                .body(serde_json::to_vec(&json!({"a": true})).unwrap().into())
+                .unwrap(),
+        )
+        .await
+        .unwrap();
+    assert_eq!(response.status(), StatusCode::NO_CONTENT);
+    let forwarded = a_rx.try_recv().unwrap();
+    assert_eq!(json!(forwarded), json!({"a": true}));
+}
+
+/// Registers 2 receivers and sends 1 request to each.
+#[tokio::test]
+async fn test_forwarding_multiple_receivers() {
+    let (tx, _rx) = tokio::sync::mpsc::unbounded_channel();
+    let (a_output, mut a_rx) = FakeReceiverOutput::new();
+    let (b_output, mut b_rx) = FakeReceiverOutput::new();
+    let state_map = [
+        (
+            "a".into(),
+            IntegrationState {
+                verifier: NoVerifier.into(),
+                output: Arc::new(Box::new(a_output)),
+                transformation: None,
+            },
+        ),
+        (
+            "b".into(),
+            IntegrationState {
+                verifier: NoVerifier.into(),
+                output: Arc::new(Box::new(b_output)),
+                transformation: None,
+            },
+        ),
+    ]
+    .into_iter()
+    .collect();
+    let state = InternalState::new(state_map, tx);
+
+    let mut app = router().with_state(state);
+
+    let request = Request::builder()
+        .uri("/webhook/a")
+        .method("POST")
+        .header("content-type", "application/json")
+        .body(serde_json::to_vec(&json!({"a": true})).unwrap().into())
+        .unwrap();
+
+    let response = ServiceExt::<Request<Body>>::ready(&mut app)
+        .await
+        .unwrap()
+        .call(request)
+        .await
+        .unwrap();
+
+    assert_eq!(response.status(), StatusCode::NO_CONTENT);
+    let forwarded = a_rx.try_recv().unwrap();
+    assert_eq!(json!(forwarded), json!({"a": true}));
+
+    let request = Request::builder()
+        .uri("/webhook/b")
+        .method("POST")
+        .header("content-type", "application/json")
+        .body(serde_json::to_vec(&json!({"b": true})).unwrap().into())
+        .unwrap();
+
+    let response = ServiceExt::<Request<Body>>::ready(&mut app)
+        .await
+        .unwrap()
+        .call(request)
+        .await
+        .unwrap();
+
+    assert_eq!(response.status(), StatusCode::NO_CONTENT);
+    let forwarded = b_rx.try_recv().unwrap();
+    assert_eq!(json!(forwarded), json!({"b": true}));
+
+    // Both channels should be empty at this point.
+    assert!(a_rx.try_recv().is_err());
+    assert!(b_rx.try_recv().is_err());
+}
+
+/// Registers 2 receivers, one with a transformation and one without.Sends 1 request to each.
+#[tokio::test]
+async fn test_transformation() {
+    let (tx, mut rx) = tokio::sync::mpsc::unbounded_channel::<TransformerJob>();
+    let _handle = tokio::spawn(async move {
+        while let Some(x) = rx.recv().await {
+            let mut out = x.payload;
+            out.insert("__TRANSFORMED__".into(), json!(true));
+            x.callback_tx.send(Ok(JsReturn::Object(out))).ok();
+        }
+    });
+
+    let (a_output, mut a_rx) = FakeReceiverOutput::new();
+    let (b_output, mut b_rx) = FakeReceiverOutput::new();
+    let state_map = [
+        (
+            "transformed".into(),
+            IntegrationState {
+                verifier: NoVerifier.into(),
+                output: Arc::new(Box::new(a_output)),
+                transformation: Some("handler = (x) => ({ __TRANSFORMED__: true, ...x})".into()),
+            },
+        ),
+        (
+            "as-is".into(),
+            IntegrationState {
+                verifier: NoVerifier.into(),
+                output: Arc::new(Box::new(b_output)),
+                transformation: None,
+            },
+        ),
+    ]
+    .into_iter()
+    .collect();
+    let state = InternalState::new(state_map, tx);
+
+    let mut app = router().with_state(state);
+
+    let request = Request::builder()
+        .uri("/webhook/transformed")
+        .method("POST")
+        .header("content-type", "application/json")
+        .body(serde_json::to_vec(&json!({"a": true})).unwrap().into())
+        .unwrap();
+
+    let response = ServiceExt::<Request<Body>>::ready(&mut app)
+        .await
+        .unwrap()
+        .call(request)
+        .await
+        .unwrap();
+
+    assert_eq!(response.status(), StatusCode::NO_CONTENT);
+    let forwarded = a_rx.try_recv().unwrap();
+    // The `__TRANSFORMED__` key should have been added
+    assert_eq!(
+        json!(forwarded),
+        json!({"a": true, "__TRANSFORMED__": true})
+    );
+
+    let request = Request::builder()
+        .uri("/webhook/as-is")
+        .method("POST")
+        .header("content-type", "application/json")
+        .body(serde_json::to_vec(&json!({"b": true})).unwrap().into())
+        .unwrap();
+
+    let response = ServiceExt::<Request<Body>>::ready(&mut app)
+        .await
+        .unwrap()
+        .call(request)
+        .await
+        .unwrap();
+
+    assert_eq!(response.status(), StatusCode::NO_CONTENT);
+    let forwarded = b_rx.try_recv().unwrap();
+    // The same payload should come through, without any transformation.
+    assert_eq!(json!(forwarded), json!({"b": true}));
+
+    // Both channels should be empty at this point.
+    assert!(a_rx.try_recv().is_err());
+    assert!(b_rx.try_recv().is_err());
+}
+
+// Two different bodies - one used during signing, then the other is what we send in the request.
+// This should result in a bad response status.
+#[tokio::test]
+async fn test_forwarding_svix_verification_mismatch() {
+    let signed_payload_bytes = serde_json::to_vec(&json!({"a": true})).unwrap();
+    let sent_payload_bytes = serde_json::to_vec(&json!({"a": false})).unwrap();
+
+    let (tx, _rx) = tokio::sync::mpsc::unbounded_channel();
+    let (a_output, mut a_rx) = FakeReceiverOutput::new();
+
+    let webhook = Arc::new(Webhook::new("whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD").unwrap());
+
+    let timestamp = chrono::Utc::now().timestamp();
+    let signature = webhook
+        .sign("msg_valid", timestamp, &signed_payload_bytes)
+        .unwrap();
+
+    let state_map = [(
+        "a".into(),
+        IntegrationState {
+            verifier: SvixVerifier::new(webhook).into(),
+            output: Arc::new(Box::new(a_output)),
+            transformation: None,
+        },
+    )]
+    .into_iter()
+    .collect();
+    let state = InternalState::new(state_map, tx);
+    let app = router().with_state(state);
+
+    let response = app
+        .oneshot(
+            Request::builder()
+                .uri("/webhook/a")
+                .method("POST")
+                .header("content-type", "application/json")
+                .header("svix-id", "msg_valid")
+                .header("svix-signature", signature.clone())
+                .header("svix-timestamp", &format!("{timestamp}"))
+                .body(sent_payload_bytes.into())
+                .unwrap(),
+        )
+        .await
+        .unwrap();
+
+    // Expect a rejection due to signature verification failure.
+    assert_eq!(response.status(), StatusCode::BAD_REQUEST);
+    // There should be noting in the channel since the request should _not have been forwarded_.
+    assert!(a_rx.try_recv().is_err());
+}
+
+#[tokio::test]
+async fn test_forwarding_svix_verification_match() {
+    let (tx, _rx) = tokio::sync::mpsc::unbounded_channel();
+    let (a_output, mut a_rx) = FakeReceiverOutput::new();
+
+    let webhook = Arc::new(Webhook::new("whsec_C2FVsBQIhrscChlQIMV+b5sSYspob7oD").unwrap());
+
+    let payload = json!({"a": true});
+    let payload_bytes = serde_json::to_vec(&payload).unwrap();
+    let timestamp = chrono::Utc::now().timestamp();
+    let signature = webhook
+        .sign("msg_valid", timestamp, &payload_bytes)
+        .unwrap();
+
+    let state_map = [(
+        "a".into(),
+        IntegrationState {
+            verifier: SvixVerifier::new(webhook).into(),
+            output: Arc::new(Box::new(a_output)),
+            transformation: None,
+        },
+    )]
+    .into_iter()
+    .collect();
+    let state = InternalState::new(state_map, tx);
+    let app = router().with_state(state);
+    let response = app
+        .oneshot(
+            Request::builder()
+                .uri("/webhook/a")
+                .method("POST")
+                .header("content-type", "application/json")
+                .header("svix-id", "msg_valid")
+                .header("svix-signature", signature.clone())
+                .header("svix-timestamp", &format!("{timestamp}"))
+                .body(payload_bytes.into())
+                .unwrap(),
+        )
+        .await
+        .unwrap();
+    assert_eq!(response.status(), StatusCode::NO_CONTENT);
+    let forwarded = a_rx.try_recv().unwrap();
+    assert_eq!(json!(forwarded), json!({"a": true}));
+}
diff --git a/bridge/testing-docker-compose.yml b/bridge/testing-docker-compose.yml
new file mode 100644
index 000000000..d49930795
--- /dev/null
+++ b/bridge/testing-docker-compose.yml
@@ -0,0 +1,28 @@
+version: "3.7"
+services:
+  rabbitmq:
+    image: rabbitmq:3.11.11-management-alpine
+    ports:
+      - "5672:5672"
+      - "15672:15672"
+
+  elasticmq: # Drop-in SQS replacement
+    image: softwaremill/elasticmq:1.3.14
+    ports:
+      - "9324:9324"
+      - "9325:9325"
+
+  redis:
+    image: redis:7
+    ports:
+      - "6379:6379"
+
+  gcp-pubsub:
+    image: gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators
+    ports:
+      - "8085:8085"
+    command: [
+      "gcloud", "beta", "emulators", "pubsub", "start",
+      "--project", "local-project",
+      "--host-port", "0.0.0.0:8085"
+    ]
diff --git a/server/run-tests.sh b/server/run-tests.sh
index 699fd7f1b..9716e53d8 100755
--- a/server/run-tests.sh
+++ b/server/run-tests.sh
@@ -2,7 +2,7 @@
 
 # Run tests with various configurations:
 
-TEST_COMMAND="cargo test --all --all-features --all-targets"
+TEST_COMMAND="cargo test --all --all-features --all-targets $*"
 
 # Common variables:
 export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/postgres"
@@ -40,4 +40,9 @@ SVIX_CACHE_TYPE="none"  \
 SVIX_REDIS_DSN="redis://localhost:6379" \
 ${TEST_COMMAND}
 
-
+echo "*********** RUN 6 ***********"
+SVIX_QUEUE_TYPE="rabbitmq" \
+SVIX_CACHE_TYPE="redis" \
+SVIX_REDIS_DSN="redis://localhost:6379" \
+SVIX_RABBIT_DSN="amqp://xivs:xivs@localhost:5672/%2f" \
+${TEST_COMMAND}
diff --git a/server/svix-server/tests/e2e_attempt.rs b/server/svix-server/tests/e2e_attempt.rs
index f6596561b..55be43c16 100644
--- a/server/svix-server/tests/e2e_attempt.rs
+++ b/server/svix-server/tests/e2e_attempt.rs
@@ -7,7 +7,7 @@ use svix_server::{
     core::types::{EndpointUid, MessageStatus},
     v1::{
         endpoints::{
-            attempt::{AttemptedMessageOut, MessageAttemptOut},
+            attempt::{EndpointMessageOut, MessageAttemptOut},
             endpoint::{EndpointIn, EndpointOut},
         },
         utils::ListResponse,
@@ -131,14 +131,14 @@ async fn test_list_attempted_messages() {
     .await;
 
     run_with_retries(|| async {
-        let list_1: ListResponse<AttemptedMessageOut> = client
+        let list_1: ListResponse<EndpointMessageOut> = client
             .get(
                 &format!("api/v1/app/{app_id}/endpoint/{endp_id_1}/msg/"),
                 StatusCode::OK,
             )
             .await
             .unwrap();
-        let list_2: ListResponse<AttemptedMessageOut> = client
+        let list_2: ListResponse<EndpointMessageOut> = client
             .get(
                 &format!("api/v1/app/{app_id}/endpoint/{endp_id_2}/msg/"),
                 StatusCode::OK,
@@ -146,7 +146,7 @@ async fn test_list_attempted_messages() {
             .await
             .unwrap();
 
-        let list_2_uid: ListResponse<AttemptedMessageOut> = client
+        let list_2_uid: ListResponse<EndpointMessageOut> = client
             .get(
                 &format!("api/v1/app/{}/endpoint/{}/msg/", app_id, "test"),
                 StatusCode::OK,
@@ -169,7 +169,7 @@ async fn test_list_attempted_messages() {
     .await
     .unwrap();
 
-    let list_filtered: ListResponse<AttemptedMessageOut> = client
+    let list_filtered: ListResponse<EndpointMessageOut> = client
         .get(
             &format!("api/v1/app/{app_id}/endpoint/{endp_id_1}/msg/?channel=news"),
             StatusCode::OK,
@@ -295,14 +295,23 @@ async fn test_list_attempts_by_endpoint() {
         .unwrap();
     assert_eq!(regular_attempts.data.len(), 2);
 
-    let all_attempts: ListResponse<MessageAttemptOut> = client
+    let all_attempts_1: ListResponse<MessageAttemptOut> = client
     .get(
         &format!("api/v1/app/{app_id}/attempt/endpoint/{endp_id_2}/?event_types[0]=event.type&event_types[1]=user.exploded"),
         StatusCode::OK,
     )
     .await
     .unwrap();
-    assert_eq!(all_attempts.data.len(), 3);
+    assert_eq!(all_attempts_1.data.len(), 3);
+
+    let all_attempts_2: ListResponse<MessageAttemptOut> = client
+    .get(
+        &format!("api/v1/app/{app_id}/attempt/endpoint/{endp_id_2}/?event_types=event.type,user.exploded"),
+        StatusCode::OK,
+    )
+    .await
+    .unwrap();
+    assert_eq!(all_attempts_2.data.len(), 3);
 
     receiver_1.jh.abort();
     receiver_2.jh.abort();
diff --git a/server/svix-server/tests/e2e_endpoint.rs b/server/svix-server/tests/e2e_endpoint.rs
index 6d283986c..c9b1d979b 100644
--- a/server/svix-server/tests/e2e_endpoint.rs
+++ b/server/svix-server/tests/e2e_endpoint.rs
@@ -19,6 +19,7 @@ use std::{
 };
 use svix_server::db::models::{message, messagedestination};
 use svix_server::v1::endpoints::endpoint::EndpointStatsOut;
+use svix_server::v1::endpoints::message::RawPayload;
 
 use serde::Deserialize;
 use svix::webhooks::Webhook;
@@ -2015,7 +2016,7 @@ async fn test_msg_event_types_filter() {
                 MessageIn {
                     channels: None,
                     event_type: event_name,
-                    payload: serde_json::json!({}),
+                    payload: RawPayload::from_string("{}".to_string()).unwrap(),
                     uid: None,
                     payload_retention_period: 5,
                 },
@@ -2064,7 +2065,7 @@ async fn test_msg_channels_filter() {
                 MessageIn {
                     channels: channels.clone(),
                     event_type: EventTypeName("et1".to_owned()),
-                    payload: serde_json::json!({}),
+                    payload: RawPayload::from_string("{}".to_string()).unwrap(),
                     uid: None,
                     payload_retention_period: 5,
                 },
diff --git a/server/svix-server/tests/e2e_message.rs b/server/svix-server/tests/e2e_message.rs
index 8d77a0e0d..ca49141ef 100644
--- a/server/svix-server/tests/e2e_message.rs
+++ b/server/svix-server/tests/e2e_message.rs
@@ -9,7 +9,9 @@ use svix_server::{
     db::models::message,
     expired_message_cleaner,
     v1::{
-        endpoints::attempt::MessageAttemptOut, endpoints::message::MessageOut, utils::ListResponse,
+        endpoints::attempt::MessageAttemptOut,
+        endpoints::message::{MessageOut, RawPayload},
+        utils::ListResponse,
     },
 };
 
@@ -126,7 +128,10 @@ async fn test_message_create_read_list_with_content() {
         .await
         .unwrap();
 
-    assert_eq!(msg_1_w_payload.payload, msg_payload);
+    assert_eq!(
+        msg_1_w_payload.payload.0.get(),
+        serde_json::to_string(&msg_payload).unwrap()
+    );
 
     let msg_2_wo_payload: MessageOut = client
         .post(
@@ -137,14 +142,14 @@ async fn test_message_create_read_list_with_content() {
         .await
         .unwrap();
 
-    assert_eq!(msg_2_wo_payload.payload, serde_json::json!({}));
+    assert_eq!(msg_2_wo_payload.payload.0.get(), "{}");
 
     let msg_1_wo_payload = MessageOut {
-        payload: serde_json::json!({}),
+        payload: RawPayload::from_string("{}".to_string()).unwrap(),
         ..msg_1_w_payload.clone()
     };
     let msg_2_w_payload = MessageOut {
-        payload: msg_payload,
+        payload: RawPayload::from_string(serde_json::to_string(&msg_payload).unwrap()).unwrap(),
         ..msg_2_wo_payload.clone()
     };
 
@@ -427,7 +432,10 @@ async fn test_expunge_message_payload() {
         .await
         .unwrap();
 
-    assert_eq!(msg.payload, payload);
+    assert_eq!(
+        msg.payload.0.get(),
+        serde_json::to_string(&payload).unwrap()
+    );
 
     let msg = client
         .get::<MessageOut>(
@@ -436,7 +444,10 @@ async fn test_expunge_message_payload() {
         )
         .await
         .unwrap();
-    assert_eq!(msg.payload, payload);
+    assert_eq!(
+        msg.payload.0.get(),
+        serde_json::to_string(&payload).unwrap()
+    );
 
     let _: IgnoredResponse = client
         .delete(
@@ -454,5 +465,5 @@ async fn test_expunge_message_payload() {
         .await
         .unwrap();
 
-    assert_eq!(msg.payload, serde_json::json!({"expired": true}));
+    assert_eq!(msg.payload.0.get(), r#"{"expired":true}"#);
 }
diff --git a/server/svix-server/tests/e2e_operational_webhooks.rs b/server/svix-server/tests/e2e_operational_webhooks.rs
index e967bbfd8..53d969cb4 100644
--- a/server/svix-server/tests/e2e_operational_webhooks.rs
+++ b/server/svix-server/tests/e2e_operational_webhooks.rs
@@ -8,6 +8,7 @@ use http::StatusCode;
 
 use reqwest::Url;
 use serde::Deserialize;
+use svix::api::EventTypeOut;
 use svix_ksuid::KsuidLike;
 use svix_server::{
     cfg::ConfigurationInner,
@@ -420,3 +421,24 @@ async fn test_message_attempt_operational_webhooks() {
         panic!("Invalid type for op_webhook_out")
     }
 }
+
+#[tokio::test]
+async fn test_operational_webhooks_event_types_exist() {
+    let cfg = get_default_test_config();
+    let (_, client_op, _, _jh) = start_svix_server_with_operational_webhooks(cfg);
+
+    for et in &[
+        "message.attempt.failing",
+        "message.attempt.exhausted",
+        "endpoint.created",
+        "endpoint.deleted",
+        "endpoint.disabled",
+        "endpoint.created",
+        "endpoint.updated",
+    ] {
+        let _: EventTypeOut = client_op
+            .get(&format!("api/v1/event-type/{et}/"), StatusCode::OK)
+            .await
+            .unwrap();
+    }
+}
diff --git a/server/svix-server/tests/queue.rs b/server/svix-server/tests/queue.rs
index 7a4a04a0e..4c04e2d24 100644
--- a/server/svix-server/tests/queue.rs
+++ b/server/svix-server/tests/queue.rs
@@ -90,9 +90,12 @@ async fn test_many_queue_consumers_inner(prefix: &str, delay: Option<Duration>)
                 loop {
                     tokio::select! {
                         recv = c.receive_all() => {
-                            let mut recv = recv.unwrap();
+                            let recv = recv.unwrap();
                             read += recv.len();
-                            out.append(&mut recv);
+                            for r in recv {
+                                out.push(task_queue_delivery_to_u16(&r));
+                                r.ack().await.unwrap();
+                            }
                         }
                         _ = tokio::time::sleep(Duration::from_millis(1000)) => {
                             break;
@@ -108,7 +111,7 @@ async fn test_many_queue_consumers_inner(prefix: &str, delay: Option<Duration>)
     // Create a Vec with all the threads' outputs
     let mut out = Vec::new();
     for jh in join_handles {
-        let (mut jh_out, read): (Vec<TaskQueueDelivery>, usize) = jh.join().unwrap();
+        let (mut jh_out, read): (Vec<u16>, usize) = jh.join().unwrap();
         out.append(&mut jh_out);
 
         if read < 5 {
@@ -117,11 +120,7 @@ async fn test_many_queue_consumers_inner(prefix: &str, delay: Option<Duration>)
     }
 
     // Sort it by the message ID
-    out.sort_by(|a: &TaskQueueDelivery, b: &TaskQueueDelivery| {
-        let a = task_queue_delivery_to_u16(a);
-        let b = task_queue_delivery_to_u16(b);
-        a.cmp(&b)
-    });
+    out.sort();
 
     // Then assert that all the messages are there
 
@@ -130,7 +129,7 @@ async fn test_many_queue_consumers_inner(prefix: &str, delay: Option<Duration>)
     // Genreally, however, this lint is actually good practice.
     #[allow(clippy::needless_range_loop)]
     for index in 0..1000 {
-        assert_eq!(task_queue_delivery_to_u16(&out[index]) as usize, index + 1);
+        assert_eq!(out[index] as usize, index + 1);
     }
 }
 
diff --git a/server/svix-server/tests/utils/common_calls.rs b/server/svix-server/tests/utils/common_calls.rs
index eaf878479..16d263820 100644
--- a/server/svix-server/tests/utils/common_calls.rs
+++ b/server/svix-server/tests/utils/common_calls.rs
@@ -21,7 +21,7 @@ use svix_server::{
             auth::AppPortalAccessIn,
             endpoint::{EndpointIn, EndpointOut, RecoverIn},
             event_type::EventTypeIn,
-            message::{MessageIn, MessageOut},
+            message::{MessageIn, MessageOut, RawPayload},
         },
         utils::ListResponse,
     },
@@ -116,7 +116,7 @@ pub async fn put_endpoint(
 pub fn message_in<T: Serialize>(event_type: &str, payload: T) -> Result<MessageIn> {
     Ok(MessageIn {
         event_type: EventTypeName(event_type.to_owned()),
-        payload: serde_json::to_value(payload)?,
+        payload: RawPayload::from_string(serde_json::to_string(&payload)?)?,
         payload_retention_period: 5,
         channels: None,
         uid: None,
@@ -160,7 +160,7 @@ pub async fn create_test_msg_with(
             &format!("api/v1/app/{}/msg/", &app_id),
             MessageIn {
                 event_type: EventTypeName(event_type.to_owned()),
-                payload,
+                payload: RawPayload::from_string(serde_json::to_string(&payload).unwrap()).unwrap(),
                 payload_retention_period: 5,
                 channels,
                 uid: None,
@@ -367,8 +367,8 @@ pub async fn common_test_list<
 }
 
 pub async fn recover_webhooks(client: &TestClient, since: DateTime<Utc>, url: &str) {
-    let _: serde_json::Value = client
-        .post(url, RecoverIn { since }, StatusCode::ACCEPTED)
+    client
+        .post_without_response(url, RecoverIn { since }, StatusCode::ACCEPTED)
         .await
         .unwrap();
 }
diff --git a/server/svix-server/tests/utils/mod.rs b/server/svix-server/tests/utils/mod.rs
index fe722641f..a605ca91f 100644
--- a/server/svix-server/tests/utils/mod.rs
+++ b/server/svix-server/tests/utils/mod.rs
@@ -123,6 +123,35 @@ impl TestClient {
         }
     }
 
+    pub async fn post_without_response<I: Serialize>(
+        &self,
+        endpoint: &str,
+        input: I,
+        expected_code: StatusCode,
+    ) -> Result<()> {
+        let mut req = self.client.post(self.build_uri(endpoint));
+        req = self.add_headers(req).json(&input);
+
+        let resp = req.send().await;
+        match resp {
+            Ok(resp) => {
+                if resp.status() != expected_code {
+                    anyhow::bail!(
+                        "assertation failed: expected status {}, actual status {}",
+                        expected_code,
+                        resp.status()
+                    );
+                }
+
+                Ok(())
+            }
+            Err(e) => {
+                println!("Unexpected request error: {e:?}");
+                Err(e.into())
+            }
+        }
+    }
+
     pub async fn post_with_idempotency<I: Serialize, O: DeserializeOwned>(
         &self,
         endpoint: &str,
diff --git a/server/testing-docker-compose.yml b/server/testing-docker-compose.yml
index a3151d8c0..5c3212299 100644
--- a/server/testing-docker-compose.yml
+++ b/server/testing-docker-compose.yml
@@ -10,13 +10,13 @@ services:
       - "5432:5432"
 
   redis:
-    image: "redis:6.2-alpine"
+    image: "redis:7-alpine"
     ports:
       - "6379:6379"
 
   # Redis cluster
   redis-cluster:
-    image: "bitnami/redis-cluster:6.2"
+    image: "bitnami/redis-cluster:7.0"
     environment:
       ALLOW_EMPTY_PASSWORD: "yes"
       REDIS_NODES: "redis-cluster redis-cluster-node-0 redis-cluster-node-1 redis-cluster-node-2 redis-cluster-node-3 redis-cluster-node-4"
@@ -32,7 +32,7 @@ services:
       - redis-cluster-node-4
 
   redis-cluster-node-0:
-    image: "bitnami/redis-cluster:6.2"
+    image: "bitnami/redis-cluster:7.0"
     ports:
       - "6381:6379"
     environment:
@@ -40,7 +40,7 @@ services:
       REDIS_NODES: "redis-cluster redis-cluster-node-0 redis-cluster-node-1 redis-cluster-node-2 redis-cluster-node-3 redis-cluster-node-4"
 
   redis-cluster-node-1:
-    image: "bitnami/redis-cluster:6.2"
+    image: "bitnami/redis-cluster:7.0"
     ports:
       - "6382:6379"
     environment:
@@ -48,7 +48,7 @@ services:
       REDIS_NODES: "redis-cluster redis-cluster-node-0 redis-cluster-node-1 redis-cluster-node-2 redis-cluster-node-3 redis-cluster-node-4"
 
   redis-cluster-node-2:
-    image: "bitnami/redis-cluster:6.2"
+    image: "bitnami/redis-cluster:7.0"
     ports:
       - "6383:6379"
     environment:
@@ -56,7 +56,7 @@ services:
       REDIS_NODES: "redis-cluster redis-cluster-node-0 redis-cluster-node-1 redis-cluster-node-2 redis-cluster-node-3 redis-cluster-node-4"
 
   redis-cluster-node-3:
-    image: "bitnami/redis-cluster:6.2"
+    image: "bitnami/redis-cluster:7.0"
     ports:
       - "6384:6379"
     environment:
@@ -64,13 +64,27 @@ services:
       REDIS_NODES: "redis-cluster redis-cluster-node-0 redis-cluster-node-1 redis-cluster-node-2 redis-cluster-node-3 redis-cluster-node-4"
 
   redis-cluster-node-4:
-    image: "bitnami/redis-cluster:6.2"
+    image: "bitnami/redis-cluster:7.0"
     ports:
       - "6385:6379"
     environment:
       ALLOW_EMPTY_PASSWORD: "yes"
       REDIS_NODES: "redis-cluster redis-cluster-node-0 redis-cluster-node-1 redis-cluster-node-2 redis-cluster-node-3 redis-cluster-node-4"
 
+  rabbitmq:
+    image: rabbitmq:3.11.13-management-alpine
+    ports:
+      - "5672:5672"
+      - "15672:15672"
+    environment:
+      RABBITMQ_DEFAULT_USER: "xivs"
+      RABBITMQ_DEFAULT_PASS: "xivs"
+      RABBITMQ_PLUGINS_DIR: "/opt/rabbitmq/plugins:/usr/lib/rabbitmq/plugins"
+    volumes:
+      - rabbitmq_data:/var/lib/rabbitmq
+      - ./rabbit/enabled_plugins:/etc/rabbitmq/enabled_plugins
+      - ./rabbit/plugins:/usr/lib/rabbitmq/plugins
+
 volumes:
   postgres-data:
-
+  rabbitmq_data: