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

Issue:
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:
Oh, you're right! It looks like the new parameter wasn't added to the libs. We'll take a look this week.

Fix patch:
diff --git a/ChangeLog.md b/ChangeLog.md
index 03ccf37bd..4cce6a278 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,6 +1,7 @@
 # Changelog
 
 ## Next
+* Libs: update OpenAPI spec
 * Libs/Go: add missing `endpoint_id` option to list attempts by msg.
 * Libs/JavaScript: add missing `withContent` field to `MessageListOptions`.
 
diff --git a/csharp/Svix/Message.cs b/csharp/Svix/Message.cs
index 8fb5c8f29..e12229c3d 100644
--- a/csharp/Svix/Message.cs
+++ b/csharp/Svix/Message.cs
@@ -127,7 +127,9 @@ public List<MessageOut> List(string appId, MessageListOptions options = null, st
                     options?.Channel,
                     options?.Before,
                     options?.After,
-                    options?.EventTypes);
+                    options?.WithContent,
+                    options?.EventTypes
+                    );
 
                 return lResponse?.Data;
             }
@@ -153,6 +155,7 @@ public async Task<List<MessageOut>> ListAsync(string appId, MessageListOptions o
                     options?.Channel,
                     options?.Before,
                     options?.After,
+                    options?.WithContent,
                     options?.EventTypes,
                     cancellationToken);
 
diff --git a/csharp/Svix/MessageAttempt.cs b/csharp/Svix/MessageAttempt.cs
index 566a3b0c8..bea94daf3 100644
--- a/csharp/Svix/MessageAttempt.cs
+++ b/csharp/Svix/MessageAttempt.cs
@@ -111,6 +111,7 @@ public async Task<List<EndpointMessageOut>> ListAttemptedMessagesAsync(string ap
                     (Svix.Model.MessageStatus?)options?.Status,
                     options?.Before,
                     options?.After,
+                    options?.WithContent,
                     cancellationToken);
 
                 return lResults?.Data;
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/go/endpoint.go b/go/endpoint.go
index 7fcee0ab7..22f96377a 100644
--- a/go/endpoint.go
+++ b/go/endpoint.go
@@ -192,7 +192,13 @@ func (e *Endpoint) GetStats(ctx context.Context, appId string, endpointId string
 }
 
 func (e *Endpoint) GetStatsWithOptions(ctx context.Context, appId string, endpointId string, options EndpointStatsOptions) (*EndpointStats, error) {
-	req := e.api.EndpointApi.V1EndpointGetStats(ctx, appId, endpointId, options.Since, options.Until)
+	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)
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 b297f2ffe..92febd88f 100644
--- a/go/internal/openapi/api_endpoint.go
+++ b/go/internal/openapi/api_endpoint.go
@@ -1156,14 +1156,12 @@ func (r ApiV1EndpointGetStatsRequest) Execute() (EndpointStats, *_nethttp.Respon
  * @param endpointId The ep's ID or UID
  * @return ApiV1EndpointGetStatsRequest
  */
-func (a *EndpointApiService) V1EndpointGetStats(ctx _context.Context, appId string, endpointId string, since *time.Time, until *time.Time) ApiV1EndpointGetStatsRequest {
+func (a *EndpointApiService) V1EndpointGetStats(ctx _context.Context, appId string, endpointId string) ApiV1EndpointGetStatsRequest {
 	return ApiV1EndpointGetStatsRequest{
 		ApiService: a,
 		ctx: ctx,
 		appId: appId,
 		endpointId: endpointId,
-		since: since,
-		until: until,
 	}
 }
 
diff --git a/go/internal/openapi/api_message.go b/go/internal/openapi/api_message.go
index 262c4dafe..69c994c70 100644
--- a/go/internal/openapi/api_message.go
+++ b/go/internal/openapi/api_message.go
@@ -29,6 +29,206 @@ var (
 // MessageApiService MessageApi service
 type MessageApiService service
 
+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
@@ -604,6 +804,7 @@ type ApiV1MessageListRequest struct {
 	channel *string
 	before *time.Time
 	after *time.Time
+	withContent *bool
 	eventTypes *[]string
 }
 
@@ -627,6 +828,10 @@ func (r ApiV1MessageListRequest) After(after time.Time) ApiV1MessageListRequest
 	r.after = &after
 	return r
 }
+func (r ApiV1MessageListRequest) WithContent(withContent bool) ApiV1MessageListRequest {
+	r.withContent = &withContent
+	return r
+}
 func (r ApiV1MessageListRequest) EventTypes(eventTypes []string) ApiV1MessageListRequest {
 	r.eventTypes = &eventTypes
 	return r
@@ -701,6 +906,9 @@ func (a *MessageApiService) V1MessageListExecute(r ApiV1MessageListRequest) (Lis
 	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
 		if reflect.TypeOf(t).Kind() == reflect.Slice {
diff --git a/go/internal/openapi/api_message_attempt.go b/go/internal/openapi/api_message_attempt.go
index 8788732ca..2f3efe787 100644
--- a/go/internal/openapi/api_message_attempt.go
+++ b/go/internal/openapi/api_message_attempt.go
@@ -781,6 +781,7 @@ type ApiV1MessageAttemptListAttemptedMessagesRequest struct {
 	status *MessageStatus
 	before *time.Time
 	after *time.Time
+	withContent *bool
 }
 
 func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Limit(limit int32) ApiV1MessageAttemptListAttemptedMessagesRequest {
@@ -807,6 +808,10 @@ func (r ApiV1MessageAttemptListAttemptedMessagesRequest) After(after time.Time)
 	r.after = &after
 	return r
 }
+func (r ApiV1MessageAttemptListAttemptedMessagesRequest) WithContent(withContent bool) ApiV1MessageAttemptListAttemptedMessagesRequest {
+	r.withContent = &withContent
+	return r
+}
 
 func (r ApiV1MessageAttemptListAttemptedMessagesRequest) Execute() (ListResponseEndpointMessageOut, *_nethttp.Response, error) {
 	return r.ApiService.V1MessageAttemptListAttemptedMessagesExecute(r)
@@ -888,6 +893,9 @@ func (a *MessageAttemptApiService) V1MessageAttemptListAttemptedMessagesExecute(
 	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{}
 
diff --git a/go/internal/openapi/client.go b/go/internal/openapi/client.go
index 13712a8e3..2bad55fba 100644
--- a/go/internal/openapi/client.go
+++ b/go/internal/openapi/client.go
@@ -58,6 +58,8 @@ type APIClient struct {
 
 	BackgroundTasksApi *BackgroundTasksApiService
 
+	BroadcastApi *BroadcastApiService
+
 	EndpointApi *EndpointApiService
 
 	EnvironmentApi *EnvironmentApiService
@@ -96,6 +98,7 @@ func NewAPIClient(cfg *Configuration) *APIClient {
 	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/model_background_task_type.go b/go/internal/openapi/model_background_task_type.go
index 1d51cf367..a7fba970c 100644
--- a/go/internal/openapi/model_background_task_type.go
+++ b/go/internal/openapi/model_background_task_type.go
@@ -23,12 +23,14 @@ 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 {
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/java/lib/src/main/java/com/svix/Message.java b/java/lib/src/main/java/com/svix/Message.java
index 1e02c9819..6e8642dba 100644
--- a/java/lib/src/main/java/com/svix/Message.java
+++ b/java/lib/src/main/java/com/svix/Message.java
@@ -25,6 +25,7 @@ public ListResponseMessageOut list(final String appId, final MessageListOptions
 					options.getChannel(),
 					options.getBefore(),
 					options.getAfter(),
+					options.getWithContent(),
 					new HashSet<>(options.getEventTypes())
 			);
 		} catch (com.svix.internal.ApiException e) {
diff --git a/java/lib/src/main/java/com/svix/MessageAttempt.java b/java/lib/src/main/java/com/svix/MessageAttempt.java
index b4304f6cb..1d47802e8 100644
--- a/java/lib/src/main/java/com/svix/MessageAttempt.java
+++ b/java/lib/src/main/java/com/svix/MessageAttempt.java
@@ -35,7 +35,7 @@ public ListResponseMessageAttemptOut listByMsg(final String appId, final String
 					options.getMessageStatus(),
 					options.getStatusCodeClass(),
 					options.getChannel(),
-					null,
+					options.getEndpointId(),
 					options.getBefore(),
 					options.getAfter(),
 					new HashSet<>(options.getEventTypes())
@@ -94,7 +94,8 @@ public ListResponseEndpointMessageOut listAttemptedMessages(final String appId,
 					options.getChannel(),
 					options.getMessageStatus(),
 					options.getBefore(),
-					options.getAfter()
+					options.getAfter(),
+					options.getWithContent()
 			);
 		} 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/kotlin/lib/src/main/kotlin/Message.kt b/kotlin/lib/src/main/kotlin/Message.kt
index 43e325f79..3cdc688e8 100644
--- a/kotlin/lib/src/main/kotlin/Message.kt
+++ b/kotlin/lib/src/main/kotlin/Message.kt
@@ -25,6 +25,7 @@ class Message internal constructor(token: String, options: SvixOptions) {
                 options.channel,
                 options.before,
                 options.after,
+                options.withContent,
                 HashSet(options.eventTypes)
             )
         } catch (e: Exception) {
diff --git a/kotlin/lib/src/main/kotlin/MessageAttempt.kt b/kotlin/lib/src/main/kotlin/MessageAttempt.kt
index 5af3f7c04..ba9c439a2 100644
--- a/kotlin/lib/src/main/kotlin/MessageAttempt.kt
+++ b/kotlin/lib/src/main/kotlin/MessageAttempt.kt
@@ -36,7 +36,7 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
                 options.messageStatus,
                 options.statusCodeClass,
                 options.channel,
-                null,
+                options.endpointId,
                 options.before,
                 options.after,
                 HashSet(options.eventTypes)
@@ -100,7 +100,8 @@ class MessageAttempt internal constructor(token: String, options: SvixOptions) {
                 options.channel,
                 options.messageStatus,
                 options.before,
-                options.after
+                options.after,
+                options.withContent
             )
         } 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/openapi.json b/openapi.json
index 61710d5c9..edcec83d7 100644
--- a/openapi.json
+++ b/openapi.json
@@ -326,7 +326,8 @@
                 "enum": [
                     "endpoint.replay",
                     "endpoint.recover",
-                    "application.stats"
+                    "application.stats",
+                    "message.broadcast"
                 ],
                 "type": "string"
             },
@@ -2420,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": {
@@ -6413,6 +6491,15 @@
                         },
                         "style": "form"
                     },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
                     {
                         "description": "The app's ID or UID",
                         "in": "path",
@@ -6589,6 +6676,144 @@
                 ]
             }
         },
+        "/api/v1/app/{app_id}/endpoint/{endpoint_id}/msg/test-attempt/": {
+            "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 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"
+                    },
+                    {
+                        "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": {
+                    "201": {
+                        "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"
+                    }
+                },
+                "security": [
+                    {
+                        "HTTPBearer": []
+                    }
+                ],
+                "summary": "Create Message Attempt For Endpoint",
+                "tags": [
+                    "Message"
+                ]
+            }
+        },
         "/api/v1/app/{app_id}/endpoint/{endpoint_id}/recover/": {
             "post": {
                 "description": "Resend all failed messages since a given time.",
@@ -9672,6 +9897,15 @@
                         },
                         "style": "form"
                     },
+                    {
+                        "in": "query",
+                        "name": "with_content",
+                        "schema": {
+                            "default": false,
+                            "type": "boolean"
+                        },
+                        "style": "form"
+                    },
                     {
                         "in": "query",
                         "name": "event_types",
@@ -14993,6 +15227,114 @@
                 ]
             }
         },
+        "/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": [
+                    {
+                        "description": "The request's idempotency key",
+                        "in": "header",
+                        "name": "idempotency-key",
+                        "schema": {
+                            "type": "string"
+                        },
+                        "style": "simple"
+                    }
+                ],
+                "requestBody": {
+                    "content": {
+                        "application/json": {
+                            "schema": {
+                                "$ref": "#/components/schemas/MessageBroadcastIn"
+                            }
+                        }
+                    },
+                    "required": true
+                },
+                "responses": {
+                    "202": {
+                        "content": {
+                            "application/json": {
+                                "schema": {
+                                    "$ref": "#/components/schemas/MessageBroadcastOut"
+                                }
+                            }
+                        },
+                        "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": "Create Broadcast Message",
+                "tags": [
+                    "Broadcast"
+                ]
+            }
+        },
         "/api/v1/stats/app/{app_id}/attempt/": {
             "get": {
                 "description": "Returns application-level statistics on message attempts",
@@ -15525,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": [
@@ -15532,7 +15878,8 @@
             "name": "General",
             "tags": [
                 "Application",
-                "Event Type"
+                "Event Type",
+                "Background Tasks"
             ]
         },
         {
diff --git a/rust/src/api.rs b/rust/src/api.rs
index 27406fbd3..95f3d6acd 100644
--- a/rust/src/api.rs
+++ b/rust/src/api.rs
@@ -736,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> {
@@ -759,6 +760,7 @@ impl<'a> Message<'a> {
             before,
             after,
             channel,
+            with_content,
         } = options.unwrap_or_default();
         Ok(message_api::v1_message_list(
             self.cfg,
@@ -770,6 +772,7 @@ impl<'a> Message<'a> {
                 before,
                 after,
                 channel,
+                with_content,
             },
         )
         .await?)
@@ -828,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> {
@@ -854,6 +859,8 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class,
+            endpoint_id,
+            with_content: _,
         } = options.unwrap_or_default();
         Ok(message_attempt_api::v1_message_attempt_list_by_msg(
             self.cfg,
@@ -868,7 +875,7 @@ impl<'a> MessageAttempt<'a> {
                 channel,
                 status,
                 status_code_class,
-                endpoint_id: None,
+                endpoint_id,
             },
         )
         .await?)
@@ -889,6 +896,8 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class,
+            endpoint_id: _,
+            with_content: _,
         } = options.unwrap_or_default();
         Ok(message_attempt_api::v1_message_attempt_list_by_endpoint(
             self.cfg,
@@ -923,6 +932,8 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class: _,
+            with_content,
+            endpoint_id: _,
         } = options.unwrap_or_default();
         Ok(
             message_attempt_api::v1_message_attempt_list_attempted_messages(
@@ -936,6 +947,7 @@ impl<'a> MessageAttempt<'a> {
                     after,
                     channel,
                     status,
+                    with_content,
                 },
             )
             .await?,
@@ -979,6 +991,8 @@ impl<'a> MessageAttempt<'a> {
             channel,
             status,
             status_code_class: _,
+            endpoint_id: _,
+            with_content: _,
         } = options.unwrap_or_default();
         Ok(
             message_attempt_api::v1_message_attempt_list_by_endpoint_deprecated(


Test patch: