diff --git a/.speakeasy/logs/changes/changes.html b/.speakeasy/logs/changes/changes.html
index 2f7facf23..ac64ac183 100644
--- a/.speakeasy/logs/changes/changes.html
+++ b/.speakeasy/logs/changes/changes.html
@@ -90,6 +90,36 @@
+Go SDK Changes:
+
+Outpost.Attempts.List(): response.Models[] Changed (Breaking ⚠️)
+
+Destination Added
+Event Changed (Breaking ⚠️)
+ResponseData Changed (Breaking ⚠️)
+
+Outpost.Attempts.Get(): response Changed (Breaking ⚠️)
+
+Destination Added
+Event Changed (Breaking ⚠️)
+ResponseData Changed (Breaking ⚠️)
+
+Outpost.Destinations.ListAttempts(): response.Models[] Changed (Breaking ⚠️)
+
+Destination Added
+Event Changed (Breaking ⚠️)
+ResponseData Changed (Breaking ⚠️)
+
+Outpost.Destinations.GetAttempt(): response Changed (Breaking ⚠️)
+
+Destination Added
+Event Changed (Breaking ⚠️)
+ResponseData Changed (Breaking ⚠️)
+
+Outpost.Metrics.GetEventMetrics(): Added
+Outpost.Metrics.GetAttemptMetrics(): Added
+
+
Typescript SDK Changes:
outpost.attempts.list(): response.models[] Changed (Breaking ⚠️)
diff --git a/.speakeasy/logs/changes/changes.md b/.speakeasy/logs/changes/changes.md
index e31fa7f1e..702bf5da5 100644
--- a/.speakeasy/logs/changes/changes.md
+++ b/.speakeasy/logs/changes/changes.md
@@ -1,3 +1,23 @@
+## Go SDK Changes:
+* `Outpost.Attempts.List()`: `response.Models[]` **Changed** (Breaking ⚠️)
+ - `Destination` **Added**
+ - `Event` **Changed** (Breaking ⚠️)
+ - `ResponseData` **Changed** (Breaking ⚠️)
+* `Outpost.Attempts.Get()`: `response` **Changed** (Breaking ⚠️)
+ - `Destination` **Added**
+ - `Event` **Changed** (Breaking ⚠️)
+ - `ResponseData` **Changed** (Breaking ⚠️)
+* `Outpost.Destinations.ListAttempts()`: `response.Models[]` **Changed** (Breaking ⚠️)
+ - `Destination` **Added**
+ - `Event` **Changed** (Breaking ⚠️)
+ - `ResponseData` **Changed** (Breaking ⚠️)
+* `Outpost.Destinations.GetAttempt()`: `response` **Changed** (Breaking ⚠️)
+ - `Destination` **Added**
+ - `Event` **Changed** (Breaking ⚠️)
+ - `ResponseData` **Changed** (Breaking ⚠️)
+* `Outpost.Metrics.GetEventMetrics()`: **Added**
+* `Outpost.Metrics.GetAttemptMetrics()`: **Added**
+
## Typescript SDK Changes:
* `outpost.attempts.list()`: `response.models[]` **Changed** (Breaking ⚠️)
- `destination` **Added**
diff --git a/.speakeasy/logs/changes/old.openapi.yaml b/.speakeasy/logs/changes/old.openapi.yaml
index 6d0cbed9d..b086ca97a 100644
--- a/.speakeasy/logs/changes/old.openapi.yaml
+++ b/.speakeasy/logs/changes/old.openapi.yaml
@@ -2172,11 +2172,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter tenants by ID(s). Use bracket notation for multiple values (e.g., `id[0]=t1&id[1]=t2` or `id[]=t1&id[]=t2`).
- name: limit
in: query
@@ -2361,21 +2359,17 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter events by ID(s). Use bracket notation for multiple values (e.g., `id[0]=abc&id[1]=def`).
- name: tenant_id
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: |
Filter events by tenant ID(s). Use bracket notation for multiple values (e.g., `tenant_id[0]=t1&tenant_id[1]=t2`).
When authenticated with a Tenant JWT, this parameter is ignored and the JWT's tenant is used.
@@ -2384,11 +2378,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter events by topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`).
- name: time[gte]
in: query
@@ -2558,11 +2550,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: |
Filter attempts by tenant ID(s). Use bracket notation for multiple values (e.g., `tenant_id[0]=t1&tenant_id[1]=t2`).
When authenticated with a Tenant JWT, this parameter is ignored and the JWT's tenant is used.
@@ -2571,21 +2561,17 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter attempts by event ID(s). Use bracket notation for multiple values (e.g., `event_id[0]=e1&event_id[1]=e2`).
- name: destination_id
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter attempts by destination ID(s). Use bracket notation for multiple values (e.g., `destination_id[0]=d1&destination_id[1]=d2`).
- name: status
in: query
@@ -2598,11 +2584,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter attempts by event topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`).
- name: time[gte]
in: query
@@ -2657,11 +2641,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: |
Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
@@ -2778,11 +2760,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: |
Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
@@ -2931,21 +2911,17 @@ paths:
in: query
required: false
schema:
- oneOf:
- - $ref: "#/components/schemas/DestinationType"
- - type: array
- items:
- $ref: "#/components/schemas/DestinationType"
+ type: array
+ items:
+ $ref: "#/components/schemas/DestinationType"
description: Filter destinations by type(s). Use bracket notation for multiple values (e.g., `type[0]=webhook&type[1]=aws_sqs`).
- name: topics
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter destinations by supported topic(s). Use bracket notation for multiple values (e.g., `topics[0]=user.created&topics[1]=user.deleted`).
responses:
"200":
@@ -3279,11 +3255,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter attempts by event ID(s). Use bracket notation for multiple values (e.g., `event_id[0]=e1&event_id[1]=e2`).
- name: status
in: query
@@ -3296,11 +3270,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: Filter attempts by event topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`).
- name: time[gte]
in: query
@@ -3355,11 +3327,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: |
Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
@@ -3461,11 +3431,9 @@ paths:
in: query
required: false
schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
+ type: array
+ items:
+ type: string
description: |
Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index a8f709596..1486f5abb 100644
--- a/.speakeasy/workflow.lock
+++ b/.speakeasy/workflow.lock
@@ -9,8 +9,8 @@ sources:
- 0.0.1
Outpost API (Go):
sourceNamespace: outpost-api
- sourceRevisionDigest: sha256:9a8a195371b0dddde46be4b4d643f98d4ad1011306f0f8cf40e2e008ae0f0b2e
- sourceBlobDigest: sha256:c4768c8648fbe077a9988fff6c1cc3826d17353eaf23c49b5bb4f88e4980e849
+ sourceRevisionDigest: sha256:d66dd7c6ff71be88a80a57f56609bd53e8bc7b18faa82e912c67f28f0073967f
+ sourceBlobDigest: sha256:493b98b664325d00c98a11bb3d556af035573398771826f9df1adbfed2384a24
tags:
- latest
- 0.0.1
@@ -25,10 +25,10 @@ targets:
outpost-go:
source: Outpost API (Go)
sourceNamespace: outpost-api
- sourceRevisionDigest: sha256:9a8a195371b0dddde46be4b4d643f98d4ad1011306f0f8cf40e2e008ae0f0b2e
- sourceBlobDigest: sha256:c4768c8648fbe077a9988fff6c1cc3826d17353eaf23c49b5bb4f88e4980e849
+ sourceRevisionDigest: sha256:d66dd7c6ff71be88a80a57f56609bd53e8bc7b18faa82e912c67f28f0073967f
+ sourceBlobDigest: sha256:493b98b664325d00c98a11bb3d556af035573398771826f9df1adbfed2384a24
codeSamplesNamespace: outpost-api-go-code-samples
- codeSamplesRevisionDigest: sha256:fa2dd0f0ec1437900004256eada093d0134f82db512c12a7cf059f928301215d
+ codeSamplesRevisionDigest: sha256:04d011ca0667a262a53f06e20cd9f1c41ceec3fe8107dbb01906ad89e7f947e7
outpost-python:
source: Outpost API (Python)
sourceNamespace: outpost-api
diff --git a/sdks/outpost-go/.speakeasy/gen.lock b/sdks/outpost-go/.speakeasy/gen.lock
index 039063330..beffd27c1 100644
--- a/sdks/outpost-go/.speakeasy/gen.lock
+++ b/sdks/outpost-go/.speakeasy/gen.lock
@@ -1,19 +1,19 @@
lockVersion: 2.0.0
id: f0627709-5a00-43ac-8678-ca716d6f379c
management:
- docChecksum: 9f9ff1119215b8ddec5bff30b20e09e4
+ docChecksum: 303920ca886857183138e55fb698076e
docVersion: 0.0.1
- speakeasyVersion: 1.755.0
- generationVersion: 2.865.2
- releaseVersion: 0.8.1
- configChecksum: f02c81872a9c1b3485067c91a779f409
+ speakeasyVersion: 1.759.1
+ generationVersion: 2.869.10
+ releaseVersion: 0.8.2
+ configChecksum: db7c4733c735e162777795a1362696b6
repoURL: https://github.com/hookdeck/outpost.git
repoSubDirectory: sdks/outpost-go
installationURL: https://github.com/hookdeck/outpost
persistentEdits:
- generation_id: 4de79089-e877-4b1b-8b39-945807a81ff0
- pristine_commit_hash: 9e4fded31dd17ea2a88c0a76460d9eec5bf09ef6
- pristine_tree_hash: 6995c7018d734deadad1ffae5b00cd941cd5ff02
+ generation_id: fbfea985-c960-40e1-8de6-130648f793d0
+ pristine_commit_hash: 4ef7c636d656405f7f2e360d5d700de112785625
+ pristine_tree_hash: 7e285f492eb44389c6c1662dd3a28f6846af16c5
features:
go:
additionalDependencies: 0.1.0
@@ -46,8 +46,8 @@ trackedFiles:
pristine_git_object: 302b1c4952b4902140fcd2a6b900b887733b3255
attempts.go:
id: f21bf72dadf3
- last_write_checksum: sha1:45a334f5b7b228c14d107fc4c03e8be237b8a6e1
- pristine_git_object: 51208c5f6ff4c90b9f7c5e2a18d9d940de93eae4
+ last_write_checksum: sha1:76951b5b57e890a1bd1540ecfbed4028850917b6
+ pristine_git_object: 82dbebf6b2ab9468d6e4f7c30c896bb3b3b2c949
destinations.go:
id: c850727f8555
last_write_checksum: sha1:e9dc75a06c150e1ea29a7135fb98f9a178396c5c
@@ -90,8 +90,8 @@ trackedFiles:
pristine_git_object: 71ddaa3bff7c43aa01c16c3b89c30ab09e66f732
docs/models/components/attempt.md:
id: 830868ab1006
- last_write_checksum: sha1:44985e03a38582e104feba2385c7ac86836be6c9
- pristine_git_object: 8372100a137f4b73f15c3dd6d867e54c8cd6c7e5
+ last_write_checksum: sha1:e66531bff7d20fdc97ee3d2af853be356b34c8fd
+ pristine_git_object: 86b670de7964a5ac4adb2b5a4cecd543a7f2e268
docs/models/components/attemptpaginatedresult.md:
id: 56e122fd3059
last_write_checksum: sha1:7a3213bad4fe3fe5d00a55b1355eee275c5cc588
@@ -356,6 +356,18 @@ trackedFiles:
id: 728948c70168
last_write_checksum: sha1:7c40945dac218ce5e5e11e7c907d27a3ea14c417
pristine_git_object: df1fdd59f3c85e4ba70573ff7954b12ac1d33d08
+ docs/models/components/metricsdatapoint.md:
+ id: dfbc8ed48932
+ last_write_checksum: sha1:4acc3e90d99abaeee4cf7169467132982f961ec7
+ pristine_git_object: af730affb0b930a7546e8ac0fab76278ffc79472
+ docs/models/components/metricsmetadata.md:
+ id: 09b0bc8b1617
+ last_write_checksum: sha1:6f3e1abd39378a7cabe79fea99328e301d8c86f3
+ pristine_git_object: f367062aba11780369dc5c43550a0ec49ab062d5
+ docs/models/components/metricsresponse.md:
+ id: c99709afc575
+ last_write_checksum: sha1:c9b2a561cfc884d53dbee7208b0aff55bf4c39d0
+ pristine_git_object: b9a2167dd564f2febeb6adb4849e35fb3bf06c24
docs/models/components/portalredirect.md:
id: bd1e51e1707f
last_write_checksum: sha1:f14dc9ef3182ec15849c2d2a56cc2db18fe1b8b4
@@ -476,10 +488,78 @@ trackedFiles:
id: b795ac6783b2
last_write_checksum: sha1:bc61c705302651aeeed1e3cb65f4c3880fb35825
pristine_git_object: 36fdba2e3a1e447f386a62fe5b70a452e35a59e6
+ docs/models/operations/filtersattemptnumber.md:
+ id: 3e38bcb79609
+ last_write_checksum: sha1:b74f4f77fbe5fba1398d7cb43a13e1bcf5f7b703
+ pristine_git_object: 354f7d4c79c406b779b1a35cb89f845bca2abff3
+ docs/models/operations/filterscode.md:
+ id: 11d407086ff1
+ last_write_checksum: sha1:a8348d0505dc70c0c917ce8f72c295e3d8ff37b8
+ pristine_git_object: c22660d27a53fb4ad24a7d0f326d188d8eab14fa
+ docs/models/operations/filtersmanual.md:
+ id: 0d3afc32fb66
+ last_write_checksum: sha1:eaf2f525ff7f1c44a2d118c08769bcb49280b98d
+ pristine_git_object: 963804309c940d750d57efeae7465543b484bcea
+ docs/models/operations/filtersstatus.md:
+ id: 288bb529766f
+ last_write_checksum: sha1:68bfa9a917d68e821e5ed5a7a9612dae13e3e5f7
+ pristine_git_object: c4597015ef819f334d307a135da5380f63cb78eb
+ docs/models/operations/filtersstatusenum1.md:
+ id: a9be4606ddf5
+ last_write_checksum: sha1:77323b7deaff38adcc6c295562ef842a633c263e
+ pristine_git_object: 7d42cba72fb8e61e18d7130278ed912f1b82773f
+ docs/models/operations/filtersstatusenum2.md:
+ id: 3eece9a873a7
+ last_write_checksum: sha1:e57919d264339dbb09fa870931d360454bf52274
+ pristine_git_object: d8bd54a950f6e5e5b40cb60781fe68e182553f0c
+ docs/models/operations/getattemptmetricsdimensionsenum1.md:
+ id: 34d0bcda1090
+ last_write_checksum: sha1:76ad1c4f21813ae9a9c2a7a792b99d7e68ced92e
+ pristine_git_object: 81dae1a2c15569a60c896e5c4e643dcf633d99c9
+ docs/models/operations/getattemptmetricsdimensionsenum2.md:
+ id: 10661da57a75
+ last_write_checksum: sha1:12da3ee112562d0ce955f65e79f47d2ef8700481
+ pristine_git_object: d8de2903e17482d5dd025371ae625c451ef7b7c4
+ docs/models/operations/getattemptmetricsdimensionsunion.md:
+ id: ce40423a335e
+ last_write_checksum: sha1:c3026491283c30570b6369aa572b8466fd280f0d
+ pristine_git_object: 4283cd846050e362148b9f07c4dffc2081fec6dc
+ docs/models/operations/getattemptmetricsfiltersdestinationid.md:
+ id: 6a00cec335e3
+ last_write_checksum: sha1:6dff65517fea2ccb1d2ea7721bc847c9e44a00ab
+ pristine_git_object: 5c072334cf946fa07c45584328cc23f9422cb40e
+ docs/models/operations/getattemptmetricsfilterstenantid.md:
+ id: 44ae32fc6953
+ last_write_checksum: sha1:d7864f805c1d13a09900713bbfd24a793265779a
+ pristine_git_object: c3850bb1bd046065808d5dbcdc65516bef0feeb9
+ docs/models/operations/getattemptmetricsfilterstopic.md:
+ id: 6c1ed722a603
+ last_write_checksum: sha1:5eb472937354345bccf3fac5367fbabf70efaaf1
+ pristine_git_object: 4f12ca072b0a8cee0b27359549a2471b1517581a
+ docs/models/operations/getattemptmetricsmeasuresenum1.md:
+ id: 4057a7c16751
+ last_write_checksum: sha1:3610684ca16502e539a1aa8c15a8e32c16c2f116
+ pristine_git_object: 089476203de0c31abdf5f33cfb816edf4df00d21
+ docs/models/operations/getattemptmetricsmeasuresenum2.md:
+ id: dfe6f415e02b
+ last_write_checksum: sha1:f6779514e6b1700cffaf6ae7751fd8dbb8acd418
+ pristine_git_object: 8453b07ef639178c259fd8dc88efdb9e292d1e85
+ docs/models/operations/getattemptmetricsmeasuresunion.md:
+ id: 454f41df243f
+ last_write_checksum: sha1:ed3ad8b4a0f803216c9665c47d56ad156a95e2fd
+ pristine_git_object: 44cc67051a611770fbc03f4f2091ecee86e090da
+ docs/models/operations/getattemptmetricsrequest.md:
+ id: accc5c32f0c1
+ last_write_checksum: sha1:dc7a24e0788bf28aa20400690739e43b0824f325
+ pristine_git_object: e4a450ce8ed982774481bd05a0cad940702a1b0d
+ docs/models/operations/getattemptmetricsresponse.md:
+ id: 69295ef2ea44
+ last_write_checksum: sha1:765207f47455d5bae79f60ce273d7d110750d5e8
+ pristine_git_object: 4edcac53a06b2afe897c5ed17fb3d4e4aed4b55e
docs/models/operations/getattemptrequest.md:
id: 58916c0b18d3
- last_write_checksum: sha1:b28ba005e425bb3208484b48ecf42109c7c60593
- pristine_git_object: dffc6fbb246101084e11aabf42df29f8717830c1
+ last_write_checksum: sha1:532c6786aaca0bdc63b302befd15e844742e0e82
+ pristine_git_object: 91ba0139f7dd125dedbe04cc6145c6f861741381
docs/models/operations/getattemptresponse.md:
id: c167b6fb6be1
last_write_checksum: sha1:1cd2a22dc75f0bb162f603d572273f9a9e8c4b5f
@@ -492,6 +572,50 @@ trackedFiles:
id: ddc808c51d22
last_write_checksum: sha1:55ba8aca411d0c24994bf9337502f10717506c07
pristine_git_object: ad61ebe1c989506ccf92da97dbed7365762a08c0
+ docs/models/operations/geteventmetricsdimensionsenum1.md:
+ id: c09d77f90607
+ last_write_checksum: sha1:8e5fd7e585aca586f26cd8e1d74d7cb170fc52e6
+ pristine_git_object: 82a63ae56caf29495e63ca0405f91c1f899ea951
+ docs/models/operations/geteventmetricsdimensionsenum2.md:
+ id: 96e65d2f3eb2
+ last_write_checksum: sha1:cdf4848c354d10baf3933ac1dbc9cc7800a69015
+ pristine_git_object: c1dd9adcf9241a368d520d3a488f2bda1cd10fe7
+ docs/models/operations/geteventmetricsdimensionsunion.md:
+ id: 7bc8cbf6b0b9
+ last_write_checksum: sha1:25f477b2d2e581b8ecdadbeb7236c48e0ec9ac87
+ pristine_git_object: 150d986c243bec573a956e8728fcd56e7128829e
+ docs/models/operations/geteventmetricsfiltersdestinationid.md:
+ id: 3848b6181583
+ last_write_checksum: sha1:99a2844d873501ec9110c10e3a32d1da2c4bb209
+ pristine_git_object: 4c5e374d167825b62c05f82b840408f346bef277
+ docs/models/operations/geteventmetricsfilterstenantid.md:
+ id: 3f1ff10bfc33
+ last_write_checksum: sha1:65427bc0b420521a2dc7ad8d2b755e574683ff9c
+ pristine_git_object: 417fd0be3418646fc2871016b471723745470ad8
+ docs/models/operations/geteventmetricsfilterstopic.md:
+ id: d653fc88c22c
+ last_write_checksum: sha1:01e6459aad971b9c1ce05389bf3dd7a108c89ae3
+ pristine_git_object: e61ae463ad4c0234301b6b1a29ea675a7f34a70f
+ docs/models/operations/geteventmetricsmeasuresenum1.md:
+ id: aff95eb8bafe
+ last_write_checksum: sha1:bc954a0671f1bae5784b2a6e90bc7a9b8b49a147
+ pristine_git_object: 146bab7a7b737239f194b1d671ee92d86171e53c
+ docs/models/operations/geteventmetricsmeasuresenum2.md:
+ id: 717cd1b20163
+ last_write_checksum: sha1:0fc87706e0fca81b410fbb1c4364492a5e676f70
+ pristine_git_object: daf4bcfd76220c47f010956bd503fd23cafe85c3
+ docs/models/operations/geteventmetricsmeasuresunion.md:
+ id: 6bc8aed73c02
+ last_write_checksum: sha1:6df28427c6229238e149fa4abef388fceee4c424
+ pristine_git_object: 3ad50814c22f67548f1f563512f666be486c775d
+ docs/models/operations/geteventmetricsrequest.md:
+ id: e149809d1e2c
+ last_write_checksum: sha1:13c5dbc3d2d3dee5d8f5b6d00a3b7aa3fca7cfeb
+ pristine_git_object: 6e4ccf4c68258ba99cab6890fa2a37c99cf2fc92
+ docs/models/operations/geteventmetricsresponse.md:
+ id: 033f139e5465
+ last_write_checksum: sha1:0d0f1ed89036c211103a9cf85456b3b8ac99c9c4
+ pristine_git_object: f220aebf283f270cdc3773caee17b59d8fc4d83b
docs/models/operations/geteventrequest.md:
id: ed4423b8e9dd
last_write_checksum: sha1:d3c74c42699e2fce61db02de129ca8fa02a0ec00
@@ -502,8 +626,8 @@ trackedFiles:
pristine_git_object: b91badabb475ffaeadaeb6030a11bc4c47245238
docs/models/operations/gettenantdestinationattemptrequest.md:
id: ba08fde2adc7
- last_write_checksum: sha1:d7c7c7bd153e9149afc65852e7f3bbf9366247ad
- pristine_git_object: 049c52de5ac404a266beb6d85aeb8d2391aa2c2a
+ last_write_checksum: sha1:e77c6280b9b7288146752a4bdd4067886421d049
+ pristine_git_object: 08d9b92e9df595fc1441f02f34755338fc8a830e
docs/models/operations/gettenantdestinationattemptresponse.md:
id: a3d87920e70c
last_write_checksum: sha1:94c25e711ef5320350a137fc58fdef479022f7f8
@@ -566,8 +690,8 @@ trackedFiles:
pristine_git_object: 021610147662ccba72666c2c460084c201250be5
docs/models/operations/listattemptsrequest.md:
id: c664c21b68cc
- last_write_checksum: sha1:38fe46ce82fd345cfc36e7eb3ea4ba0a465543a1
- pristine_git_object: 8a4b24dcea60eefabeb329c02d32a457e829b852
+ last_write_checksum: sha1:63ca7fb4c2c62e0ea87b5389e108b296b166e2bb
+ pristine_git_object: 78b1d2e3e0d1d286fccfb774dd3dfc1e20cbae11
docs/models/operations/listattemptsresponse.md:
id: fa9c919a289b
last_write_checksum: sha1:6eed5efa749686ef922a53fef7fe3b6852355dae
@@ -606,8 +730,8 @@ trackedFiles:
pristine_git_object: 289bab4419ad077e95a8418271d9646621d17131
docs/models/operations/listtenantdestinationattemptsrequest.md:
id: 341955bbcb29
- last_write_checksum: sha1:9bfe6816b6c8c4a9ddc30a56c7d87533df696505
- pristine_git_object: bf2e6bc3f5aa3e5e3a6765b8e7456b74aeafa420
+ last_write_checksum: sha1:2065c862bf038bbcc7779e4171cd318bc53e2659
+ pristine_git_object: 91a13034062d0196876c501febb2aa0ac60ad331
docs/models/operations/listtenantdestinationattemptsresponse.md:
id: 2e6018891322
last_write_checksum: sha1:279b89417ca9c301009d0a4c92a98587a4f82583
@@ -686,12 +810,12 @@ trackedFiles:
pristine_git_object: 2ee4dd095128cac6926139658e39e3e815e51396
docs/sdks/attempts/README.md:
id: 41a6f5edd623
- last_write_checksum: sha1:42ab97552d7b07e7461967a2bcee9e031eb452f8
- pristine_git_object: 91b2d248eb0315301f7e8cbea3c04e49968fa7dd
+ last_write_checksum: sha1:414ba3650e78fa7000a97ae33ec8f3c840bb63b5
+ pristine_git_object: 7b31816cf89d5bd51a9356a91c7351b43f93e8eb
docs/sdks/destinations/README.md:
id: e83d288899aa
- last_write_checksum: sha1:87a4fa0ab33895feb2dc8e27edece39fb4e5a90c
- pristine_git_object: 0de1f256b179b31232574fdc003020efdb97ec5f
+ last_write_checksum: sha1:7334c67e08e0422563eb2780513dbca8f15554b6
+ pristine_git_object: 91402ab569f5f4898f212310ac06fecc0371b706
docs/sdks/events/README.md:
id: cf45a4390b9b
last_write_checksum: sha1:89e2774d5d34b8822b6e9df9d2e9f1e0fabbf321
@@ -700,6 +824,10 @@ trackedFiles:
id: 5082c50d5e82
last_write_checksum: sha1:23157d5489dfa44c296067f57581ada0ad7ee463
pristine_git_object: 56cf1acd9d15018b231328e0cac0f84a11f4af5f
+ docs/sdks/metrics/README.md:
+ id: a8545d964e21
+ last_write_checksum: sha1:d4409bb14996e5c684c65c75ed437203bf5759ae
+ pristine_git_object: f2194dbf971c234cf51cb4e043a05d710a12e75e
docs/sdks/publish/README.md:
id: 370ef5537c93
last_write_checksum: sha1:ca3f50a154544a3aafbb9ee95b8e1a592ddee43a
@@ -788,6 +916,10 @@ trackedFiles:
id: 1133b2a27019
last_write_checksum: sha1:c03378176a107205b8938606faef3fd8fb8f91a0
pristine_git_object: a614e37673d3ea81eabc6139236edfb22a15dc55
+ metrics.go:
+ id: 9539b0d0fd18
+ last_write_checksum: sha1:5a55de3671de88e538697160706e90df66ae6829
+ pristine_git_object: 199f17173ef8eb293c03429fec0b88661235b2a8
models/apierrors/apierror.go:
id: 4cecf27a5a54
last_write_checksum: sha1:e699d3325ea82ea2b0d29656396210f0513c3391
@@ -826,8 +958,8 @@ trackedFiles:
pristine_git_object: 7a24725d255c9bb5620dcd8e128b1b9b4965469b
models/components/attempt.go:
id: f1a7ba25d0ee
- last_write_checksum: sha1:f5e063482f8386df36fd49e4794bc6f3a1b10246
- pristine_git_object: d47ceaf6bd3b04621061b6af82795a2678ee7ead
+ last_write_checksum: sha1:d72beba9cf6e7e4f8b8d967bac463b286d528bc6
+ pristine_git_object: 41ced248dddc08c10132904911bb7a05f1670385
models/components/attemptpaginatedresult.go:
id: 9540a56f5184
last_write_checksum: sha1:f30c24734f4388bf1080447828cbc7dfc2466484
@@ -988,18 +1120,10 @@ trackedFiles:
id: 3382b9f29930
last_write_checksum: sha1:ff5c3780b7e17614eecc25b6a59bbf9ce5469cef
pristine_git_object: 8c0b77e890bbb512adf9cc3632448e61749b318b
- models/components/eventfull.go:
- id: c15f9a36e30e
- last_write_checksum: sha1:ae8641b280ba8bb6ea80a5786c695b43b2fca3e6
- pristine_git_object: 870ed875350d24e03dcb772b32809c4c6404c658
models/components/eventpaginatedresult.go:
id: d5bf76e9c0f5
last_write_checksum: sha1:0aa59e112bc9547471480c6a0fe594042c8717a0
pristine_git_object: 686b14c89f9d4739a5c9bed097ec8ffaa3909dbb
- models/components/eventsummary.go:
- id: 51083012e78e
- last_write_checksum: sha1:ec095e8c179b0363ca40452f03e6fd373e5dc227
- pristine_git_object: d378f04d5eba8385d12b1af963aa03476afff644
models/components/gcppubsubconfig.go:
id: d2d3b56c9d41
last_write_checksum: sha1:2e170005719447bbd61e4c38b30280cf83aaa7cf
@@ -1016,6 +1140,18 @@ trackedFiles:
id: 790bad4a7abb
last_write_checksum: sha1:01a20fcff33179809ff9920ee431c7adabbd98f1
pristine_git_object: 148ec47fb2dea6c188ec68eb3532d93169608168
+ models/components/metricsdatapoint.go:
+ id: 7a1d3a5a8a04
+ last_write_checksum: sha1:02da0e664e4bf174f371398344a5e50117ba52b8
+ pristine_git_object: bbaa6c1ede1f2f2e850d0fb7bba62294d75735df
+ models/components/metricsmetadata.go:
+ id: d6585509ad49
+ last_write_checksum: sha1:b49d91cad81cee6df33dae9040beb55d17c30f79
+ pristine_git_object: ec2077890831855bc43e3e33b5713260c97e9338
+ models/components/metricsresponse.go:
+ id: 3e26d776c914
+ last_write_checksum: sha1:7042d03bacd00472079ff66646552df9cc591b19
+ pristine_git_object: 95d8b89893847fd870245e93ed56044f5bde2541
models/components/portalredirect.go:
id: 10570f8d72fd
last_write_checksum: sha1:9ec6aeeef52f427e79b8c8c16f6c77cc2d7fc4b3
@@ -1106,8 +1242,12 @@ trackedFiles:
pristine_git_object: 8612b4b6a5732b83935fc1509b10765bbc7a6778
models/operations/getattempt.go:
id: 5bdbb1b54eed
- last_write_checksum: sha1:64d55a0ad5aaeb722c281e6d4b907bab1ee4de56
- pristine_git_object: f2c75fc33fe5340103fd24186c5cc3791b92b047
+ last_write_checksum: sha1:20c4c4f3ac2b9a8c1a6ccf2095aae9db75d9351b
+ pristine_git_object: 907ae735e91bdcceab2bf5da76b33e26bc1d52d2
+ models/operations/getattemptmetrics.go:
+ id: 2cba7e6f3d47
+ last_write_checksum: sha1:647b7b5fb7ec2e2a5c9bc819a134bdf7593e1a6f
+ pristine_git_object: 4b4f7ed553b19e9ba37ae6bc4df8aa0f231ad2ad
models/operations/getdestinationtypeschema.go:
id: 469bb274efa3
last_write_checksum: sha1:4432b390507c74248fbd263cfebc10e51297b05e
@@ -1116,6 +1256,10 @@ trackedFiles:
id: c0f52659220b
last_write_checksum: sha1:af461521a094389ef681c192b8e7c74f472aece7
pristine_git_object: 8d41e63c252ffaaa3b8c44846524199dc0102fd9
+ models/operations/geteventmetrics.go:
+ id: c1ef3d39de67
+ last_write_checksum: sha1:1709de17267819766bf58b60b72c0eb2166570b8
+ pristine_git_object: 87fab145fae4a0c7b452c14f9472aab73edb8e2f
models/operations/gettenant.go:
id: 24249036c6f1
last_write_checksum: sha1:67bf3e92f96199335f6ed7efb615a5f5d76a4131
@@ -1126,8 +1270,8 @@ trackedFiles:
pristine_git_object: 156a49b5516c8c20421406c97ab2925308472353
models/operations/gettenantdestinationattempt.go:
id: f1b412ffe1c3
- last_write_checksum: sha1:f67d59e7d5b99b95abd6b655c59814d0c9ede810
- pristine_git_object: 5a8f9a6f8cfd94cc43bd73240a00b708d3e722c3
+ last_write_checksum: sha1:09ebfb6f5e1f22897c9ff6713b29d5cf2dde70a8
+ pristine_git_object: 1a2d2e171ecb0662fe6b9eeecbbf221f1ac188a3
models/operations/gettenantportalurl.go:
id: 5430be50389e
last_write_checksum: sha1:872ba375dc6429ec504915a5bbb6fa7450ad3149
@@ -1142,8 +1286,8 @@ trackedFiles:
pristine_git_object: 0dd35327c5d50f6989eb6efc122bbc494a2321fe
models/operations/listattempts.go:
id: 2aa25aef61af
- last_write_checksum: sha1:5ec578e7b32381f892892ee2e9281d01714f743a
- pristine_git_object: aa71fe196d29b14f2af5991d32665fd897d860bf
+ last_write_checksum: sha1:7674c11c6528423578c9222392dfd0480991caf3
+ pristine_git_object: 9b77f5298e48b215b81a92417030640764fca8fe
models/operations/listdestinationtypeschemas.go:
id: d2e665967050
last_write_checksum: sha1:a001a482905b714996e6379d376970e46f67980e
@@ -1154,8 +1298,8 @@ trackedFiles:
pristine_git_object: bc2dcf28c93ddab219eecad93c918e3aa37fc07b
models/operations/listtenantdestinationattempts.go:
id: d8e07f679505
- last_write_checksum: sha1:a743b5f84749827e9037c8120db1cbbca69c3f89
- pristine_git_object: 883ad4769654f30d3037a4136a4e0a08439ccabd
+ last_write_checksum: sha1:88cfb02129699c4daa4fdd32fe9765fa4891606b
+ pristine_git_object: b0c5305554cc4451c415045383478b7e8cf9ff13
models/operations/listtenantdestinations.go:
id: ce62042d8804
last_write_checksum: sha1:65aa11c2afd66d0e3b37adfa188d51d94808374c
@@ -1198,8 +1342,8 @@ trackedFiles:
pristine_git_object: e6e5a01c6e721e879e24a38a1f97e3e27d4686d4
outpost.go:
id: 7aebc57e3f81
- last_write_checksum: sha1:45f644d95df8abbd46de76275178f0425a003c9a
- pristine_git_object: ece5f32e51108940106cd935c05a2c8c1d39a6af
+ last_write_checksum: sha1:f8e3ae12507986b95358c5b816c1bf5d609c4146
+ pristine_git_object: ba6c4ec49bbfabe9886cc43db843b614df2367ba
publish.go:
id: b4cd78c909e0
last_write_checksum: sha1:2591f3410b71150c66f40f3c9448e35594e4b6ab
@@ -1679,12 +1823,74 @@ examples:
responses:
"200":
application/json: {"models": [{"id": "del_123", "status": "success", "time": "2024-01-01T00:00:05Z", "code": "200", "attempt_number": 1, "event_id": "evt_123", "destination_id": "des_456", "event": {"id": "evt_123", "topic": "user.created", "time": "2024-01-01T00:00:00Z", "eligible_for_retry": false, "metadata": {"source": "crm"}}}], "pagination": {"order_by": "time", "dir": "desc", "limit": 100, "next": null, "prev": null}}
+ getEventMetrics:
+ speakeasy-default-get-event-metrics:
+ parameters:
+ query:
+ time[start]: "2026-03-02T00:00:00Z"
+ time[end]: "2026-03-03T00:00:00Z"
+ granularity: "1h"
+ measures: ["count"]
+ responses:
+ "200":
+ application/json: {"data": [{"time_bucket": "2026-03-02T14:00:00Z", "dimensions": {"destination_id": "dest_abc", "topic": "user.created"}, "metrics": {"count": 1423, "error_rate": 0.02}}], "metadata": {"granularity": "1h", "query_time_ms": 42, "row_count": 2, "row_limit": 100000, "truncated": false}}
+ "400":
+ application/json: {}
+ "401":
+ application/json: {}
+ "403":
+ application/json: {"status": 422, "message": "validation error", "data": ["email is required", "password must be at least 6 characters"]}
+ "500":
+ application/json: {}
+ HourlyEventCount:
+ parameters:
+ query:
+ time[start]: "2026-03-02T00:00:00Z"
+ time[end]: "2026-03-03T00:00:00Z"
+ granularity: "1h"
+ measures: ["count"]
+ responses:
+ "200":
+ application/json: {"data": [{"time_bucket": "2026-03-02T14:00:00Z", "dimensions": {"topic": "user.created"}, "metrics": {"count": 1423}}, {"time_bucket": "2026-03-02T15:00:00Z", "dimensions": {"topic": "user.created"}, "metrics": {"count": 1891}}], "metadata": {"granularity": "1h", "query_time_ms": 42, "row_count": 2, "row_limit": 100000, "truncated": false}}
+ getAttemptMetrics:
+ speakeasy-default-get-attempt-metrics:
+ parameters:
+ query:
+ time[start]: "2026-03-02T00:00:00Z"
+ time[end]: "2026-03-03T00:00:00Z"
+ granularity: "1h"
+ measures: ["count", "error_rate"]
+ responses:
+ "200":
+ application/json: {"data": [{"time_bucket": "2026-03-02T14:00:00Z", "dimensions": {"destination_id": "dest_abc", "topic": "user.created"}, "metrics": {"count": 1423, "error_rate": 0.02}}], "metadata": {"granularity": "1h", "query_time_ms": 42, "row_count": 2, "row_limit": 100000, "truncated": false}}
+ "400":
+ application/json: {}
+ "401":
+ application/json: {}
+ "403":
+ application/json: {"status": 422, "message": "validation error", "data": ["email is required", "password must be at least 6 characters"]}
+ "500":
+ application/json: {}
+ DailyAttemptCounts:
+ parameters:
+ query:
+ time[start]: "2026-03-02T00:00:00Z"
+ time[end]: "2026-03-03T00:00:00Z"
+ granularity: "1h"
+ measures: ["count", "error_rate"]
+ responses:
+ "200":
+ application/json: {"data": [{"time_bucket": "2026-03-02T00:00:00Z", "dimensions": {"destination_id": "dest_abc"}, "metrics": {"count": 1423, "successful_count": 1393, "failed_count": 30, "error_rate": 0.0211}}], "metadata": {"granularity": "1d", "query_time_ms": 38, "row_count": 1, "row_limit": 100000, "truncated": false}}
examplesVersion: 1.0.2
generatedTests: {}
releaseNotes: |
## Go SDK Changes:
- * `Outpost.Schemas.ListDestinationTypes()`: `response.[].ConfigFields[].Type.Enum(keyValueMap)` **Added** (Breaking ⚠️)
- * `Outpost.Schemas.GetDestinationType()`: `response.ConfigFields[].Type.Enum(keyValueMap)` **Added** (Breaking ⚠️)
+ * `Outpost.Attempts.List()`: `response.Models[]` **Changed** (Breaking ⚠️)
+ * `Outpost.Attempts.Get()`: `response` **Changed** (Breaking ⚠️)
+ * `Outpost.Destinations.ListAttempts()`: `response.Models[]` **Changed** (Breaking ⚠️)
+ * `Outpost.Destinations.GetAttempt()`: `response` **Changed** (Breaking ⚠️)
+ * `Outpost.Metrics.GetEventMetrics()`: **Added**
+ * `Outpost.Metrics.GetAttemptMetrics()`: **Added**
generatedFiles:
- .gitattributes
- /models/apierrors/badrequesterror.go
diff --git a/sdks/outpost-go/.speakeasy/gen.yaml b/sdks/outpost-go/.speakeasy/gen.yaml
index 72e02f867..d08591952 100644
--- a/sdks/outpost-go/.speakeasy/gen.yaml
+++ b/sdks/outpost-go/.speakeasy/gen.yaml
@@ -29,7 +29,7 @@ generation:
generateNewTests: false
skipResponseBodyAssertions: false
go:
- version: 0.8.1
+ version: 0.8.2
additionalDependencies: {}
allowUnknownFieldsInWeakUnions: false
baseErrorName: OutpostError
diff --git a/sdks/outpost-go/README.md b/sdks/outpost-go/README.md
index df3663e0c..5e144cf91 100644
--- a/sdks/outpost-go/README.md
+++ b/sdks/outpost-go/README.md
@@ -147,6 +147,11 @@ func main() {
* [Check](docs/sdks/health/README.md#check) - Health Check
+### [Metrics](docs/sdks/metrics/README.md)
+
+* [GetEventMetrics](docs/sdks/metrics/README.md#geteventmetrics) - Get Event Metrics
+* [GetAttemptMetrics](docs/sdks/metrics/README.md#getattemptmetrics) - Get Attempt Metrics
+
### [Publish](docs/sdks/publish/README.md)
* [Event](docs/sdks/publish/README.md#event) - Publish Event
diff --git a/sdks/outpost-go/RELEASES.md b/sdks/outpost-go/RELEASES.md
index f157551d2..b38c8a707 100644
--- a/sdks/outpost-go/RELEASES.md
+++ b/sdks/outpost-go/RELEASES.md
@@ -118,4 +118,14 @@ Based on:
### Generated
- [go v0.8.1] sdks/outpost-go
### Releases
-- [Go v0.8.1] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v0.8.1 - sdks/outpost-go
\ No newline at end of file
+- [Go v0.8.1] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v0.8.1 - sdks/outpost-go
+
+## 2026-03-24 16:46:42
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.759.1 (2.869.10) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [go v0.8.2] sdks/outpost-go
+### Releases
+- [Go v0.8.2] https://github.com/hookdeck/outpost/releases/tag/sdks/outpost-go/v0.8.2 - sdks/outpost-go
\ No newline at end of file
diff --git a/sdks/outpost-go/attempts.go b/sdks/outpost-go/attempts.go
index 51208c5f6..82dbebf6b 100644
--- a/sdks/outpost-go/attempts.go
+++ b/sdks/outpost-go/attempts.go
@@ -35,6 +35,7 @@ import (
// - `include=event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
// - `include=event.data`: Include full event with payload data
// - `include=response_data`: Include response body and headers from the attempt
+// - `include=destination`: Include the full destination object with target information
type Attempts struct {
rootSDK *Outpost
sdkConfiguration config.SDKConfiguration
diff --git a/sdks/outpost-go/docs/models/components/attempt.md b/sdks/outpost-go/docs/models/components/attempt.md
index 8372100a1..86b670de7 100644
--- a/sdks/outpost-go/docs/models/components/attempt.md
+++ b/sdks/outpost-go/docs/models/components/attempt.md
@@ -17,4 +17,5 @@ An attempt represents a single delivery attempt of an event to a destination.
| `Manual` | `*bool` | :heavy_minus_sign: | Whether this attempt was manually triggered (e.g., a retry initiated by a user). | false |
| `EventID` | `*string` | :heavy_minus_sign: | The ID of the associated event. | evt_123 |
| `DestinationID` | `*string` | :heavy_minus_sign: | The destination ID this attempt was sent to. | des_456 |
-| `Event` | [*components.EventUnion](../../models/components/eventunion.md) | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | |
\ No newline at end of file
+| `Event` | [*components.EventUnion](../../models/components/eventunion.md) | :heavy_minus_sign: | The associated event object. Only present when include=event or include=event.data. | |
+| `Destination` | [*components.Destination](../../models/components/destination.md) | :heavy_minus_sign: | N/A | |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/components/metricsdatapoint.md b/sdks/outpost-go/docs/models/components/metricsdatapoint.md
new file mode 100644
index 000000000..af730affb
--- /dev/null
+++ b/sdks/outpost-go/docs/models/components/metricsdatapoint.md
@@ -0,0 +1,10 @@
+# MetricsDataPoint
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ |
+| `TimeBucket` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Start of the time bucket. Null when no granularity is specified. | 2026-03-02T14:00:00Z |
+| `Dimensions` | map[string]`string` | :heavy_minus_sign: | Dimension values for this data point. Empty object when no dimensions are requested. | {
"destination_id": "dest_abc",
"topic": "user.created"
} |
+| `Metrics` | map[string]`any` | :heavy_minus_sign: | Requested measure values for this data point. | {
"count": 1423,
"error_rate": 0.02
} |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/components/metricsmetadata.md b/sdks/outpost-go/docs/models/components/metricsmetadata.md
new file mode 100644
index 000000000..f367062ab
--- /dev/null
+++ b/sdks/outpost-go/docs/models/components/metricsmetadata.md
@@ -0,0 +1,12 @@
+# MetricsMetadata
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- |
+| `Granularity` | `*string` | :heavy_minus_sign: | The granularity used for time bucketing, or null if none was specified. | 1h |
+| `QueryTimeMs` | `*int64` | :heavy_minus_sign: | Query execution time in milliseconds. | 42 |
+| `RowCount` | `*int64` | :heavy_minus_sign: | Number of data points returned. | 2 |
+| `RowLimit` | `*int64` | :heavy_minus_sign: | Maximum number of rows the query will return. | 100000 |
+| `Truncated` | `*bool` | :heavy_minus_sign: | Whether the results were truncated due to hitting the row limit. | false |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/components/metricsresponse.md b/sdks/outpost-go/docs/models/components/metricsresponse.md
new file mode 100644
index 000000000..b9a2167dd
--- /dev/null
+++ b/sdks/outpost-go/docs/models/components/metricsresponse.md
@@ -0,0 +1,9 @@
+# MetricsResponse
+
+
+## Fields
+
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
+| `Data` | [][components.MetricsDataPoint](../../models/components/metricsdatapoint.md) | :heavy_minus_sign: | Array of aggregated data points. |
+| `Metadata` | [*components.MetricsMetadata](../../models/components/metricsmetadata.md) | :heavy_minus_sign: | N/A |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/filtersattemptnumber.md b/sdks/outpost-go/docs/models/operations/filtersattemptnumber.md
new file mode 100644
index 000000000..354f7d4c7
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/filtersattemptnumber.md
@@ -0,0 +1,31 @@
+# FiltersAttemptNumber
+
+Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`).
+
+
+## Supported Types
+
+###
+
+```go
+filtersAttemptNumber := operations.CreateFiltersAttemptNumberStr(string{/* values here */})
+```
+
+###
+
+```go
+filtersAttemptNumber := operations.CreateFiltersAttemptNumberArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch filtersAttemptNumber.Type {
+ case operations.FiltersAttemptNumberTypeStr:
+ // filtersAttemptNumber.Str is populated
+ case operations.FiltersAttemptNumberTypeArrayOfStr:
+ // filtersAttemptNumber.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/filterscode.md b/sdks/outpost-go/docs/models/operations/filterscode.md
new file mode 100644
index 000000000..c22660d27
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/filterscode.md
@@ -0,0 +1,31 @@
+# FiltersCode
+
+Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`).
+
+
+## Supported Types
+
+###
+
+```go
+filtersCode := operations.CreateFiltersCodeStr(string{/* values here */})
+```
+
+###
+
+```go
+filtersCode := operations.CreateFiltersCodeArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch filtersCode.Type {
+ case operations.FiltersCodeTypeStr:
+ // filtersCode.Str is populated
+ case operations.FiltersCodeTypeArrayOfStr:
+ // filtersCode.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/filtersmanual.md b/sdks/outpost-go/docs/models/operations/filtersmanual.md
new file mode 100644
index 000000000..963804309
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/filtersmanual.md
@@ -0,0 +1,21 @@
+# FiltersManual
+
+Filter by manual retry flag.
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.FiltersManualTrue
+```
+
+
+## Values
+
+| Name | Value |
+| -------------------- | -------------------- |
+| `FiltersManualTrue` | true |
+| `FiltersManualFalse` | false |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/filtersstatus.md b/sdks/outpost-go/docs/models/operations/filtersstatus.md
new file mode 100644
index 000000000..c4597015e
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/filtersstatus.md
@@ -0,0 +1,31 @@
+# FiltersStatus
+
+Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`).
+
+
+## Supported Types
+
+### FiltersStatusEnum1
+
+```go
+filtersStatus := operations.CreateFiltersStatusFiltersStatusEnum1(operations.FiltersStatusEnum1{/* values here */})
+```
+
+###
+
+```go
+filtersStatus := operations.CreateFiltersStatusArrayOfFiltersStatusEnum2([]operations.FiltersStatusEnum2{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch filtersStatus.Type {
+ case operations.FiltersStatusTypeFiltersStatusEnum1:
+ // filtersStatus.FiltersStatusEnum1 is populated
+ case operations.FiltersStatusTypeArrayOfFiltersStatusEnum2:
+ // filtersStatus.ArrayOfFiltersStatusEnum2 is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/filtersstatusenum1.md b/sdks/outpost-go/docs/models/operations/filtersstatusenum1.md
new file mode 100644
index 000000000..7d42cba72
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/filtersstatusenum1.md
@@ -0,0 +1,19 @@
+# FiltersStatusEnum1
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.FiltersStatusEnum1Success
+```
+
+
+## Values
+
+| Name | Value |
+| --------------------------- | --------------------------- |
+| `FiltersStatusEnum1Success` | success |
+| `FiltersStatusEnum1Failed` | failed |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/filtersstatusenum2.md b/sdks/outpost-go/docs/models/operations/filtersstatusenum2.md
new file mode 100644
index 000000000..d8bd54a95
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/filtersstatusenum2.md
@@ -0,0 +1,19 @@
+# FiltersStatusEnum2
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.FiltersStatusEnum2Success
+```
+
+
+## Values
+
+| Name | Value |
+| --------------------------- | --------------------------- |
+| `FiltersStatusEnum2Success` | success |
+| `FiltersStatusEnum2Failed` | failed |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsenum1.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsenum1.md
new file mode 100644
index 000000000..81dae1a2c
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsenum1.md
@@ -0,0 +1,24 @@
+# GetAttemptMetricsDimensionsEnum1
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetAttemptMetricsDimensionsEnum1TenantID
+```
+
+
+## Values
+
+| Name | Value |
+| ----------------------------------------------- | ----------------------------------------------- |
+| `GetAttemptMetricsDimensionsEnum1TenantID` | tenant_id |
+| `GetAttemptMetricsDimensionsEnum1DestinationID` | destination_id |
+| `GetAttemptMetricsDimensionsEnum1Topic` | topic |
+| `GetAttemptMetricsDimensionsEnum1Status` | status |
+| `GetAttemptMetricsDimensionsEnum1Code` | code |
+| `GetAttemptMetricsDimensionsEnum1Manual` | manual |
+| `GetAttemptMetricsDimensionsEnum1AttemptNumber` | attempt_number |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsenum2.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsenum2.md
new file mode 100644
index 000000000..d8de2903e
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsenum2.md
@@ -0,0 +1,24 @@
+# GetAttemptMetricsDimensionsEnum2
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetAttemptMetricsDimensionsEnum2TenantID
+```
+
+
+## Values
+
+| Name | Value |
+| ----------------------------------------------- | ----------------------------------------------- |
+| `GetAttemptMetricsDimensionsEnum2TenantID` | tenant_id |
+| `GetAttemptMetricsDimensionsEnum2DestinationID` | destination_id |
+| `GetAttemptMetricsDimensionsEnum2Topic` | topic |
+| `GetAttemptMetricsDimensionsEnum2Status` | status |
+| `GetAttemptMetricsDimensionsEnum2Code` | code |
+| `GetAttemptMetricsDimensionsEnum2Manual` | manual |
+| `GetAttemptMetricsDimensionsEnum2AttemptNumber` | attempt_number |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsunion.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsunion.md
new file mode 100644
index 000000000..4283cd846
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsdimensionsunion.md
@@ -0,0 +1,31 @@
+# GetAttemptMetricsDimensionsUnion
+
+Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`).
+
+
+## Supported Types
+
+### GetAttemptMetricsDimensionsEnum1
+
+```go
+getAttemptMetricsDimensionsUnion := operations.CreateGetAttemptMetricsDimensionsUnionGetAttemptMetricsDimensionsEnum1(operations.GetAttemptMetricsDimensionsEnum1{/* values here */})
+```
+
+###
+
+```go
+getAttemptMetricsDimensionsUnion := operations.CreateGetAttemptMetricsDimensionsUnionArrayOfGetAttemptMetricsDimensionsEnum2([]operations.GetAttemptMetricsDimensionsEnum2{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getAttemptMetricsDimensionsUnion.Type {
+ case operations.GetAttemptMetricsDimensionsUnionTypeGetAttemptMetricsDimensionsEnum1:
+ // getAttemptMetricsDimensionsUnion.GetAttemptMetricsDimensionsEnum1 is populated
+ case operations.GetAttemptMetricsDimensionsUnionTypeArrayOfGetAttemptMetricsDimensionsEnum2:
+ // getAttemptMetricsDimensionsUnion.ArrayOfGetAttemptMetricsDimensionsEnum2 is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsfiltersdestinationid.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsfiltersdestinationid.md
new file mode 100644
index 000000000..5c072334c
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsfiltersdestinationid.md
@@ -0,0 +1,31 @@
+# GetAttemptMetricsFiltersDestinationID
+
+Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`).
+
+
+## Supported Types
+
+###
+
+```go
+getAttemptMetricsFiltersDestinationID := operations.CreateGetAttemptMetricsFiltersDestinationIDStr(string{/* values here */})
+```
+
+###
+
+```go
+getAttemptMetricsFiltersDestinationID := operations.CreateGetAttemptMetricsFiltersDestinationIDArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getAttemptMetricsFiltersDestinationID.Type {
+ case operations.GetAttemptMetricsFiltersDestinationIDTypeStr:
+ // getAttemptMetricsFiltersDestinationID.Str is populated
+ case operations.GetAttemptMetricsFiltersDestinationIDTypeArrayOfStr:
+ // getAttemptMetricsFiltersDestinationID.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsfilterstenantid.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsfilterstenantid.md
new file mode 100644
index 000000000..c3850bb1b
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsfilterstenantid.md
@@ -0,0 +1,31 @@
+# GetAttemptMetricsFiltersTenantID
+
+Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`).
+
+
+## Supported Types
+
+###
+
+```go
+getAttemptMetricsFiltersTenantID := operations.CreateGetAttemptMetricsFiltersTenantIDStr(string{/* values here */})
+```
+
+###
+
+```go
+getAttemptMetricsFiltersTenantID := operations.CreateGetAttemptMetricsFiltersTenantIDArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getAttemptMetricsFiltersTenantID.Type {
+ case operations.GetAttemptMetricsFiltersTenantIDTypeStr:
+ // getAttemptMetricsFiltersTenantID.Str is populated
+ case operations.GetAttemptMetricsFiltersTenantIDTypeArrayOfStr:
+ // getAttemptMetricsFiltersTenantID.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsfilterstopic.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsfilterstopic.md
new file mode 100644
index 000000000..4f12ca072
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsfilterstopic.md
@@ -0,0 +1,31 @@
+# GetAttemptMetricsFiltersTopic
+
+Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`).
+
+
+## Supported Types
+
+###
+
+```go
+getAttemptMetricsFiltersTopic := operations.CreateGetAttemptMetricsFiltersTopicStr(string{/* values here */})
+```
+
+###
+
+```go
+getAttemptMetricsFiltersTopic := operations.CreateGetAttemptMetricsFiltersTopicArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getAttemptMetricsFiltersTopic.Type {
+ case operations.GetAttemptMetricsFiltersTopicTypeStr:
+ // getAttemptMetricsFiltersTopic.Str is populated
+ case operations.GetAttemptMetricsFiltersTopicTypeArrayOfStr:
+ // getAttemptMetricsFiltersTopic.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md
new file mode 100644
index 000000000..089476203
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum1.md
@@ -0,0 +1,28 @@
+# GetAttemptMetricsMeasuresEnum1
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetAttemptMetricsMeasuresEnum1Count
+```
+
+
+## Values
+
+| Name | Value |
+| ------------------------------------------------- | ------------------------------------------------- |
+| `GetAttemptMetricsMeasuresEnum1Count` | count |
+| `GetAttemptMetricsMeasuresEnum1SuccessfulCount` | successful_count |
+| `GetAttemptMetricsMeasuresEnum1FailedCount` | failed_count |
+| `GetAttemptMetricsMeasuresEnum1ErrorRate` | error_rate |
+| `GetAttemptMetricsMeasuresEnum1FirstAttemptCount` | first_attempt_count |
+| `GetAttemptMetricsMeasuresEnum1RetryCount` | retry_count |
+| `GetAttemptMetricsMeasuresEnum1ManualRetryCount` | manual_retry_count |
+| `GetAttemptMetricsMeasuresEnum1AvgAttemptNumber` | avg_attempt_number |
+| `GetAttemptMetricsMeasuresEnum1Rate` | rate |
+| `GetAttemptMetricsMeasuresEnum1SuccessfulRate` | successful_rate |
+| `GetAttemptMetricsMeasuresEnum1FailedRate` | failed_rate |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md
new file mode 100644
index 000000000..8453b07ef
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresenum2.md
@@ -0,0 +1,28 @@
+# GetAttemptMetricsMeasuresEnum2
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetAttemptMetricsMeasuresEnum2Count
+```
+
+
+## Values
+
+| Name | Value |
+| ------------------------------------------------- | ------------------------------------------------- |
+| `GetAttemptMetricsMeasuresEnum2Count` | count |
+| `GetAttemptMetricsMeasuresEnum2SuccessfulCount` | successful_count |
+| `GetAttemptMetricsMeasuresEnum2FailedCount` | failed_count |
+| `GetAttemptMetricsMeasuresEnum2ErrorRate` | error_rate |
+| `GetAttemptMetricsMeasuresEnum2FirstAttemptCount` | first_attempt_count |
+| `GetAttemptMetricsMeasuresEnum2RetryCount` | retry_count |
+| `GetAttemptMetricsMeasuresEnum2ManualRetryCount` | manual_retry_count |
+| `GetAttemptMetricsMeasuresEnum2AvgAttemptNumber` | avg_attempt_number |
+| `GetAttemptMetricsMeasuresEnum2Rate` | rate |
+| `GetAttemptMetricsMeasuresEnum2SuccessfulRate` | successful_rate |
+| `GetAttemptMetricsMeasuresEnum2FailedRate` | failed_rate |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md
new file mode 100644
index 000000000..44cc67051
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsmeasuresunion.md
@@ -0,0 +1,31 @@
+# GetAttemptMetricsMeasuresUnion
+
+Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).
+
+
+## Supported Types
+
+### GetAttemptMetricsMeasuresEnum1
+
+```go
+getAttemptMetricsMeasuresUnion := operations.CreateGetAttemptMetricsMeasuresUnionGetAttemptMetricsMeasuresEnum1(operations.GetAttemptMetricsMeasuresEnum1{/* values here */})
+```
+
+###
+
+```go
+getAttemptMetricsMeasuresUnion := operations.CreateGetAttemptMetricsMeasuresUnionArrayOfGetAttemptMetricsMeasuresEnum2([]operations.GetAttemptMetricsMeasuresEnum2{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getAttemptMetricsMeasuresUnion.Type {
+ case operations.GetAttemptMetricsMeasuresUnionTypeGetAttemptMetricsMeasuresEnum1:
+ // getAttemptMetricsMeasuresUnion.GetAttemptMetricsMeasuresEnum1 is populated
+ case operations.GetAttemptMetricsMeasuresUnionTypeArrayOfGetAttemptMetricsMeasuresEnum2:
+ // getAttemptMetricsMeasuresUnion.ArrayOfGetAttemptMetricsMeasuresEnum2 is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md
new file mode 100644
index 000000000..e4a450ce8
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsrequest.md
@@ -0,0 +1,19 @@
+# GetAttemptMetricsRequest
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `TimeStart` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | Start of the time range (inclusive). ISO 8601 timestamp. | 2026-03-02T00:00:00Z |
+| `TimeEnd` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | End of the time range (exclusive). ISO 8601 timestamp. | 2026-03-03T00:00:00Z |
+| `Granularity` | `*string` | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h |
+| `Measures` | [operations.GetAttemptMetricsMeasuresUnion](../../models/operations/getattemptmetricsmeasuresunion.md) | :heavy_check_mark: | Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`). | [
"count",
"error_rate"
] |
+| `Dimensions` | [*operations.GetAttemptMetricsDimensionsUnion](../../models/operations/getattemptmetricsdimensionsunion.md) | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`). | |
+| `FiltersDestinationID` | [*operations.GetAttemptMetricsFiltersDestinationID](../../models/operations/getattemptmetricsfiltersdestinationid.md) | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | |
+| `FiltersTopic` | [*operations.GetAttemptMetricsFiltersTopic](../../models/operations/getattemptmetricsfilterstopic.md) | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | |
+| `FiltersStatus` | [*operations.FiltersStatus](../../models/operations/filtersstatus.md) | :heavy_minus_sign: | Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`). | |
+| `FiltersCode` | [*operations.FiltersCode](../../models/operations/filterscode.md) | :heavy_minus_sign: | Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`). | |
+| `FiltersManual` | [*operations.FiltersManual](../../models/operations/filtersmanual.md) | :heavy_minus_sign: | Filter by manual retry flag. | |
+| `FiltersAttemptNumber` | [*operations.FiltersAttemptNumber](../../models/operations/filtersattemptnumber.md) | :heavy_minus_sign: | Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`). | |
+| `FiltersTenantID` | [*operations.GetAttemptMetricsFiltersTenantID](../../models/operations/getattemptmetricsfilterstenantid.md) | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptmetricsresponse.md b/sdks/outpost-go/docs/models/operations/getattemptmetricsresponse.md
new file mode 100644
index 000000000..4edcac53a
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/getattemptmetricsresponse.md
@@ -0,0 +1,9 @@
+# GetAttemptMetricsResponse
+
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
+| `HTTPMeta` | [components.HTTPMetadata](../../models/components/httpmetadata.md) | :heavy_check_mark: | N/A |
+| `MetricsResponse` | [*components.MetricsResponse](../../models/components/metricsresponse.md) | :heavy_minus_sign: | Aggregated attempt metrics. |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/getattemptrequest.md b/sdks/outpost-go/docs/models/operations/getattemptrequest.md
index dffc6fbb2..91ba0139f 100644
--- a/sdks/outpost-go/docs/models/operations/getattemptrequest.md
+++ b/sdks/outpost-go/docs/models/operations/getattemptrequest.md
@@ -3,7 +3,7 @@
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `AttemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
-| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
|
\ No newline at end of file
+| Field | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `AttemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
+| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
- `destination`: Include the full destination object
|
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsenum1.md b/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsenum1.md
new file mode 100644
index 000000000..82a63ae56
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsenum1.md
@@ -0,0 +1,20 @@
+# GetEventMetricsDimensionsEnum1
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetEventMetricsDimensionsEnum1TenantID
+```
+
+
+## Values
+
+| Name | Value |
+| --------------------------------------------- | --------------------------------------------- |
+| `GetEventMetricsDimensionsEnum1TenantID` | tenant_id |
+| `GetEventMetricsDimensionsEnum1Topic` | topic |
+| `GetEventMetricsDimensionsEnum1DestinationID` | destination_id |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsenum2.md b/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsenum2.md
new file mode 100644
index 000000000..c1dd9adcf
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsenum2.md
@@ -0,0 +1,20 @@
+# GetEventMetricsDimensionsEnum2
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetEventMetricsDimensionsEnum2TenantID
+```
+
+
+## Values
+
+| Name | Value |
+| --------------------------------------------- | --------------------------------------------- |
+| `GetEventMetricsDimensionsEnum2TenantID` | tenant_id |
+| `GetEventMetricsDimensionsEnum2Topic` | topic |
+| `GetEventMetricsDimensionsEnum2DestinationID` | destination_id |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsunion.md b/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsunion.md
new file mode 100644
index 000000000..150d986c2
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsdimensionsunion.md
@@ -0,0 +1,31 @@
+# GetEventMetricsDimensionsUnion
+
+Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=topic&dimensions[1]=destination_id`).
+
+
+## Supported Types
+
+### GetEventMetricsDimensionsEnum1
+
+```go
+getEventMetricsDimensionsUnion := operations.CreateGetEventMetricsDimensionsUnionGetEventMetricsDimensionsEnum1(operations.GetEventMetricsDimensionsEnum1{/* values here */})
+```
+
+###
+
+```go
+getEventMetricsDimensionsUnion := operations.CreateGetEventMetricsDimensionsUnionArrayOfGetEventMetricsDimensionsEnum2([]operations.GetEventMetricsDimensionsEnum2{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getEventMetricsDimensionsUnion.Type {
+ case operations.GetEventMetricsDimensionsUnionTypeGetEventMetricsDimensionsEnum1:
+ // getEventMetricsDimensionsUnion.GetEventMetricsDimensionsEnum1 is populated
+ case operations.GetEventMetricsDimensionsUnionTypeArrayOfGetEventMetricsDimensionsEnum2:
+ // getEventMetricsDimensionsUnion.ArrayOfGetEventMetricsDimensionsEnum2 is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsfiltersdestinationid.md b/sdks/outpost-go/docs/models/operations/geteventmetricsfiltersdestinationid.md
new file mode 100644
index 000000000..4c5e374d1
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsfiltersdestinationid.md
@@ -0,0 +1,31 @@
+# GetEventMetricsFiltersDestinationID
+
+Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`).
+
+
+## Supported Types
+
+###
+
+```go
+getEventMetricsFiltersDestinationID := operations.CreateGetEventMetricsFiltersDestinationIDStr(string{/* values here */})
+```
+
+###
+
+```go
+getEventMetricsFiltersDestinationID := operations.CreateGetEventMetricsFiltersDestinationIDArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getEventMetricsFiltersDestinationID.Type {
+ case operations.GetEventMetricsFiltersDestinationIDTypeStr:
+ // getEventMetricsFiltersDestinationID.Str is populated
+ case operations.GetEventMetricsFiltersDestinationIDTypeArrayOfStr:
+ // getEventMetricsFiltersDestinationID.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsfilterstenantid.md b/sdks/outpost-go/docs/models/operations/geteventmetricsfilterstenantid.md
new file mode 100644
index 000000000..417fd0be3
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsfilterstenantid.md
@@ -0,0 +1,31 @@
+# GetEventMetricsFiltersTenantID
+
+Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`).
+
+
+## Supported Types
+
+###
+
+```go
+getEventMetricsFiltersTenantID := operations.CreateGetEventMetricsFiltersTenantIDStr(string{/* values here */})
+```
+
+###
+
+```go
+getEventMetricsFiltersTenantID := operations.CreateGetEventMetricsFiltersTenantIDArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getEventMetricsFiltersTenantID.Type {
+ case operations.GetEventMetricsFiltersTenantIDTypeStr:
+ // getEventMetricsFiltersTenantID.Str is populated
+ case operations.GetEventMetricsFiltersTenantIDTypeArrayOfStr:
+ // getEventMetricsFiltersTenantID.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsfilterstopic.md b/sdks/outpost-go/docs/models/operations/geteventmetricsfilterstopic.md
new file mode 100644
index 000000000..e61ae463a
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsfilterstopic.md
@@ -0,0 +1,31 @@
+# GetEventMetricsFiltersTopic
+
+Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`).
+
+
+## Supported Types
+
+###
+
+```go
+getEventMetricsFiltersTopic := operations.CreateGetEventMetricsFiltersTopicStr(string{/* values here */})
+```
+
+###
+
+```go
+getEventMetricsFiltersTopic := operations.CreateGetEventMetricsFiltersTopicArrayOfStr([]string{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getEventMetricsFiltersTopic.Type {
+ case operations.GetEventMetricsFiltersTopicTypeStr:
+ // getEventMetricsFiltersTopic.Str is populated
+ case operations.GetEventMetricsFiltersTopicTypeArrayOfStr:
+ // getEventMetricsFiltersTopic.ArrayOfStr is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresenum1.md b/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresenum1.md
new file mode 100644
index 000000000..146bab7a7
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresenum1.md
@@ -0,0 +1,19 @@
+# GetEventMetricsMeasuresEnum1
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetEventMetricsMeasuresEnum1Count
+```
+
+
+## Values
+
+| Name | Value |
+| ----------------------------------- | ----------------------------------- |
+| `GetEventMetricsMeasuresEnum1Count` | count |
+| `GetEventMetricsMeasuresEnum1Rate` | rate |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresenum2.md b/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresenum2.md
new file mode 100644
index 000000000..daf4bcfd7
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresenum2.md
@@ -0,0 +1,19 @@
+# GetEventMetricsMeasuresEnum2
+
+## Example Usage
+
+```go
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+)
+
+value := operations.GetEventMetricsMeasuresEnum2Count
+```
+
+
+## Values
+
+| Name | Value |
+| ----------------------------------- | ----------------------------------- |
+| `GetEventMetricsMeasuresEnum2Count` | count |
+| `GetEventMetricsMeasuresEnum2Rate` | rate |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresunion.md b/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresunion.md
new file mode 100644
index 000000000..3ad50814c
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsmeasuresunion.md
@@ -0,0 +1,31 @@
+# GetEventMetricsMeasuresUnion
+
+Measures to compute. At least one required. `rate` is events/second throughput. Use bracket notation for multiple values (e.g., `measures[0]=count`).
+
+
+## Supported Types
+
+### GetEventMetricsMeasuresEnum1
+
+```go
+getEventMetricsMeasuresUnion := operations.CreateGetEventMetricsMeasuresUnionGetEventMetricsMeasuresEnum1(operations.GetEventMetricsMeasuresEnum1{/* values here */})
+```
+
+###
+
+```go
+getEventMetricsMeasuresUnion := operations.CreateGetEventMetricsMeasuresUnionArrayOfGetEventMetricsMeasuresEnum2([]operations.GetEventMetricsMeasuresEnum2{/* values here */})
+```
+
+## Union Discrimination
+
+Use the `Type` field to determine which variant is active, then access the corresponding field:
+
+```go
+switch getEventMetricsMeasuresUnion.Type {
+ case operations.GetEventMetricsMeasuresUnionTypeGetEventMetricsMeasuresEnum1:
+ // getEventMetricsMeasuresUnion.GetEventMetricsMeasuresEnum1 is populated
+ case operations.GetEventMetricsMeasuresUnionTypeArrayOfGetEventMetricsMeasuresEnum2:
+ // getEventMetricsMeasuresUnion.ArrayOfGetEventMetricsMeasuresEnum2 is populated
+}
+```
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsrequest.md b/sdks/outpost-go/docs/models/operations/geteventmetricsrequest.md
new file mode 100644
index 000000000..6e4ccf4c6
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsrequest.md
@@ -0,0 +1,15 @@
+# GetEventMetricsRequest
+
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `TimeStart` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | Start of the time range (inclusive). ISO 8601 timestamp. | 2026-03-02T00:00:00Z |
+| `TimeEnd` | [time.Time](https://pkg.go.dev/time#Time) | :heavy_check_mark: | End of the time range (exclusive). ISO 8601 timestamp. | 2026-03-03T00:00:00Z |
+| `Granularity` | `*string` | :heavy_minus_sign: | Time bucketing granularity. Pattern: ``.
Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
When omitted, returns a single aggregate row per dimension combination.
| 1h |
+| `Measures` | [operations.GetEventMetricsMeasuresUnion](../../models/operations/geteventmetricsmeasuresunion.md) | :heavy_check_mark: | Measures to compute. At least one required. `rate` is events/second throughput. Use bracket notation for multiple values (e.g., `measures[0]=count`). | [
"count"
] |
+| `Dimensions` | [*operations.GetEventMetricsDimensionsUnion](../../models/operations/geteventmetricsdimensionsunion.md) | :heavy_minus_sign: | Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=topic&dimensions[1]=destination_id`). | |
+| `FiltersTopic` | [*operations.GetEventMetricsFiltersTopic](../../models/operations/geteventmetricsfilterstopic.md) | :heavy_minus_sign: | Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`). | |
+| `FiltersDestinationID` | [*operations.GetEventMetricsFiltersDestinationID](../../models/operations/geteventmetricsfiltersdestinationid.md) | :heavy_minus_sign: | Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`). | |
+| `FiltersTenantID` | [*operations.GetEventMetricsFiltersTenantID](../../models/operations/geteventmetricsfilterstenantid.md) | :heavy_minus_sign: | Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`). | |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/geteventmetricsresponse.md b/sdks/outpost-go/docs/models/operations/geteventmetricsresponse.md
new file mode 100644
index 000000000..f220aebf2
--- /dev/null
+++ b/sdks/outpost-go/docs/models/operations/geteventmetricsresponse.md
@@ -0,0 +1,9 @@
+# GetEventMetricsResponse
+
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
+| `HTTPMeta` | [components.HTTPMetadata](../../models/components/httpmetadata.md) | :heavy_check_mark: | N/A |
+| `MetricsResponse` | [*components.MetricsResponse](../../models/components/metricsresponse.md) | :heavy_minus_sign: | Aggregated event metrics. |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/gettenantdestinationattemptrequest.md b/sdks/outpost-go/docs/models/operations/gettenantdestinationattemptrequest.md
index 049c52de5..08d9b92e9 100644
--- a/sdks/outpost-go/docs/models/operations/gettenantdestinationattemptrequest.md
+++ b/sdks/outpost-go/docs/models/operations/gettenantdestinationattemptrequest.md
@@ -3,9 +3,9 @@
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `TenantID` | `string` | :heavy_check_mark: | The ID of the tenant. Required when using AdminApiKey authentication. |
-| `DestinationID` | `string` | :heavy_check_mark: | The ID of the destination. |
-| `AttemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
-| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
|
\ No newline at end of file
+| Field | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `TenantID` | `string` | :heavy_check_mark: | The ID of the tenant. Required when using AdminApiKey authentication. |
+| `DestinationID` | `string` | :heavy_check_mark: | The ID of the destination. |
+| `AttemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
+| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
- `destination`: Include the full destination object
|
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/listattemptsrequest.md b/sdks/outpost-go/docs/models/operations/listattemptsrequest.md
index 8a4b24dce..78b1d2e3e 100644
--- a/sdks/outpost-go/docs/models/operations/listattemptsrequest.md
+++ b/sdks/outpost-go/docs/models/operations/listattemptsrequest.md
@@ -3,20 +3,20 @@
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `TenantID` | []`string` | :heavy_minus_sign: | Filter attempts by tenant ID(s). Use bracket notation for multiple values (e.g., `tenant_id[0]=t1&tenant_id[1]=t2`).
When authenticated with a Tenant JWT, this parameter is ignored and the JWT's tenant is used.
If not provided with API key auth, returns attempts from all tenants.
|
-| `EventID` | []`string` | :heavy_minus_sign: | Filter attempts by event ID(s). Use bracket notation for multiple values (e.g., `event_id[0]=e1&event_id[1]=e2`). |
-| `DestinationID` | []`string` | :heavy_minus_sign: | Filter attempts by destination ID(s). Use bracket notation for multiple values (e.g., `destination_id[0]=d1&destination_id[1]=d2`). |
-| `Status` | [*operations.ListAttemptsStatus](../../models/operations/listattemptsstatus.md) | :heavy_minus_sign: | Filter attempts by status. |
-| `Topic` | []`string` | :heavy_minus_sign: | Filter attempts by event topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`). |
-| `TimeGte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time >= value (RFC3339 or YYYY-MM-DD format). |
-| `TimeLte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time <= value (RFC3339 or YYYY-MM-DD format). |
-| `TimeGt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time > value (RFC3339 or YYYY-MM-DD format). |
-| `TimeLt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time < value (RFC3339 or YYYY-MM-DD format). |
-| `Limit` | `*int64` | :heavy_minus_sign: | Number of items per page (default 100, max 1000). |
-| `Next` | `*string` | :heavy_minus_sign: | Cursor for next page of results. |
-| `Prev` | `*string` | :heavy_minus_sign: | Cursor for previous page of results. |
-| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
|
-| `OrderBy` | [*operations.ListAttemptsOrderBy](../../models/operations/listattemptsorderby.md) | :heavy_minus_sign: | Field to sort by. |
-| `Dir` | [*operations.ListAttemptsDir](../../models/operations/listattemptsdir.md) | :heavy_minus_sign: | Sort direction. |
\ No newline at end of file
+| Field | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `TenantID` | []`string` | :heavy_minus_sign: | Filter attempts by tenant ID(s). Use bracket notation for multiple values (e.g., `tenant_id[0]=t1&tenant_id[1]=t2`).
When authenticated with a Tenant JWT, this parameter is ignored and the JWT's tenant is used.
If not provided with API key auth, returns attempts from all tenants.
|
+| `EventID` | []`string` | :heavy_minus_sign: | Filter attempts by event ID(s). Use bracket notation for multiple values (e.g., `event_id[0]=e1&event_id[1]=e2`). |
+| `DestinationID` | []`string` | :heavy_minus_sign: | Filter attempts by destination ID(s). Use bracket notation for multiple values (e.g., `destination_id[0]=d1&destination_id[1]=d2`). |
+| `Status` | [*operations.ListAttemptsStatus](../../models/operations/listattemptsstatus.md) | :heavy_minus_sign: | Filter attempts by status. |
+| `Topic` | []`string` | :heavy_minus_sign: | Filter attempts by event topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`). |
+| `TimeGte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time >= value (RFC3339 or YYYY-MM-DD format). |
+| `TimeLte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time <= value (RFC3339 or YYYY-MM-DD format). |
+| `TimeGt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time > value (RFC3339 or YYYY-MM-DD format). |
+| `TimeLt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time < value (RFC3339 or YYYY-MM-DD format). |
+| `Limit` | `*int64` | :heavy_minus_sign: | Number of items per page (default 100, max 1000). |
+| `Next` | `*string` | :heavy_minus_sign: | Cursor for next page of results. |
+| `Prev` | `*string` | :heavy_minus_sign: | Cursor for previous page of results. |
+| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
- `destination`: Include the full destination object
|
+| `OrderBy` | [*operations.ListAttemptsOrderBy](../../models/operations/listattemptsorderby.md) | :heavy_minus_sign: | Field to sort by. |
+| `Dir` | [*operations.ListAttemptsDir](../../models/operations/listattemptsdir.md) | :heavy_minus_sign: | Sort direction. |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/models/operations/listtenantdestinationattemptsrequest.md b/sdks/outpost-go/docs/models/operations/listtenantdestinationattemptsrequest.md
index bf2e6bc3f..91a130340 100644
--- a/sdks/outpost-go/docs/models/operations/listtenantdestinationattemptsrequest.md
+++ b/sdks/outpost-go/docs/models/operations/listtenantdestinationattemptsrequest.md
@@ -3,20 +3,20 @@
## Fields
-| Field | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `TenantID` | `string` | :heavy_check_mark: | The ID of the tenant. Required when using AdminApiKey authentication. |
-| `DestinationID` | `string` | :heavy_check_mark: | The ID of the destination. |
-| `EventID` | []`string` | :heavy_minus_sign: | Filter attempts by event ID(s). Use bracket notation for multiple values (e.g., `event_id[0]=e1&event_id[1]=e2`). |
-| `Status` | [*operations.ListTenantDestinationAttemptsStatus](../../models/operations/listtenantdestinationattemptsstatus.md) | :heavy_minus_sign: | Filter attempts by status. |
-| `Topic` | []`string` | :heavy_minus_sign: | Filter attempts by event topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`). |
-| `TimeGte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time >= value (RFC3339 or YYYY-MM-DD format). |
-| `TimeLte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time <= value (RFC3339 or YYYY-MM-DD format). |
-| `TimeGt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time > value (RFC3339 or YYYY-MM-DD format). |
-| `TimeLt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time < value (RFC3339 or YYYY-MM-DD format). |
-| `Limit` | `*int64` | :heavy_minus_sign: | Number of items per page (default 100, max 1000). |
-| `Next` | `*string` | :heavy_minus_sign: | Cursor for next page of results. |
-| `Prev` | `*string` | :heavy_minus_sign: | Cursor for previous page of results. |
-| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
|
-| `OrderBy` | [*operations.ListTenantDestinationAttemptsOrderBy](../../models/operations/listtenantdestinationattemptsorderby.md) | :heavy_minus_sign: | Field to sort by. |
-| `Dir` | [*operations.ListTenantDestinationAttemptsDir](../../models/operations/listtenantdestinationattemptsdir.md) | :heavy_minus_sign: | Sort direction. |
\ No newline at end of file
+| Field | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `TenantID` | `string` | :heavy_check_mark: | The ID of the tenant. Required when using AdminApiKey authentication. |
+| `DestinationID` | `string` | :heavy_check_mark: | The ID of the destination. |
+| `EventID` | []`string` | :heavy_minus_sign: | Filter attempts by event ID(s). Use bracket notation for multiple values (e.g., `event_id[0]=e1&event_id[1]=e2`). |
+| `Status` | [*operations.ListTenantDestinationAttemptsStatus](../../models/operations/listtenantdestinationattemptsstatus.md) | :heavy_minus_sign: | Filter attempts by status. |
+| `Topic` | []`string` | :heavy_minus_sign: | Filter attempts by event topic(s). Use bracket notation for multiple values (e.g., `topic[0]=user.created&topic[1]=user.updated`). |
+| `TimeGte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time >= value (RFC3339 or YYYY-MM-DD format). |
+| `TimeLte` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time <= value (RFC3339 or YYYY-MM-DD format). |
+| `TimeGt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time > value (RFC3339 or YYYY-MM-DD format). |
+| `TimeLt` | [*time.Time](https://pkg.go.dev/time#Time) | :heavy_minus_sign: | Filter attempts by event time < value (RFC3339 or YYYY-MM-DD format). |
+| `Limit` | `*int64` | :heavy_minus_sign: | Number of items per page (default 100, max 1000). |
+| `Next` | `*string` | :heavy_minus_sign: | Cursor for next page of results. |
+| `Prev` | `*string` | :heavy_minus_sign: | Cursor for previous page of results. |
+| `Include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
- `destination`: Include the full destination object
|
+| `OrderBy` | [*operations.ListTenantDestinationAttemptsOrderBy](../../models/operations/listtenantdestinationattemptsorderby.md) | :heavy_minus_sign: | Field to sort by. |
+| `Dir` | [*operations.ListTenantDestinationAttemptsDir](../../models/operations/listtenantdestinationattemptsdir.md) | :heavy_minus_sign: | Sort direction. |
\ No newline at end of file
diff --git a/sdks/outpost-go/docs/sdks/attempts/README.md b/sdks/outpost-go/docs/sdks/attempts/README.md
index 91b2d248e..7b31816cf 100644
--- a/sdks/outpost-go/docs/sdks/attempts/README.md
+++ b/sdks/outpost-go/docs/sdks/attempts/README.md
@@ -17,6 +17,7 @@ Use the `include` query parameter to include related data:
- `include=event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `include=event.data`: Include full event with payload data
- `include=response_data`: Include response body and headers from the attempt
+- `include=destination`: Include the full destination object with target information
### Available Operations
@@ -217,12 +218,12 @@ func main() {
### Parameters
-| Parameter | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. |
-| `attemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
-| `include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
|
-| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. |
+| Parameter | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. |
+| `attemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
+| `include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
- `destination`: Include the full destination object
|
+| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. |
### Response
diff --git a/sdks/outpost-go/docs/sdks/destinations/README.md b/sdks/outpost-go/docs/sdks/destinations/README.md
index 0de1f256b..91402ab56 100644
--- a/sdks/outpost-go/docs/sdks/destinations/README.md
+++ b/sdks/outpost-go/docs/sdks/destinations/README.md
@@ -657,14 +657,14 @@ func main() {
### Parameters
-| Parameter | Type | Required | Description |
-| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. |
-| `tenantID` | `string` | :heavy_check_mark: | The ID of the tenant. Required when using AdminApiKey authentication. |
-| `destinationID` | `string` | :heavy_check_mark: | The ID of the destination. |
-| `attemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
-| `include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
|
-| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. |
+| Parameter | Type | Required | Description |
+| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. |
+| `tenantID` | `string` | :heavy_check_mark: | The ID of the tenant. Required when using AdminApiKey authentication. |
+| `destinationID` | `string` | :heavy_check_mark: | The ID of the destination. |
+| `attemptID` | `string` | :heavy_check_mark: | The ID of the attempt. |
+| `include` | []`string` | :heavy_minus_sign: | Fields to include in the response. Use bracket notation for multiple values (e.g., `include[0]=event&include[1]=response_data`).
- `event`: Include event summary
- `event.data`: Include full event with payload data
- `response_data`: Include response body and headers
- `destination`: Include the full destination object
|
+| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. |
### Response
diff --git a/sdks/outpost-go/docs/sdks/metrics/README.md b/sdks/outpost-go/docs/sdks/metrics/README.md
new file mode 100644
index 000000000..f2194dbf9
--- /dev/null
+++ b/sdks/outpost-go/docs/sdks/metrics/README.md
@@ -0,0 +1,162 @@
+# Metrics
+
+## Overview
+
+Aggregated metrics for events and delivery attempts. Supports time bucketing, dimensional grouping, and filtering.
+
+
+### Available Operations
+
+* [GetEventMetrics](#geteventmetrics) - Get Event Metrics
+* [GetAttemptMetrics](#getattemptmetrics) - Get Attempt Metrics
+
+## GetEventMetrics
+
+Returns aggregated event publish metrics. Supports time bucketing via granularity,
+dimensional grouping, and filtering.
+
+**Measures:** `count`, `rate`
+
+**Dimensions:** `tenant_id` (admin-only), `topic`, `destination_id`
+
+**Filters:** `tenant_id` (admin-only), `topic`, `destination_id`
+
+
+### Example Usage
+
+
+```go
+package main
+
+import(
+ "context"
+ outpostgo "github.com/hookdeck/outpost/sdks/outpost-go"
+ "github.com/hookdeck/outpost/sdks/outpost-go/types"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+ "log"
+)
+
+func main() {
+ ctx := context.Background()
+
+ s := outpostgo.New(
+ outpostgo.WithSecurity(""),
+ )
+
+ res, err := s.Metrics.GetEventMetrics(ctx, operations.GetEventMetricsRequest{
+ TimeStart: types.MustTimeFromString("2026-03-02T00:00:00Z"),
+ TimeEnd: types.MustTimeFromString("2026-03-03T00:00:00Z"),
+ Granularity: outpostgo.Pointer("1h"),
+ Measures: operations.CreateGetEventMetricsMeasuresUnionArrayOfGetEventMetricsMeasuresEnum2(
+ []operations.GetEventMetricsMeasuresEnum2{
+ operations.GetEventMetricsMeasuresEnum2Count,
+ },
+ ),
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
+ if res.MetricsResponse != nil {
+ // handle response
+ }
+}
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description |
+| -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
+| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. |
+| `request` | [operations.GetEventMetricsRequest](../../models/operations/geteventmetricsrequest.md) | :heavy_check_mark: | The request object to use for the request. |
+| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. |
+
+### Response
+
+**[*operations.GetEventMetricsResponse](../../models/operations/geteventmetricsresponse.md), error**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ----------------------------- | ----------------------------- | ----------------------------- |
+| apierrors.BadRequestError | 400 | application/json |
+| apierrors.UnauthorizedError | 401 | application/json |
+| apierrors.APIErrorResponse | 403 | application/json |
+| apierrors.InternalServerError | 500 | application/json |
+| apierrors.APIError | 4XX, 5XX | \*/\* |
+
+## GetAttemptMetrics
+
+Returns aggregated delivery attempt metrics. Supports time bucketing via granularity,
+dimensional grouping, and filtering.
+
+**Measures:** `count`, `successful_count`, `failed_count`, `error_rate`,
+`first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`,
+`rate`, `successful_rate`, `failed_rate`
+
+**Dimensions:** `tenant_id` (admin-only), `destination_id`, `topic`, `status`, `code`, `manual`, `attempt_number`
+
+**Filters:** `tenant_id` (admin-only), `destination_id`, `topic`, `status`, `code`, `manual`, `attempt_number`
+
+
+### Example Usage
+
+
+```go
+package main
+
+import(
+ "context"
+ outpostgo "github.com/hookdeck/outpost/sdks/outpost-go"
+ "github.com/hookdeck/outpost/sdks/outpost-go/types"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+ "log"
+)
+
+func main() {
+ ctx := context.Background()
+
+ s := outpostgo.New(
+ outpostgo.WithSecurity(""),
+ )
+
+ res, err := s.Metrics.GetAttemptMetrics(ctx, operations.GetAttemptMetricsRequest{
+ TimeStart: types.MustTimeFromString("2026-03-02T00:00:00Z"),
+ TimeEnd: types.MustTimeFromString("2026-03-03T00:00:00Z"),
+ Granularity: outpostgo.Pointer("1h"),
+ Measures: operations.CreateGetAttemptMetricsMeasuresUnionArrayOfGetAttemptMetricsMeasuresEnum2(
+ []operations.GetAttemptMetricsMeasuresEnum2{
+ operations.GetAttemptMetricsMeasuresEnum2Count,
+ operations.GetAttemptMetricsMeasuresEnum2ErrorRate,
+ },
+ ),
+ })
+ if err != nil {
+ log.Fatal(err)
+ }
+ if res.MetricsResponse != nil {
+ // handle response
+ }
+}
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description |
+| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
+| `ctx` | [context.Context](https://pkg.go.dev/context#Context) | :heavy_check_mark: | The context to use for the request. |
+| `request` | [operations.GetAttemptMetricsRequest](../../models/operations/getattemptmetricsrequest.md) | :heavy_check_mark: | The request object to use for the request. |
+| `opts` | [][operations.Option](../../models/operations/option.md) | :heavy_minus_sign: | The options for this request. |
+
+### Response
+
+**[*operations.GetAttemptMetricsResponse](../../models/operations/getattemptmetricsresponse.md), error**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ----------------------------- | ----------------------------- | ----------------------------- |
+| apierrors.BadRequestError | 400 | application/json |
+| apierrors.UnauthorizedError | 401 | application/json |
+| apierrors.APIErrorResponse | 403 | application/json |
+| apierrors.InternalServerError | 500 | application/json |
+| apierrors.APIError | 4XX, 5XX | \*/\* |
\ No newline at end of file
diff --git a/sdks/outpost-go/metrics.go b/sdks/outpost-go/metrics.go
new file mode 100644
index 000000000..199f17173
--- /dev/null
+++ b/sdks/outpost-go/metrics.go
@@ -0,0 +1,637 @@
+// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
+
+package outpostgo
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "github.com/hookdeck/outpost/sdks/outpost-go/internal/config"
+ "github.com/hookdeck/outpost/sdks/outpost-go/internal/hooks"
+ "github.com/hookdeck/outpost/sdks/outpost-go/internal/utils"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/apierrors"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/components"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/operations"
+ "github.com/hookdeck/outpost/sdks/outpost-go/retry"
+ "net/http"
+ "net/url"
+)
+
+// Metrics - Aggregated metrics for events and delivery attempts. Supports time bucketing, dimensional grouping, and filtering.
+type Metrics struct {
+ rootSDK *Outpost
+ sdkConfiguration config.SDKConfiguration
+ hooks *hooks.Hooks
+}
+
+func newMetrics(rootSDK *Outpost, sdkConfig config.SDKConfiguration, hooks *hooks.Hooks) *Metrics {
+ return &Metrics{
+ rootSDK: rootSDK,
+ sdkConfiguration: sdkConfig,
+ hooks: hooks,
+ }
+}
+
+// GetEventMetrics - Get Event Metrics
+// Returns aggregated event publish metrics. Supports time bucketing via granularity,
+// dimensional grouping, and filtering.
+//
+// **Measures:** `count`, `rate`
+//
+// **Dimensions:** `tenant_id` (admin-only), `topic`, `destination_id`
+//
+// **Filters:** `tenant_id` (admin-only), `topic`, `destination_id`
+func (s *Metrics) GetEventMetrics(ctx context.Context, request operations.GetEventMetricsRequest, opts ...operations.Option) (*operations.GetEventMetricsResponse, error) {
+ o := operations.Options{}
+ supportedOptions := []string{
+ operations.SupportedOptionRetries,
+ operations.SupportedOptionTimeout,
+ }
+
+ for _, opt := range opts {
+ if err := opt(&o, supportedOptions...); err != nil {
+ return nil, fmt.Errorf("error applying option: %w", err)
+ }
+ }
+
+ var baseURL string
+ if o.ServerURL == nil {
+ baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
+ } else {
+ baseURL = *o.ServerURL
+ }
+ opURL, err := url.JoinPath(baseURL, "/metrics/events")
+ if err != nil {
+ return nil, fmt.Errorf("error generating URL: %w", err)
+ }
+
+ hookCtx := hooks.HookContext{
+ SDK: s.rootSDK,
+ SDKConfiguration: s.sdkConfiguration,
+ BaseURL: baseURL,
+ Context: ctx,
+ OperationID: "getEventMetrics",
+ OAuth2Scopes: nil,
+ SecuritySource: s.sdkConfiguration.Security,
+ }
+
+ timeout := o.Timeout
+ if timeout == nil {
+ timeout = s.sdkConfiguration.Timeout
+ }
+
+ if timeout != nil {
+ var cancel context.CancelFunc
+ ctx, cancel = context.WithTimeout(ctx, *timeout)
+ defer cancel()
+ }
+
+ req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil)
+ if err != nil {
+ return nil, fmt.Errorf("error creating request: %w", err)
+ }
+ req.Header.Set("Accept", "application/json")
+ req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
+
+ if err := utils.PopulateQueryParams(ctx, req, request, nil, nil); err != nil {
+ return nil, fmt.Errorf("error populating query params: %w", err)
+ }
+
+ if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil {
+ return nil, err
+ }
+
+ for k, v := range o.SetHeaders {
+ req.Header.Set(k, v)
+ }
+
+ globalRetryConfig := s.sdkConfiguration.RetryConfig
+ retryConfig := o.Retries
+ if retryConfig == nil {
+ if globalRetryConfig != nil {
+ retryConfig = globalRetryConfig
+ }
+ }
+
+ var httpRes *http.Response
+ if retryConfig != nil {
+ httpRes, err = utils.Retry(ctx, utils.Retries{
+ Config: retryConfig,
+ StatusCodes: []string{
+ "429",
+ "500",
+ "502",
+ "503",
+ "504",
+ },
+ }, func() (*http.Response, error) {
+ if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
+ copyBody, err := req.GetBody()
+
+ if err != nil {
+ return nil, err
+ }
+
+ req.Body = copyBody
+ }
+
+ req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
+ if err != nil {
+ if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
+ return nil, err
+ }
+
+ return nil, retry.Permanent(err)
+ }
+
+ httpRes, err := s.sdkConfiguration.Client.Do(req)
+ if err != nil || httpRes == nil {
+ if err != nil {
+ err = fmt.Errorf("error sending request: %w", err)
+ } else {
+ err = fmt.Errorf("error sending request: no response")
+ }
+
+ _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
+ }
+ return httpRes, err
+ })
+
+ if err != nil {
+ return nil, err
+ } else {
+ httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
+ if err != nil {
+ return nil, err
+ }
+ }
+ } else {
+ req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
+ if err != nil {
+ return nil, err
+ }
+
+ httpRes, err = s.sdkConfiguration.Client.Do(req)
+ if err != nil || httpRes == nil {
+ if err != nil {
+ err = fmt.Errorf("error sending request: %w", err)
+ } else {
+ err = fmt.Errorf("error sending request: no response")
+ }
+
+ _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
+ return nil, err
+ } else if utils.MatchStatusCodes([]string{"400", "401", "403", "4XX", "500", "5XX"}, httpRes.StatusCode) {
+ _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
+ if err != nil {
+ return nil, err
+ } else if _httpRes != nil {
+ httpRes = _httpRes
+ }
+ } else {
+ httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
+ if err != nil {
+ return nil, err
+ }
+ }
+ }
+
+ res := &operations.GetEventMetricsResponse{
+ HTTPMeta: components.HTTPMetadata{
+ Request: req,
+ Response: httpRes,
+ },
+ }
+
+ switch {
+ case httpRes.StatusCode == 200:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out components.MetricsResponse
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ res.MetricsResponse = &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 400:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.BadRequestError
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 401:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.UnauthorizedError
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 403:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.APIErrorResponse
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 500:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.InternalServerError
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
+ case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
+ }
+
+ return res, nil
+
+}
+
+// GetAttemptMetrics - Get Attempt Metrics
+// Returns aggregated delivery attempt metrics. Supports time bucketing via granularity,
+// dimensional grouping, and filtering.
+//
+// **Measures:** `count`, `successful_count`, `failed_count`, `error_rate`,
+// `first_attempt_count`, `retry_count`, `manual_retry_count`, `avg_attempt_number`,
+// `rate`, `successful_rate`, `failed_rate`
+//
+// **Dimensions:** `tenant_id` (admin-only), `destination_id`, `topic`, `status`, `code`, `manual`, `attempt_number`
+//
+// **Filters:** `tenant_id` (admin-only), `destination_id`, `topic`, `status`, `code`, `manual`, `attempt_number`
+func (s *Metrics) GetAttemptMetrics(ctx context.Context, request operations.GetAttemptMetricsRequest, opts ...operations.Option) (*operations.GetAttemptMetricsResponse, error) {
+ o := operations.Options{}
+ supportedOptions := []string{
+ operations.SupportedOptionRetries,
+ operations.SupportedOptionTimeout,
+ }
+
+ for _, opt := range opts {
+ if err := opt(&o, supportedOptions...); err != nil {
+ return nil, fmt.Errorf("error applying option: %w", err)
+ }
+ }
+
+ var baseURL string
+ if o.ServerURL == nil {
+ baseURL = utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails())
+ } else {
+ baseURL = *o.ServerURL
+ }
+ opURL, err := url.JoinPath(baseURL, "/metrics/attempts")
+ if err != nil {
+ return nil, fmt.Errorf("error generating URL: %w", err)
+ }
+
+ hookCtx := hooks.HookContext{
+ SDK: s.rootSDK,
+ SDKConfiguration: s.sdkConfiguration,
+ BaseURL: baseURL,
+ Context: ctx,
+ OperationID: "getAttemptMetrics",
+ OAuth2Scopes: nil,
+ SecuritySource: s.sdkConfiguration.Security,
+ }
+
+ timeout := o.Timeout
+ if timeout == nil {
+ timeout = s.sdkConfiguration.Timeout
+ }
+
+ if timeout != nil {
+ var cancel context.CancelFunc
+ ctx, cancel = context.WithTimeout(ctx, *timeout)
+ defer cancel()
+ }
+
+ req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil)
+ if err != nil {
+ return nil, fmt.Errorf("error creating request: %w", err)
+ }
+ req.Header.Set("Accept", "application/json")
+ req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent)
+
+ if err := utils.PopulateQueryParams(ctx, req, request, nil, nil); err != nil {
+ return nil, fmt.Errorf("error populating query params: %w", err)
+ }
+
+ if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil {
+ return nil, err
+ }
+
+ for k, v := range o.SetHeaders {
+ req.Header.Set(k, v)
+ }
+
+ globalRetryConfig := s.sdkConfiguration.RetryConfig
+ retryConfig := o.Retries
+ if retryConfig == nil {
+ if globalRetryConfig != nil {
+ retryConfig = globalRetryConfig
+ }
+ }
+
+ var httpRes *http.Response
+ if retryConfig != nil {
+ httpRes, err = utils.Retry(ctx, utils.Retries{
+ Config: retryConfig,
+ StatusCodes: []string{
+ "429",
+ "500",
+ "502",
+ "503",
+ "504",
+ },
+ }, func() (*http.Response, error) {
+ if req.Body != nil && req.Body != http.NoBody && req.GetBody != nil {
+ copyBody, err := req.GetBody()
+
+ if err != nil {
+ return nil, err
+ }
+
+ req.Body = copyBody
+ }
+
+ req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
+ if err != nil {
+ if retry.IsPermanentError(err) || retry.IsTemporaryError(err) {
+ return nil, err
+ }
+
+ return nil, retry.Permanent(err)
+ }
+
+ httpRes, err := s.sdkConfiguration.Client.Do(req)
+ if err != nil || httpRes == nil {
+ if err != nil {
+ err = fmt.Errorf("error sending request: %w", err)
+ } else {
+ err = fmt.Errorf("error sending request: no response")
+ }
+
+ _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
+ }
+ return httpRes, err
+ })
+
+ if err != nil {
+ return nil, err
+ } else {
+ httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
+ if err != nil {
+ return nil, err
+ }
+ }
+ } else {
+ req, err = s.hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req)
+ if err != nil {
+ return nil, err
+ }
+
+ httpRes, err = s.sdkConfiguration.Client.Do(req)
+ if err != nil || httpRes == nil {
+ if err != nil {
+ err = fmt.Errorf("error sending request: %w", err)
+ } else {
+ err = fmt.Errorf("error sending request: no response")
+ }
+
+ _, err = s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err)
+ return nil, err
+ } else if utils.MatchStatusCodes([]string{"400", "401", "403", "4XX", "500", "5XX"}, httpRes.StatusCode) {
+ _httpRes, err := s.hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, httpRes, nil)
+ if err != nil {
+ return nil, err
+ } else if _httpRes != nil {
+ httpRes = _httpRes
+ }
+ } else {
+ httpRes, err = s.hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes)
+ if err != nil {
+ return nil, err
+ }
+ }
+ }
+
+ res := &operations.GetAttemptMetricsResponse{
+ HTTPMeta: components.HTTPMetadata{
+ Request: req,
+ Response: httpRes,
+ },
+ }
+
+ switch {
+ case httpRes.StatusCode == 200:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out components.MetricsResponse
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ res.MetricsResponse = &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 400:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.BadRequestError
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 401:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.UnauthorizedError
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 403:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.APIErrorResponse
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode == 500:
+ switch {
+ case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`):
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+
+ var out apierrors.InternalServerError
+ if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil {
+ return nil, err
+ }
+
+ return nil, &out
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes)
+ }
+ case httpRes.StatusCode >= 400 && httpRes.StatusCode < 500:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
+ case httpRes.StatusCode >= 500 && httpRes.StatusCode < 600:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError("API error occurred", httpRes.StatusCode, string(rawBody), httpRes)
+ default:
+ rawBody, err := utils.ConsumeRawBody(httpRes)
+ if err != nil {
+ return nil, err
+ }
+ return nil, apierrors.NewAPIError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes)
+ }
+
+ return res, nil
+
+}
diff --git a/sdks/outpost-go/models/components/attempt.go b/sdks/outpost-go/models/components/attempt.go
index d47ceaf6b..41ced248d 100644
--- a/sdks/outpost-go/models/components/attempt.go
+++ b/sdks/outpost-go/models/components/attempt.go
@@ -37,6 +37,165 @@ func (e *Status) UnmarshalJSON(data []byte) error {
}
}
+// EventFull - Full event object with data (returned when include=event.data).
+type EventFull struct {
+ ID *string `json:"id,omitempty"`
+ // The tenant this event belongs to.
+ TenantID *string `json:"tenant_id,omitempty"`
+ // The destination this event was delivered to.
+ DestinationID *string `json:"destination_id,omitempty"`
+ Topic *string `json:"topic,omitempty"`
+ // Time the event was received.
+ Time *time.Time `json:"time,omitempty"`
+ // Whether this event can be retried.
+ EligibleForRetry *bool `json:"eligible_for_retry,omitempty"`
+ Metadata map[string]string `json:"metadata,omitempty"`
+ // The event payload data.
+ Data map[string]any `json:"data,omitempty"`
+}
+
+func (e EventFull) MarshalJSON() ([]byte, error) {
+ return utils.MarshalJSON(e, "", false)
+}
+
+func (e *EventFull) UnmarshalJSON(data []byte) error {
+ if err := utils.UnmarshalJSON(data, &e, "", false, nil); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (e *EventFull) GetID() *string {
+ if e == nil {
+ return nil
+ }
+ return e.ID
+}
+
+func (e *EventFull) GetTenantID() *string {
+ if e == nil {
+ return nil
+ }
+ return e.TenantID
+}
+
+func (e *EventFull) GetDestinationID() *string {
+ if e == nil {
+ return nil
+ }
+ return e.DestinationID
+}
+
+func (e *EventFull) GetTopic() *string {
+ if e == nil {
+ return nil
+ }
+ return e.Topic
+}
+
+func (e *EventFull) GetTime() *time.Time {
+ if e == nil {
+ return nil
+ }
+ return e.Time
+}
+
+func (e *EventFull) GetEligibleForRetry() *bool {
+ if e == nil {
+ return nil
+ }
+ return e.EligibleForRetry
+}
+
+func (e *EventFull) GetMetadata() map[string]string {
+ if e == nil {
+ return nil
+ }
+ return e.Metadata
+}
+
+func (e *EventFull) GetData() map[string]any {
+ if e == nil {
+ return nil
+ }
+ return e.Data
+}
+
+// EventSummary - Event object without data (returned when include=event).
+type EventSummary struct {
+ ID *string `json:"id,omitempty"`
+ // The tenant this event belongs to.
+ TenantID *string `json:"tenant_id,omitempty"`
+ // The destination this event was delivered to.
+ DestinationID *string `json:"destination_id,omitempty"`
+ Topic *string `json:"topic,omitempty"`
+ // Time the event was received.
+ Time *time.Time `json:"time,omitempty"`
+ // Whether this event can be retried.
+ EligibleForRetry *bool `json:"eligible_for_retry,omitempty"`
+ Metadata map[string]string `json:"metadata,omitempty"`
+}
+
+func (e EventSummary) MarshalJSON() ([]byte, error) {
+ return utils.MarshalJSON(e, "", false)
+}
+
+func (e *EventSummary) UnmarshalJSON(data []byte) error {
+ if err := utils.UnmarshalJSON(data, &e, "", false, nil); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (e *EventSummary) GetID() *string {
+ if e == nil {
+ return nil
+ }
+ return e.ID
+}
+
+func (e *EventSummary) GetTenantID() *string {
+ if e == nil {
+ return nil
+ }
+ return e.TenantID
+}
+
+func (e *EventSummary) GetDestinationID() *string {
+ if e == nil {
+ return nil
+ }
+ return e.DestinationID
+}
+
+func (e *EventSummary) GetTopic() *string {
+ if e == nil {
+ return nil
+ }
+ return e.Topic
+}
+
+func (e *EventSummary) GetTime() *time.Time {
+ if e == nil {
+ return nil
+ }
+ return e.Time
+}
+
+func (e *EventSummary) GetEligibleForRetry() *bool {
+ if e == nil {
+ return nil
+ }
+ return e.EligibleForRetry
+}
+
+func (e *EventSummary) GetMetadata() map[string]string {
+ if e == nil {
+ return nil
+ }
+ return e.Metadata
+}
+
type EventUnionType string
const (
@@ -124,7 +283,8 @@ type Attempt struct {
// The destination ID this attempt was sent to.
DestinationID *string `json:"destination_id,omitempty"`
// The associated event object. Only present when include=event or include=event.data.
- Event *EventUnion `json:"event,omitempty"`
+ Event *EventUnion `json:"event,omitempty"`
+ Destination *Destination `json:"destination,omitempty"`
}
func (a Attempt) MarshalJSON() ([]byte, error) {
@@ -214,3 +374,66 @@ func (a *Attempt) GetEvent() *EventUnion {
}
return a.Event
}
+
+func (a *Attempt) GetDestination() *Destination {
+ if a == nil {
+ return nil
+ }
+ return a.Destination
+}
+
+func (a *Attempt) GetDestinationWebhook() *DestinationWebhook {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationWebhook
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationAwsSqs() *DestinationAWSSQS {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationAWSSQS
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationRabbitmq() *DestinationRabbitMQ {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationRabbitMQ
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationHookdeck() *DestinationHookdeck {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationHookdeck
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationAwsKinesis() *DestinationAWSKinesis {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationAWSKinesis
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationAzureServicebus() *DestinationAzureServiceBus {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationAzureServiceBus
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationAwsS3() *DestinationAwss3 {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationAwss3
+ }
+ return nil
+}
+
+func (a *Attempt) GetDestinationGcpPubsub() *DestinationGCPPubSub {
+ if v := a.GetDestination(); v != nil {
+ return v.DestinationGCPPubSub
+ }
+ return nil
+}
diff --git a/sdks/outpost-go/models/components/eventfull.go b/sdks/outpost-go/models/components/eventfull.go
deleted file mode 100644
index 870ed8753..000000000
--- a/sdks/outpost-go/models/components/eventfull.go
+++ /dev/null
@@ -1,92 +0,0 @@
-// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
-
-package components
-
-import (
- "github.com/hookdeck/outpost/sdks/outpost-go/internal/utils"
- "time"
-)
-
-// EventFull - Full event object with data (returned when include=event.data).
-type EventFull struct {
- ID *string `json:"id,omitempty"`
- // The tenant this event belongs to.
- TenantID *string `json:"tenant_id,omitempty"`
- // The destination this event was delivered to.
- DestinationID *string `json:"destination_id,omitempty"`
- Topic *string `json:"topic,omitempty"`
- // Time the event was received.
- Time *time.Time `json:"time,omitempty"`
- // Whether this event can be retried.
- EligibleForRetry *bool `json:"eligible_for_retry,omitempty"`
- Metadata map[string]string `json:"metadata,omitempty"`
- // The event payload data.
- Data map[string]any `json:"data,omitempty"`
-}
-
-func (e EventFull) MarshalJSON() ([]byte, error) {
- return utils.MarshalJSON(e, "", false)
-}
-
-func (e *EventFull) UnmarshalJSON(data []byte) error {
- if err := utils.UnmarshalJSON(data, &e, "", false, nil); err != nil {
- return err
- }
- return nil
-}
-
-func (e *EventFull) GetID() *string {
- if e == nil {
- return nil
- }
- return e.ID
-}
-
-func (e *EventFull) GetTenantID() *string {
- if e == nil {
- return nil
- }
- return e.TenantID
-}
-
-func (e *EventFull) GetDestinationID() *string {
- if e == nil {
- return nil
- }
- return e.DestinationID
-}
-
-func (e *EventFull) GetTopic() *string {
- if e == nil {
- return nil
- }
- return e.Topic
-}
-
-func (e *EventFull) GetTime() *time.Time {
- if e == nil {
- return nil
- }
- return e.Time
-}
-
-func (e *EventFull) GetEligibleForRetry() *bool {
- if e == nil {
- return nil
- }
- return e.EligibleForRetry
-}
-
-func (e *EventFull) GetMetadata() map[string]string {
- if e == nil {
- return nil
- }
- return e.Metadata
-}
-
-func (e *EventFull) GetData() map[string]any {
- if e == nil {
- return nil
- }
- return e.Data
-}
diff --git a/sdks/outpost-go/models/components/eventsummary.go b/sdks/outpost-go/models/components/eventsummary.go
deleted file mode 100644
index d378f04d5..000000000
--- a/sdks/outpost-go/models/components/eventsummary.go
+++ /dev/null
@@ -1,83 +0,0 @@
-// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
-
-package components
-
-import (
- "github.com/hookdeck/outpost/sdks/outpost-go/internal/utils"
- "time"
-)
-
-// EventSummary - Event object without data (returned when include=event).
-type EventSummary struct {
- ID *string `json:"id,omitempty"`
- // The tenant this event belongs to.
- TenantID *string `json:"tenant_id,omitempty"`
- // The destination this event was delivered to.
- DestinationID *string `json:"destination_id,omitempty"`
- Topic *string `json:"topic,omitempty"`
- // Time the event was received.
- Time *time.Time `json:"time,omitempty"`
- // Whether this event can be retried.
- EligibleForRetry *bool `json:"eligible_for_retry,omitempty"`
- Metadata map[string]string `json:"metadata,omitempty"`
-}
-
-func (e EventSummary) MarshalJSON() ([]byte, error) {
- return utils.MarshalJSON(e, "", false)
-}
-
-func (e *EventSummary) UnmarshalJSON(data []byte) error {
- if err := utils.UnmarshalJSON(data, &e, "", false, nil); err != nil {
- return err
- }
- return nil
-}
-
-func (e *EventSummary) GetID() *string {
- if e == nil {
- return nil
- }
- return e.ID
-}
-
-func (e *EventSummary) GetTenantID() *string {
- if e == nil {
- return nil
- }
- return e.TenantID
-}
-
-func (e *EventSummary) GetDestinationID() *string {
- if e == nil {
- return nil
- }
- return e.DestinationID
-}
-
-func (e *EventSummary) GetTopic() *string {
- if e == nil {
- return nil
- }
- return e.Topic
-}
-
-func (e *EventSummary) GetTime() *time.Time {
- if e == nil {
- return nil
- }
- return e.Time
-}
-
-func (e *EventSummary) GetEligibleForRetry() *bool {
- if e == nil {
- return nil
- }
- return e.EligibleForRetry
-}
-
-func (e *EventSummary) GetMetadata() map[string]string {
- if e == nil {
- return nil
- }
- return e.Metadata
-}
diff --git a/sdks/outpost-go/models/components/metricsdatapoint.go b/sdks/outpost-go/models/components/metricsdatapoint.go
new file mode 100644
index 000000000..bbaa6c1ed
--- /dev/null
+++ b/sdks/outpost-go/models/components/metricsdatapoint.go
@@ -0,0 +1,49 @@
+// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
+
+package components
+
+import (
+ "github.com/hookdeck/outpost/sdks/outpost-go/internal/utils"
+ "time"
+)
+
+type MetricsDataPoint struct {
+ // Start of the time bucket. Null when no granularity is specified.
+ TimeBucket *time.Time `json:"time_bucket,omitempty"`
+ // Dimension values for this data point. Empty object when no dimensions are requested.
+ Dimensions map[string]string `json:"dimensions,omitempty"`
+ // Requested measure values for this data point.
+ Metrics map[string]any `json:"metrics,omitempty"`
+}
+
+func (m MetricsDataPoint) MarshalJSON() ([]byte, error) {
+ return utils.MarshalJSON(m, "", false)
+}
+
+func (m *MetricsDataPoint) UnmarshalJSON(data []byte) error {
+ if err := utils.UnmarshalJSON(data, &m, "", false, nil); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (m *MetricsDataPoint) GetTimeBucket() *time.Time {
+ if m == nil {
+ return nil
+ }
+ return m.TimeBucket
+}
+
+func (m *MetricsDataPoint) GetDimensions() map[string]string {
+ if m == nil {
+ return nil
+ }
+ return m.Dimensions
+}
+
+func (m *MetricsDataPoint) GetMetrics() map[string]any {
+ if m == nil {
+ return nil
+ }
+ return m.Metrics
+}
diff --git a/sdks/outpost-go/models/components/metricsmetadata.go b/sdks/outpost-go/models/components/metricsmetadata.go
new file mode 100644
index 000000000..ec2077890
--- /dev/null
+++ b/sdks/outpost-go/models/components/metricsmetadata.go
@@ -0,0 +1,51 @@
+// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
+
+package components
+
+type MetricsMetadata struct {
+ // The granularity used for time bucketing, or null if none was specified.
+ Granularity *string `json:"granularity,omitempty"`
+ // Query execution time in milliseconds.
+ QueryTimeMs *int64 `json:"query_time_ms,omitempty"`
+ // Number of data points returned.
+ RowCount *int64 `json:"row_count,omitempty"`
+ // Maximum number of rows the query will return.
+ RowLimit *int64 `json:"row_limit,omitempty"`
+ // Whether the results were truncated due to hitting the row limit.
+ Truncated *bool `json:"truncated,omitempty"`
+}
+
+func (m *MetricsMetadata) GetGranularity() *string {
+ if m == nil {
+ return nil
+ }
+ return m.Granularity
+}
+
+func (m *MetricsMetadata) GetQueryTimeMs() *int64 {
+ if m == nil {
+ return nil
+ }
+ return m.QueryTimeMs
+}
+
+func (m *MetricsMetadata) GetRowCount() *int64 {
+ if m == nil {
+ return nil
+ }
+ return m.RowCount
+}
+
+func (m *MetricsMetadata) GetRowLimit() *int64 {
+ if m == nil {
+ return nil
+ }
+ return m.RowLimit
+}
+
+func (m *MetricsMetadata) GetTruncated() *bool {
+ if m == nil {
+ return nil
+ }
+ return m.Truncated
+}
diff --git a/sdks/outpost-go/models/components/metricsresponse.go b/sdks/outpost-go/models/components/metricsresponse.go
new file mode 100644
index 000000000..95d8b8989
--- /dev/null
+++ b/sdks/outpost-go/models/components/metricsresponse.go
@@ -0,0 +1,23 @@
+// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
+
+package components
+
+type MetricsResponse struct {
+ // Array of aggregated data points.
+ Data []MetricsDataPoint `json:"data,omitempty"`
+ Metadata *MetricsMetadata `json:"metadata,omitempty"`
+}
+
+func (m *MetricsResponse) GetData() []MetricsDataPoint {
+ if m == nil {
+ return nil
+ }
+ return m.Data
+}
+
+func (m *MetricsResponse) GetMetadata() *MetricsMetadata {
+ if m == nil {
+ return nil
+ }
+ return m.Metadata
+}
diff --git a/sdks/outpost-go/models/operations/getattempt.go b/sdks/outpost-go/models/operations/getattempt.go
index f2c75fc33..907ae735e 100644
--- a/sdks/outpost-go/models/operations/getattempt.go
+++ b/sdks/outpost-go/models/operations/getattempt.go
@@ -13,6 +13,7 @@ type GetAttemptRequest struct {
// - `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
// - `event.data`: Include full event with payload data
// - `response_data`: Include response body and headers
+ // - `destination`: Include the full destination object
//
Include []string `queryParam:"style=form,explode=true,name=include"`
}
diff --git a/sdks/outpost-go/models/operations/getattemptmetrics.go b/sdks/outpost-go/models/operations/getattemptmetrics.go
new file mode 100644
index 000000000..4b4f7ed55
--- /dev/null
+++ b/sdks/outpost-go/models/operations/getattemptmetrics.go
@@ -0,0 +1,936 @@
+// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
+
+package operations
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "github.com/hookdeck/outpost/sdks/outpost-go/internal/utils"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/components"
+ "time"
+)
+
+type GetAttemptMetricsMeasuresEnum2 string
+
+const (
+ GetAttemptMetricsMeasuresEnum2Count GetAttemptMetricsMeasuresEnum2 = "count"
+ GetAttemptMetricsMeasuresEnum2SuccessfulCount GetAttemptMetricsMeasuresEnum2 = "successful_count"
+ GetAttemptMetricsMeasuresEnum2FailedCount GetAttemptMetricsMeasuresEnum2 = "failed_count"
+ GetAttemptMetricsMeasuresEnum2ErrorRate GetAttemptMetricsMeasuresEnum2 = "error_rate"
+ GetAttemptMetricsMeasuresEnum2FirstAttemptCount GetAttemptMetricsMeasuresEnum2 = "first_attempt_count"
+ GetAttemptMetricsMeasuresEnum2RetryCount GetAttemptMetricsMeasuresEnum2 = "retry_count"
+ GetAttemptMetricsMeasuresEnum2ManualRetryCount GetAttemptMetricsMeasuresEnum2 = "manual_retry_count"
+ GetAttemptMetricsMeasuresEnum2AvgAttemptNumber GetAttemptMetricsMeasuresEnum2 = "avg_attempt_number"
+ GetAttemptMetricsMeasuresEnum2Rate GetAttemptMetricsMeasuresEnum2 = "rate"
+ GetAttemptMetricsMeasuresEnum2SuccessfulRate GetAttemptMetricsMeasuresEnum2 = "successful_rate"
+ GetAttemptMetricsMeasuresEnum2FailedRate GetAttemptMetricsMeasuresEnum2 = "failed_rate"
+)
+
+func (e GetAttemptMetricsMeasuresEnum2) ToPointer() *GetAttemptMetricsMeasuresEnum2 {
+ return &e
+}
+func (e *GetAttemptMetricsMeasuresEnum2) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "count":
+ fallthrough
+ case "successful_count":
+ fallthrough
+ case "failed_count":
+ fallthrough
+ case "error_rate":
+ fallthrough
+ case "first_attempt_count":
+ fallthrough
+ case "retry_count":
+ fallthrough
+ case "manual_retry_count":
+ fallthrough
+ case "avg_attempt_number":
+ fallthrough
+ case "rate":
+ fallthrough
+ case "successful_rate":
+ fallthrough
+ case "failed_rate":
+ *e = GetAttemptMetricsMeasuresEnum2(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetAttemptMetricsMeasuresEnum2: %v", v)
+ }
+}
+
+type GetAttemptMetricsMeasuresEnum1 string
+
+const (
+ GetAttemptMetricsMeasuresEnum1Count GetAttemptMetricsMeasuresEnum1 = "count"
+ GetAttemptMetricsMeasuresEnum1SuccessfulCount GetAttemptMetricsMeasuresEnum1 = "successful_count"
+ GetAttemptMetricsMeasuresEnum1FailedCount GetAttemptMetricsMeasuresEnum1 = "failed_count"
+ GetAttemptMetricsMeasuresEnum1ErrorRate GetAttemptMetricsMeasuresEnum1 = "error_rate"
+ GetAttemptMetricsMeasuresEnum1FirstAttemptCount GetAttemptMetricsMeasuresEnum1 = "first_attempt_count"
+ GetAttemptMetricsMeasuresEnum1RetryCount GetAttemptMetricsMeasuresEnum1 = "retry_count"
+ GetAttemptMetricsMeasuresEnum1ManualRetryCount GetAttemptMetricsMeasuresEnum1 = "manual_retry_count"
+ GetAttemptMetricsMeasuresEnum1AvgAttemptNumber GetAttemptMetricsMeasuresEnum1 = "avg_attempt_number"
+ GetAttemptMetricsMeasuresEnum1Rate GetAttemptMetricsMeasuresEnum1 = "rate"
+ GetAttemptMetricsMeasuresEnum1SuccessfulRate GetAttemptMetricsMeasuresEnum1 = "successful_rate"
+ GetAttemptMetricsMeasuresEnum1FailedRate GetAttemptMetricsMeasuresEnum1 = "failed_rate"
+)
+
+func (e GetAttemptMetricsMeasuresEnum1) ToPointer() *GetAttemptMetricsMeasuresEnum1 {
+ return &e
+}
+func (e *GetAttemptMetricsMeasuresEnum1) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "count":
+ fallthrough
+ case "successful_count":
+ fallthrough
+ case "failed_count":
+ fallthrough
+ case "error_rate":
+ fallthrough
+ case "first_attempt_count":
+ fallthrough
+ case "retry_count":
+ fallthrough
+ case "manual_retry_count":
+ fallthrough
+ case "avg_attempt_number":
+ fallthrough
+ case "rate":
+ fallthrough
+ case "successful_rate":
+ fallthrough
+ case "failed_rate":
+ *e = GetAttemptMetricsMeasuresEnum1(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetAttemptMetricsMeasuresEnum1: %v", v)
+ }
+}
+
+type GetAttemptMetricsMeasuresUnionType string
+
+const (
+ GetAttemptMetricsMeasuresUnionTypeGetAttemptMetricsMeasuresEnum1 GetAttemptMetricsMeasuresUnionType = "getAttemptMetrics_measures_enum_1"
+ GetAttemptMetricsMeasuresUnionTypeArrayOfGetAttemptMetricsMeasuresEnum2 GetAttemptMetricsMeasuresUnionType = "arrayOfGetAttemptMetricsMeasuresEnum2"
+)
+
+// GetAttemptMetricsMeasuresUnion - Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).
+type GetAttemptMetricsMeasuresUnion struct {
+ GetAttemptMetricsMeasuresEnum1 *GetAttemptMetricsMeasuresEnum1 `queryParam:"inline" union:"member"`
+ ArrayOfGetAttemptMetricsMeasuresEnum2 []GetAttemptMetricsMeasuresEnum2 `queryParam:"inline" union:"member"`
+
+ Type GetAttemptMetricsMeasuresUnionType
+}
+
+func CreateGetAttemptMetricsMeasuresUnionGetAttemptMetricsMeasuresEnum1(getAttemptMetricsMeasuresEnum1 GetAttemptMetricsMeasuresEnum1) GetAttemptMetricsMeasuresUnion {
+ typ := GetAttemptMetricsMeasuresUnionTypeGetAttemptMetricsMeasuresEnum1
+
+ return GetAttemptMetricsMeasuresUnion{
+ GetAttemptMetricsMeasuresEnum1: &getAttemptMetricsMeasuresEnum1,
+ Type: typ,
+ }
+}
+
+func CreateGetAttemptMetricsMeasuresUnionArrayOfGetAttemptMetricsMeasuresEnum2(arrayOfGetAttemptMetricsMeasuresEnum2 []GetAttemptMetricsMeasuresEnum2) GetAttemptMetricsMeasuresUnion {
+ typ := GetAttemptMetricsMeasuresUnionTypeArrayOfGetAttemptMetricsMeasuresEnum2
+
+ return GetAttemptMetricsMeasuresUnion{
+ ArrayOfGetAttemptMetricsMeasuresEnum2: arrayOfGetAttemptMetricsMeasuresEnum2,
+ Type: typ,
+ }
+}
+
+func (u *GetAttemptMetricsMeasuresUnion) UnmarshalJSON(data []byte) error {
+
+ var getAttemptMetricsMeasuresEnum1 GetAttemptMetricsMeasuresEnum1 = GetAttemptMetricsMeasuresEnum1("")
+ if err := utils.UnmarshalJSON(data, &getAttemptMetricsMeasuresEnum1, "", true, nil); err == nil {
+ u.GetAttemptMetricsMeasuresEnum1 = &getAttemptMetricsMeasuresEnum1
+ u.Type = GetAttemptMetricsMeasuresUnionTypeGetAttemptMetricsMeasuresEnum1
+ return nil
+ }
+
+ var arrayOfGetAttemptMetricsMeasuresEnum2 []GetAttemptMetricsMeasuresEnum2 = []GetAttemptMetricsMeasuresEnum2{}
+ if err := utils.UnmarshalJSON(data, &arrayOfGetAttemptMetricsMeasuresEnum2, "", true, nil); err == nil {
+ u.ArrayOfGetAttemptMetricsMeasuresEnum2 = arrayOfGetAttemptMetricsMeasuresEnum2
+ u.Type = GetAttemptMetricsMeasuresUnionTypeArrayOfGetAttemptMetricsMeasuresEnum2
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetAttemptMetricsMeasuresUnion", string(data))
+}
+
+func (u GetAttemptMetricsMeasuresUnion) MarshalJSON() ([]byte, error) {
+ if u.GetAttemptMetricsMeasuresEnum1 != nil {
+ return utils.MarshalJSON(u.GetAttemptMetricsMeasuresEnum1, "", true)
+ }
+
+ if u.ArrayOfGetAttemptMetricsMeasuresEnum2 != nil {
+ return utils.MarshalJSON(u.ArrayOfGetAttemptMetricsMeasuresEnum2, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetAttemptMetricsMeasuresUnion: all fields are null")
+}
+
+type GetAttemptMetricsDimensionsEnum2 string
+
+const (
+ GetAttemptMetricsDimensionsEnum2TenantID GetAttemptMetricsDimensionsEnum2 = "tenant_id"
+ GetAttemptMetricsDimensionsEnum2DestinationID GetAttemptMetricsDimensionsEnum2 = "destination_id"
+ GetAttemptMetricsDimensionsEnum2Topic GetAttemptMetricsDimensionsEnum2 = "topic"
+ GetAttemptMetricsDimensionsEnum2Status GetAttemptMetricsDimensionsEnum2 = "status"
+ GetAttemptMetricsDimensionsEnum2Code GetAttemptMetricsDimensionsEnum2 = "code"
+ GetAttemptMetricsDimensionsEnum2Manual GetAttemptMetricsDimensionsEnum2 = "manual"
+ GetAttemptMetricsDimensionsEnum2AttemptNumber GetAttemptMetricsDimensionsEnum2 = "attempt_number"
+)
+
+func (e GetAttemptMetricsDimensionsEnum2) ToPointer() *GetAttemptMetricsDimensionsEnum2 {
+ return &e
+}
+func (e *GetAttemptMetricsDimensionsEnum2) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "tenant_id":
+ fallthrough
+ case "destination_id":
+ fallthrough
+ case "topic":
+ fallthrough
+ case "status":
+ fallthrough
+ case "code":
+ fallthrough
+ case "manual":
+ fallthrough
+ case "attempt_number":
+ *e = GetAttemptMetricsDimensionsEnum2(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetAttemptMetricsDimensionsEnum2: %v", v)
+ }
+}
+
+type GetAttemptMetricsDimensionsEnum1 string
+
+const (
+ GetAttemptMetricsDimensionsEnum1TenantID GetAttemptMetricsDimensionsEnum1 = "tenant_id"
+ GetAttemptMetricsDimensionsEnum1DestinationID GetAttemptMetricsDimensionsEnum1 = "destination_id"
+ GetAttemptMetricsDimensionsEnum1Topic GetAttemptMetricsDimensionsEnum1 = "topic"
+ GetAttemptMetricsDimensionsEnum1Status GetAttemptMetricsDimensionsEnum1 = "status"
+ GetAttemptMetricsDimensionsEnum1Code GetAttemptMetricsDimensionsEnum1 = "code"
+ GetAttemptMetricsDimensionsEnum1Manual GetAttemptMetricsDimensionsEnum1 = "manual"
+ GetAttemptMetricsDimensionsEnum1AttemptNumber GetAttemptMetricsDimensionsEnum1 = "attempt_number"
+)
+
+func (e GetAttemptMetricsDimensionsEnum1) ToPointer() *GetAttemptMetricsDimensionsEnum1 {
+ return &e
+}
+func (e *GetAttemptMetricsDimensionsEnum1) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "tenant_id":
+ fallthrough
+ case "destination_id":
+ fallthrough
+ case "topic":
+ fallthrough
+ case "status":
+ fallthrough
+ case "code":
+ fallthrough
+ case "manual":
+ fallthrough
+ case "attempt_number":
+ *e = GetAttemptMetricsDimensionsEnum1(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetAttemptMetricsDimensionsEnum1: %v", v)
+ }
+}
+
+type GetAttemptMetricsDimensionsUnionType string
+
+const (
+ GetAttemptMetricsDimensionsUnionTypeGetAttemptMetricsDimensionsEnum1 GetAttemptMetricsDimensionsUnionType = "getAttemptMetrics_dimensions_enum_1"
+ GetAttemptMetricsDimensionsUnionTypeArrayOfGetAttemptMetricsDimensionsEnum2 GetAttemptMetricsDimensionsUnionType = "arrayOfGetAttemptMetricsDimensionsEnum2"
+)
+
+// GetAttemptMetricsDimensionsUnion - Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`).
+type GetAttemptMetricsDimensionsUnion struct {
+ GetAttemptMetricsDimensionsEnum1 *GetAttemptMetricsDimensionsEnum1 `queryParam:"inline" union:"member"`
+ ArrayOfGetAttemptMetricsDimensionsEnum2 []GetAttemptMetricsDimensionsEnum2 `queryParam:"inline" union:"member"`
+
+ Type GetAttemptMetricsDimensionsUnionType
+}
+
+func CreateGetAttemptMetricsDimensionsUnionGetAttemptMetricsDimensionsEnum1(getAttemptMetricsDimensionsEnum1 GetAttemptMetricsDimensionsEnum1) GetAttemptMetricsDimensionsUnion {
+ typ := GetAttemptMetricsDimensionsUnionTypeGetAttemptMetricsDimensionsEnum1
+
+ return GetAttemptMetricsDimensionsUnion{
+ GetAttemptMetricsDimensionsEnum1: &getAttemptMetricsDimensionsEnum1,
+ Type: typ,
+ }
+}
+
+func CreateGetAttemptMetricsDimensionsUnionArrayOfGetAttemptMetricsDimensionsEnum2(arrayOfGetAttemptMetricsDimensionsEnum2 []GetAttemptMetricsDimensionsEnum2) GetAttemptMetricsDimensionsUnion {
+ typ := GetAttemptMetricsDimensionsUnionTypeArrayOfGetAttemptMetricsDimensionsEnum2
+
+ return GetAttemptMetricsDimensionsUnion{
+ ArrayOfGetAttemptMetricsDimensionsEnum2: arrayOfGetAttemptMetricsDimensionsEnum2,
+ Type: typ,
+ }
+}
+
+func (u *GetAttemptMetricsDimensionsUnion) UnmarshalJSON(data []byte) error {
+
+ var getAttemptMetricsDimensionsEnum1 GetAttemptMetricsDimensionsEnum1 = GetAttemptMetricsDimensionsEnum1("")
+ if err := utils.UnmarshalJSON(data, &getAttemptMetricsDimensionsEnum1, "", true, nil); err == nil {
+ u.GetAttemptMetricsDimensionsEnum1 = &getAttemptMetricsDimensionsEnum1
+ u.Type = GetAttemptMetricsDimensionsUnionTypeGetAttemptMetricsDimensionsEnum1
+ return nil
+ }
+
+ var arrayOfGetAttemptMetricsDimensionsEnum2 []GetAttemptMetricsDimensionsEnum2 = []GetAttemptMetricsDimensionsEnum2{}
+ if err := utils.UnmarshalJSON(data, &arrayOfGetAttemptMetricsDimensionsEnum2, "", true, nil); err == nil {
+ u.ArrayOfGetAttemptMetricsDimensionsEnum2 = arrayOfGetAttemptMetricsDimensionsEnum2
+ u.Type = GetAttemptMetricsDimensionsUnionTypeArrayOfGetAttemptMetricsDimensionsEnum2
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetAttemptMetricsDimensionsUnion", string(data))
+}
+
+func (u GetAttemptMetricsDimensionsUnion) MarshalJSON() ([]byte, error) {
+ if u.GetAttemptMetricsDimensionsEnum1 != nil {
+ return utils.MarshalJSON(u.GetAttemptMetricsDimensionsEnum1, "", true)
+ }
+
+ if u.ArrayOfGetAttemptMetricsDimensionsEnum2 != nil {
+ return utils.MarshalJSON(u.ArrayOfGetAttemptMetricsDimensionsEnum2, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetAttemptMetricsDimensionsUnion: all fields are null")
+}
+
+type GetAttemptMetricsFiltersDestinationIDType string
+
+const (
+ GetAttemptMetricsFiltersDestinationIDTypeStr GetAttemptMetricsFiltersDestinationIDType = "str"
+ GetAttemptMetricsFiltersDestinationIDTypeArrayOfStr GetAttemptMetricsFiltersDestinationIDType = "arrayOfStr"
+)
+
+// GetAttemptMetricsFiltersDestinationID - Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`).
+type GetAttemptMetricsFiltersDestinationID struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type GetAttemptMetricsFiltersDestinationIDType
+}
+
+func CreateGetAttemptMetricsFiltersDestinationIDStr(str string) GetAttemptMetricsFiltersDestinationID {
+ typ := GetAttemptMetricsFiltersDestinationIDTypeStr
+
+ return GetAttemptMetricsFiltersDestinationID{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateGetAttemptMetricsFiltersDestinationIDArrayOfStr(arrayOfStr []string) GetAttemptMetricsFiltersDestinationID {
+ typ := GetAttemptMetricsFiltersDestinationIDTypeArrayOfStr
+
+ return GetAttemptMetricsFiltersDestinationID{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *GetAttemptMetricsFiltersDestinationID) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = GetAttemptMetricsFiltersDestinationIDTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = GetAttemptMetricsFiltersDestinationIDTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetAttemptMetricsFiltersDestinationID", string(data))
+}
+
+func (u GetAttemptMetricsFiltersDestinationID) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetAttemptMetricsFiltersDestinationID: all fields are null")
+}
+
+type GetAttemptMetricsFiltersTopicType string
+
+const (
+ GetAttemptMetricsFiltersTopicTypeStr GetAttemptMetricsFiltersTopicType = "str"
+ GetAttemptMetricsFiltersTopicTypeArrayOfStr GetAttemptMetricsFiltersTopicType = "arrayOfStr"
+)
+
+// GetAttemptMetricsFiltersTopic - Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`).
+type GetAttemptMetricsFiltersTopic struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type GetAttemptMetricsFiltersTopicType
+}
+
+func CreateGetAttemptMetricsFiltersTopicStr(str string) GetAttemptMetricsFiltersTopic {
+ typ := GetAttemptMetricsFiltersTopicTypeStr
+
+ return GetAttemptMetricsFiltersTopic{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateGetAttemptMetricsFiltersTopicArrayOfStr(arrayOfStr []string) GetAttemptMetricsFiltersTopic {
+ typ := GetAttemptMetricsFiltersTopicTypeArrayOfStr
+
+ return GetAttemptMetricsFiltersTopic{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *GetAttemptMetricsFiltersTopic) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = GetAttemptMetricsFiltersTopicTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = GetAttemptMetricsFiltersTopicTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetAttemptMetricsFiltersTopic", string(data))
+}
+
+func (u GetAttemptMetricsFiltersTopic) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetAttemptMetricsFiltersTopic: all fields are null")
+}
+
+type FiltersStatusEnum2 string
+
+const (
+ FiltersStatusEnum2Success FiltersStatusEnum2 = "success"
+ FiltersStatusEnum2Failed FiltersStatusEnum2 = "failed"
+)
+
+func (e FiltersStatusEnum2) ToPointer() *FiltersStatusEnum2 {
+ return &e
+}
+func (e *FiltersStatusEnum2) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "success":
+ fallthrough
+ case "failed":
+ *e = FiltersStatusEnum2(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for FiltersStatusEnum2: %v", v)
+ }
+}
+
+type FiltersStatusEnum1 string
+
+const (
+ FiltersStatusEnum1Success FiltersStatusEnum1 = "success"
+ FiltersStatusEnum1Failed FiltersStatusEnum1 = "failed"
+)
+
+func (e FiltersStatusEnum1) ToPointer() *FiltersStatusEnum1 {
+ return &e
+}
+func (e *FiltersStatusEnum1) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "success":
+ fallthrough
+ case "failed":
+ *e = FiltersStatusEnum1(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for FiltersStatusEnum1: %v", v)
+ }
+}
+
+type FiltersStatusType string
+
+const (
+ FiltersStatusTypeFiltersStatusEnum1 FiltersStatusType = "filters[status]_enum_1"
+ FiltersStatusTypeArrayOfFiltersStatusEnum2 FiltersStatusType = "arrayOfFilters[status]Enum2"
+)
+
+// FiltersStatus - Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`).
+type FiltersStatus struct {
+ FiltersStatusEnum1 *FiltersStatusEnum1 `queryParam:"inline" union:"member"`
+ ArrayOfFiltersStatusEnum2 []FiltersStatusEnum2 `queryParam:"inline" union:"member"`
+
+ Type FiltersStatusType
+}
+
+func CreateFiltersStatusFiltersStatusEnum1(filtersStatusEnum1 FiltersStatusEnum1) FiltersStatus {
+ typ := FiltersStatusTypeFiltersStatusEnum1
+
+ return FiltersStatus{
+ FiltersStatusEnum1: &filtersStatusEnum1,
+ Type: typ,
+ }
+}
+
+func CreateFiltersStatusArrayOfFiltersStatusEnum2(arrayOfFiltersStatusEnum2 []FiltersStatusEnum2) FiltersStatus {
+ typ := FiltersStatusTypeArrayOfFiltersStatusEnum2
+
+ return FiltersStatus{
+ ArrayOfFiltersStatusEnum2: arrayOfFiltersStatusEnum2,
+ Type: typ,
+ }
+}
+
+func (u *FiltersStatus) UnmarshalJSON(data []byte) error {
+
+ var filtersStatusEnum1 FiltersStatusEnum1 = FiltersStatusEnum1("")
+ if err := utils.UnmarshalJSON(data, &filtersStatusEnum1, "", true, nil); err == nil {
+ u.FiltersStatusEnum1 = &filtersStatusEnum1
+ u.Type = FiltersStatusTypeFiltersStatusEnum1
+ return nil
+ }
+
+ var arrayOfFiltersStatusEnum2 []FiltersStatusEnum2 = []FiltersStatusEnum2{}
+ if err := utils.UnmarshalJSON(data, &arrayOfFiltersStatusEnum2, "", true, nil); err == nil {
+ u.ArrayOfFiltersStatusEnum2 = arrayOfFiltersStatusEnum2
+ u.Type = FiltersStatusTypeArrayOfFiltersStatusEnum2
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for FiltersStatus", string(data))
+}
+
+func (u FiltersStatus) MarshalJSON() ([]byte, error) {
+ if u.FiltersStatusEnum1 != nil {
+ return utils.MarshalJSON(u.FiltersStatusEnum1, "", true)
+ }
+
+ if u.ArrayOfFiltersStatusEnum2 != nil {
+ return utils.MarshalJSON(u.ArrayOfFiltersStatusEnum2, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type FiltersStatus: all fields are null")
+}
+
+type FiltersCodeType string
+
+const (
+ FiltersCodeTypeStr FiltersCodeType = "str"
+ FiltersCodeTypeArrayOfStr FiltersCodeType = "arrayOfStr"
+)
+
+// FiltersCode - Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`).
+type FiltersCode struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type FiltersCodeType
+}
+
+func CreateFiltersCodeStr(str string) FiltersCode {
+ typ := FiltersCodeTypeStr
+
+ return FiltersCode{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateFiltersCodeArrayOfStr(arrayOfStr []string) FiltersCode {
+ typ := FiltersCodeTypeArrayOfStr
+
+ return FiltersCode{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *FiltersCode) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = FiltersCodeTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = FiltersCodeTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for FiltersCode", string(data))
+}
+
+func (u FiltersCode) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type FiltersCode: all fields are null")
+}
+
+// FiltersManual - Filter by manual retry flag.
+type FiltersManual string
+
+const (
+ FiltersManualTrue FiltersManual = "true"
+ FiltersManualFalse FiltersManual = "false"
+)
+
+func (e FiltersManual) ToPointer() *FiltersManual {
+ return &e
+}
+func (e *FiltersManual) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "true":
+ fallthrough
+ case "false":
+ *e = FiltersManual(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for FiltersManual: %v", v)
+ }
+}
+
+type FiltersAttemptNumberType string
+
+const (
+ FiltersAttemptNumberTypeStr FiltersAttemptNumberType = "str"
+ FiltersAttemptNumberTypeArrayOfStr FiltersAttemptNumberType = "arrayOfStr"
+)
+
+// FiltersAttemptNumber - Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`).
+type FiltersAttemptNumber struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type FiltersAttemptNumberType
+}
+
+func CreateFiltersAttemptNumberStr(str string) FiltersAttemptNumber {
+ typ := FiltersAttemptNumberTypeStr
+
+ return FiltersAttemptNumber{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateFiltersAttemptNumberArrayOfStr(arrayOfStr []string) FiltersAttemptNumber {
+ typ := FiltersAttemptNumberTypeArrayOfStr
+
+ return FiltersAttemptNumber{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *FiltersAttemptNumber) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = FiltersAttemptNumberTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = FiltersAttemptNumberTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for FiltersAttemptNumber", string(data))
+}
+
+func (u FiltersAttemptNumber) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type FiltersAttemptNumber: all fields are null")
+}
+
+type GetAttemptMetricsFiltersTenantIDType string
+
+const (
+ GetAttemptMetricsFiltersTenantIDTypeStr GetAttemptMetricsFiltersTenantIDType = "str"
+ GetAttemptMetricsFiltersTenantIDTypeArrayOfStr GetAttemptMetricsFiltersTenantIDType = "arrayOfStr"
+)
+
+// GetAttemptMetricsFiltersTenantID - Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`).
+type GetAttemptMetricsFiltersTenantID struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type GetAttemptMetricsFiltersTenantIDType
+}
+
+func CreateGetAttemptMetricsFiltersTenantIDStr(str string) GetAttemptMetricsFiltersTenantID {
+ typ := GetAttemptMetricsFiltersTenantIDTypeStr
+
+ return GetAttemptMetricsFiltersTenantID{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateGetAttemptMetricsFiltersTenantIDArrayOfStr(arrayOfStr []string) GetAttemptMetricsFiltersTenantID {
+ typ := GetAttemptMetricsFiltersTenantIDTypeArrayOfStr
+
+ return GetAttemptMetricsFiltersTenantID{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *GetAttemptMetricsFiltersTenantID) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = GetAttemptMetricsFiltersTenantIDTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = GetAttemptMetricsFiltersTenantIDTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetAttemptMetricsFiltersTenantID", string(data))
+}
+
+func (u GetAttemptMetricsFiltersTenantID) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetAttemptMetricsFiltersTenantID: all fields are null")
+}
+
+type GetAttemptMetricsRequest struct {
+ // Start of the time range (inclusive). ISO 8601 timestamp.
+ TimeStart time.Time `queryParam:"style=form,explode=true,name=time[start]"`
+ // End of the time range (exclusive). ISO 8601 timestamp.
+ TimeEnd time.Time `queryParam:"style=form,explode=true,name=time[end]"`
+ // Time bucketing granularity. Pattern: ``.
+ // Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
+ // When omitted, returns a single aggregate row per dimension combination.
+ //
+ Granularity *string `queryParam:"style=form,explode=true,name=granularity"`
+ // Measures to compute. At least one required. Rate measures (`rate`, `successful_rate`, `failed_rate`) are throughput in events/second. Use bracket notation for multiple values (e.g., `measures[0]=count&measures[1]=error_rate`).
+ Measures GetAttemptMetricsMeasuresUnion `queryParam:"style=form,explode=true,name=measures"`
+ // Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=status&dimensions[1]=destination_id`).
+ Dimensions *GetAttemptMetricsDimensionsUnion `queryParam:"style=form,explode=true,name=dimensions"`
+ // Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`).
+ FiltersDestinationID *GetAttemptMetricsFiltersDestinationID `queryParam:"style=form,explode=true,name=filters[destination_id]"`
+ // Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`).
+ FiltersTopic *GetAttemptMetricsFiltersTopic `queryParam:"style=form,explode=true,name=filters[topic]"`
+ // Filter by attempt status(es). Use bracket notation for multiple values (e.g., `filters[status][0]=success&filters[status][1]=failed`).
+ FiltersStatus *FiltersStatus `queryParam:"style=form,explode=true,name=filters[status]"`
+ // Filter by HTTP status code(s). Use bracket notation for multiple values (e.g., `filters[code][0]=200&filters[code][1]=500`).
+ FiltersCode *FiltersCode `queryParam:"style=form,explode=true,name=filters[code]"`
+ // Filter by manual retry flag.
+ FiltersManual *FiltersManual `queryParam:"style=form,explode=true,name=filters[manual]"`
+ // Filter by attempt number(s). Use bracket notation for multiple values (e.g., `filters[attempt_number][0]=1&filters[attempt_number][1]=2`).
+ FiltersAttemptNumber *FiltersAttemptNumber `queryParam:"style=form,explode=true,name=filters[attempt_number]"`
+ // Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`).
+ FiltersTenantID *GetAttemptMetricsFiltersTenantID `queryParam:"style=form,explode=true,name=filters[tenant_id]"`
+}
+
+func (g GetAttemptMetricsRequest) MarshalJSON() ([]byte, error) {
+ return utils.MarshalJSON(g, "", false)
+}
+
+func (g *GetAttemptMetricsRequest) UnmarshalJSON(data []byte) error {
+ if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (g *GetAttemptMetricsRequest) GetTimeStart() time.Time {
+ if g == nil {
+ return time.Time{}
+ }
+ return g.TimeStart
+}
+
+func (g *GetAttemptMetricsRequest) GetTimeEnd() time.Time {
+ if g == nil {
+ return time.Time{}
+ }
+ return g.TimeEnd
+}
+
+func (g *GetAttemptMetricsRequest) GetGranularity() *string {
+ if g == nil {
+ return nil
+ }
+ return g.Granularity
+}
+
+func (g *GetAttemptMetricsRequest) GetMeasures() GetAttemptMetricsMeasuresUnion {
+ if g == nil {
+ return GetAttemptMetricsMeasuresUnion{}
+ }
+ return g.Measures
+}
+
+func (g *GetAttemptMetricsRequest) GetDimensions() *GetAttemptMetricsDimensionsUnion {
+ if g == nil {
+ return nil
+ }
+ return g.Dimensions
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersDestinationID() *GetAttemptMetricsFiltersDestinationID {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersDestinationID
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersTopic() *GetAttemptMetricsFiltersTopic {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersTopic
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersStatus() *FiltersStatus {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersStatus
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersCode() *FiltersCode {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersCode
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersManual() *FiltersManual {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersManual
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersAttemptNumber() *FiltersAttemptNumber {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersAttemptNumber
+}
+
+func (g *GetAttemptMetricsRequest) GetFiltersTenantID() *GetAttemptMetricsFiltersTenantID {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersTenantID
+}
+
+type GetAttemptMetricsResponse struct {
+ HTTPMeta components.HTTPMetadata `json:"-"`
+ // Aggregated attempt metrics.
+ MetricsResponse *components.MetricsResponse
+}
+
+func (g *GetAttemptMetricsResponse) GetHTTPMeta() components.HTTPMetadata {
+ if g == nil {
+ return components.HTTPMetadata{}
+ }
+ return g.HTTPMeta
+}
+
+func (g *GetAttemptMetricsResponse) GetMetricsResponse() *components.MetricsResponse {
+ if g == nil {
+ return nil
+ }
+ return g.MetricsResponse
+}
diff --git a/sdks/outpost-go/models/operations/geteventmetrics.go b/sdks/outpost-go/models/operations/geteventmetrics.go
new file mode 100644
index 000000000..87fab145f
--- /dev/null
+++ b/sdks/outpost-go/models/operations/geteventmetrics.go
@@ -0,0 +1,551 @@
+// Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
+
+package operations
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "github.com/hookdeck/outpost/sdks/outpost-go/internal/utils"
+ "github.com/hookdeck/outpost/sdks/outpost-go/models/components"
+ "time"
+)
+
+type GetEventMetricsMeasuresEnum2 string
+
+const (
+ GetEventMetricsMeasuresEnum2Count GetEventMetricsMeasuresEnum2 = "count"
+ GetEventMetricsMeasuresEnum2Rate GetEventMetricsMeasuresEnum2 = "rate"
+)
+
+func (e GetEventMetricsMeasuresEnum2) ToPointer() *GetEventMetricsMeasuresEnum2 {
+ return &e
+}
+func (e *GetEventMetricsMeasuresEnum2) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "count":
+ fallthrough
+ case "rate":
+ *e = GetEventMetricsMeasuresEnum2(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetEventMetricsMeasuresEnum2: %v", v)
+ }
+}
+
+type GetEventMetricsMeasuresEnum1 string
+
+const (
+ GetEventMetricsMeasuresEnum1Count GetEventMetricsMeasuresEnum1 = "count"
+ GetEventMetricsMeasuresEnum1Rate GetEventMetricsMeasuresEnum1 = "rate"
+)
+
+func (e GetEventMetricsMeasuresEnum1) ToPointer() *GetEventMetricsMeasuresEnum1 {
+ return &e
+}
+func (e *GetEventMetricsMeasuresEnum1) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "count":
+ fallthrough
+ case "rate":
+ *e = GetEventMetricsMeasuresEnum1(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetEventMetricsMeasuresEnum1: %v", v)
+ }
+}
+
+type GetEventMetricsMeasuresUnionType string
+
+const (
+ GetEventMetricsMeasuresUnionTypeGetEventMetricsMeasuresEnum1 GetEventMetricsMeasuresUnionType = "getEventMetrics_measures_enum_1"
+ GetEventMetricsMeasuresUnionTypeArrayOfGetEventMetricsMeasuresEnum2 GetEventMetricsMeasuresUnionType = "arrayOfGetEventMetricsMeasuresEnum2"
+)
+
+// GetEventMetricsMeasuresUnion - Measures to compute. At least one required. `rate` is events/second throughput. Use bracket notation for multiple values (e.g., `measures[0]=count`).
+type GetEventMetricsMeasuresUnion struct {
+ GetEventMetricsMeasuresEnum1 *GetEventMetricsMeasuresEnum1 `queryParam:"inline" union:"member"`
+ ArrayOfGetEventMetricsMeasuresEnum2 []GetEventMetricsMeasuresEnum2 `queryParam:"inline" union:"member"`
+
+ Type GetEventMetricsMeasuresUnionType
+}
+
+func CreateGetEventMetricsMeasuresUnionGetEventMetricsMeasuresEnum1(getEventMetricsMeasuresEnum1 GetEventMetricsMeasuresEnum1) GetEventMetricsMeasuresUnion {
+ typ := GetEventMetricsMeasuresUnionTypeGetEventMetricsMeasuresEnum1
+
+ return GetEventMetricsMeasuresUnion{
+ GetEventMetricsMeasuresEnum1: &getEventMetricsMeasuresEnum1,
+ Type: typ,
+ }
+}
+
+func CreateGetEventMetricsMeasuresUnionArrayOfGetEventMetricsMeasuresEnum2(arrayOfGetEventMetricsMeasuresEnum2 []GetEventMetricsMeasuresEnum2) GetEventMetricsMeasuresUnion {
+ typ := GetEventMetricsMeasuresUnionTypeArrayOfGetEventMetricsMeasuresEnum2
+
+ return GetEventMetricsMeasuresUnion{
+ ArrayOfGetEventMetricsMeasuresEnum2: arrayOfGetEventMetricsMeasuresEnum2,
+ Type: typ,
+ }
+}
+
+func (u *GetEventMetricsMeasuresUnion) UnmarshalJSON(data []byte) error {
+
+ var getEventMetricsMeasuresEnum1 GetEventMetricsMeasuresEnum1 = GetEventMetricsMeasuresEnum1("")
+ if err := utils.UnmarshalJSON(data, &getEventMetricsMeasuresEnum1, "", true, nil); err == nil {
+ u.GetEventMetricsMeasuresEnum1 = &getEventMetricsMeasuresEnum1
+ u.Type = GetEventMetricsMeasuresUnionTypeGetEventMetricsMeasuresEnum1
+ return nil
+ }
+
+ var arrayOfGetEventMetricsMeasuresEnum2 []GetEventMetricsMeasuresEnum2 = []GetEventMetricsMeasuresEnum2{}
+ if err := utils.UnmarshalJSON(data, &arrayOfGetEventMetricsMeasuresEnum2, "", true, nil); err == nil {
+ u.ArrayOfGetEventMetricsMeasuresEnum2 = arrayOfGetEventMetricsMeasuresEnum2
+ u.Type = GetEventMetricsMeasuresUnionTypeArrayOfGetEventMetricsMeasuresEnum2
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetEventMetricsMeasuresUnion", string(data))
+}
+
+func (u GetEventMetricsMeasuresUnion) MarshalJSON() ([]byte, error) {
+ if u.GetEventMetricsMeasuresEnum1 != nil {
+ return utils.MarshalJSON(u.GetEventMetricsMeasuresEnum1, "", true)
+ }
+
+ if u.ArrayOfGetEventMetricsMeasuresEnum2 != nil {
+ return utils.MarshalJSON(u.ArrayOfGetEventMetricsMeasuresEnum2, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetEventMetricsMeasuresUnion: all fields are null")
+}
+
+type GetEventMetricsDimensionsEnum2 string
+
+const (
+ GetEventMetricsDimensionsEnum2TenantID GetEventMetricsDimensionsEnum2 = "tenant_id"
+ GetEventMetricsDimensionsEnum2Topic GetEventMetricsDimensionsEnum2 = "topic"
+ GetEventMetricsDimensionsEnum2DestinationID GetEventMetricsDimensionsEnum2 = "destination_id"
+)
+
+func (e GetEventMetricsDimensionsEnum2) ToPointer() *GetEventMetricsDimensionsEnum2 {
+ return &e
+}
+func (e *GetEventMetricsDimensionsEnum2) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "tenant_id":
+ fallthrough
+ case "topic":
+ fallthrough
+ case "destination_id":
+ *e = GetEventMetricsDimensionsEnum2(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetEventMetricsDimensionsEnum2: %v", v)
+ }
+}
+
+type GetEventMetricsDimensionsEnum1 string
+
+const (
+ GetEventMetricsDimensionsEnum1TenantID GetEventMetricsDimensionsEnum1 = "tenant_id"
+ GetEventMetricsDimensionsEnum1Topic GetEventMetricsDimensionsEnum1 = "topic"
+ GetEventMetricsDimensionsEnum1DestinationID GetEventMetricsDimensionsEnum1 = "destination_id"
+)
+
+func (e GetEventMetricsDimensionsEnum1) ToPointer() *GetEventMetricsDimensionsEnum1 {
+ return &e
+}
+func (e *GetEventMetricsDimensionsEnum1) UnmarshalJSON(data []byte) error {
+ var v string
+ if err := json.Unmarshal(data, &v); err != nil {
+ return err
+ }
+ switch v {
+ case "tenant_id":
+ fallthrough
+ case "topic":
+ fallthrough
+ case "destination_id":
+ *e = GetEventMetricsDimensionsEnum1(v)
+ return nil
+ default:
+ return fmt.Errorf("invalid value for GetEventMetricsDimensionsEnum1: %v", v)
+ }
+}
+
+type GetEventMetricsDimensionsUnionType string
+
+const (
+ GetEventMetricsDimensionsUnionTypeGetEventMetricsDimensionsEnum1 GetEventMetricsDimensionsUnionType = "getEventMetrics_dimensions_enum_1"
+ GetEventMetricsDimensionsUnionTypeArrayOfGetEventMetricsDimensionsEnum2 GetEventMetricsDimensionsUnionType = "arrayOfGetEventMetricsDimensionsEnum2"
+)
+
+// GetEventMetricsDimensionsUnion - Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=topic&dimensions[1]=destination_id`).
+type GetEventMetricsDimensionsUnion struct {
+ GetEventMetricsDimensionsEnum1 *GetEventMetricsDimensionsEnum1 `queryParam:"inline" union:"member"`
+ ArrayOfGetEventMetricsDimensionsEnum2 []GetEventMetricsDimensionsEnum2 `queryParam:"inline" union:"member"`
+
+ Type GetEventMetricsDimensionsUnionType
+}
+
+func CreateGetEventMetricsDimensionsUnionGetEventMetricsDimensionsEnum1(getEventMetricsDimensionsEnum1 GetEventMetricsDimensionsEnum1) GetEventMetricsDimensionsUnion {
+ typ := GetEventMetricsDimensionsUnionTypeGetEventMetricsDimensionsEnum1
+
+ return GetEventMetricsDimensionsUnion{
+ GetEventMetricsDimensionsEnum1: &getEventMetricsDimensionsEnum1,
+ Type: typ,
+ }
+}
+
+func CreateGetEventMetricsDimensionsUnionArrayOfGetEventMetricsDimensionsEnum2(arrayOfGetEventMetricsDimensionsEnum2 []GetEventMetricsDimensionsEnum2) GetEventMetricsDimensionsUnion {
+ typ := GetEventMetricsDimensionsUnionTypeArrayOfGetEventMetricsDimensionsEnum2
+
+ return GetEventMetricsDimensionsUnion{
+ ArrayOfGetEventMetricsDimensionsEnum2: arrayOfGetEventMetricsDimensionsEnum2,
+ Type: typ,
+ }
+}
+
+func (u *GetEventMetricsDimensionsUnion) UnmarshalJSON(data []byte) error {
+
+ var getEventMetricsDimensionsEnum1 GetEventMetricsDimensionsEnum1 = GetEventMetricsDimensionsEnum1("")
+ if err := utils.UnmarshalJSON(data, &getEventMetricsDimensionsEnum1, "", true, nil); err == nil {
+ u.GetEventMetricsDimensionsEnum1 = &getEventMetricsDimensionsEnum1
+ u.Type = GetEventMetricsDimensionsUnionTypeGetEventMetricsDimensionsEnum1
+ return nil
+ }
+
+ var arrayOfGetEventMetricsDimensionsEnum2 []GetEventMetricsDimensionsEnum2 = []GetEventMetricsDimensionsEnum2{}
+ if err := utils.UnmarshalJSON(data, &arrayOfGetEventMetricsDimensionsEnum2, "", true, nil); err == nil {
+ u.ArrayOfGetEventMetricsDimensionsEnum2 = arrayOfGetEventMetricsDimensionsEnum2
+ u.Type = GetEventMetricsDimensionsUnionTypeArrayOfGetEventMetricsDimensionsEnum2
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetEventMetricsDimensionsUnion", string(data))
+}
+
+func (u GetEventMetricsDimensionsUnion) MarshalJSON() ([]byte, error) {
+ if u.GetEventMetricsDimensionsEnum1 != nil {
+ return utils.MarshalJSON(u.GetEventMetricsDimensionsEnum1, "", true)
+ }
+
+ if u.ArrayOfGetEventMetricsDimensionsEnum2 != nil {
+ return utils.MarshalJSON(u.ArrayOfGetEventMetricsDimensionsEnum2, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetEventMetricsDimensionsUnion: all fields are null")
+}
+
+type GetEventMetricsFiltersTopicType string
+
+const (
+ GetEventMetricsFiltersTopicTypeStr GetEventMetricsFiltersTopicType = "str"
+ GetEventMetricsFiltersTopicTypeArrayOfStr GetEventMetricsFiltersTopicType = "arrayOfStr"
+)
+
+// GetEventMetricsFiltersTopic - Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`).
+type GetEventMetricsFiltersTopic struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type GetEventMetricsFiltersTopicType
+}
+
+func CreateGetEventMetricsFiltersTopicStr(str string) GetEventMetricsFiltersTopic {
+ typ := GetEventMetricsFiltersTopicTypeStr
+
+ return GetEventMetricsFiltersTopic{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateGetEventMetricsFiltersTopicArrayOfStr(arrayOfStr []string) GetEventMetricsFiltersTopic {
+ typ := GetEventMetricsFiltersTopicTypeArrayOfStr
+
+ return GetEventMetricsFiltersTopic{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *GetEventMetricsFiltersTopic) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = GetEventMetricsFiltersTopicTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = GetEventMetricsFiltersTopicTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetEventMetricsFiltersTopic", string(data))
+}
+
+func (u GetEventMetricsFiltersTopic) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetEventMetricsFiltersTopic: all fields are null")
+}
+
+type GetEventMetricsFiltersDestinationIDType string
+
+const (
+ GetEventMetricsFiltersDestinationIDTypeStr GetEventMetricsFiltersDestinationIDType = "str"
+ GetEventMetricsFiltersDestinationIDTypeArrayOfStr GetEventMetricsFiltersDestinationIDType = "arrayOfStr"
+)
+
+// GetEventMetricsFiltersDestinationID - Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`).
+type GetEventMetricsFiltersDestinationID struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type GetEventMetricsFiltersDestinationIDType
+}
+
+func CreateGetEventMetricsFiltersDestinationIDStr(str string) GetEventMetricsFiltersDestinationID {
+ typ := GetEventMetricsFiltersDestinationIDTypeStr
+
+ return GetEventMetricsFiltersDestinationID{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateGetEventMetricsFiltersDestinationIDArrayOfStr(arrayOfStr []string) GetEventMetricsFiltersDestinationID {
+ typ := GetEventMetricsFiltersDestinationIDTypeArrayOfStr
+
+ return GetEventMetricsFiltersDestinationID{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *GetEventMetricsFiltersDestinationID) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = GetEventMetricsFiltersDestinationIDTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = GetEventMetricsFiltersDestinationIDTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetEventMetricsFiltersDestinationID", string(data))
+}
+
+func (u GetEventMetricsFiltersDestinationID) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetEventMetricsFiltersDestinationID: all fields are null")
+}
+
+type GetEventMetricsFiltersTenantIDType string
+
+const (
+ GetEventMetricsFiltersTenantIDTypeStr GetEventMetricsFiltersTenantIDType = "str"
+ GetEventMetricsFiltersTenantIDTypeArrayOfStr GetEventMetricsFiltersTenantIDType = "arrayOfStr"
+)
+
+// GetEventMetricsFiltersTenantID - Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`).
+type GetEventMetricsFiltersTenantID struct {
+ Str *string `queryParam:"inline" union:"member"`
+ ArrayOfStr []string `queryParam:"inline" union:"member"`
+
+ Type GetEventMetricsFiltersTenantIDType
+}
+
+func CreateGetEventMetricsFiltersTenantIDStr(str string) GetEventMetricsFiltersTenantID {
+ typ := GetEventMetricsFiltersTenantIDTypeStr
+
+ return GetEventMetricsFiltersTenantID{
+ Str: &str,
+ Type: typ,
+ }
+}
+
+func CreateGetEventMetricsFiltersTenantIDArrayOfStr(arrayOfStr []string) GetEventMetricsFiltersTenantID {
+ typ := GetEventMetricsFiltersTenantIDTypeArrayOfStr
+
+ return GetEventMetricsFiltersTenantID{
+ ArrayOfStr: arrayOfStr,
+ Type: typ,
+ }
+}
+
+func (u *GetEventMetricsFiltersTenantID) UnmarshalJSON(data []byte) error {
+
+ var str string = ""
+ if err := utils.UnmarshalJSON(data, &str, "", true, nil); err == nil {
+ u.Str = &str
+ u.Type = GetEventMetricsFiltersTenantIDTypeStr
+ return nil
+ }
+
+ var arrayOfStr []string = []string{}
+ if err := utils.UnmarshalJSON(data, &arrayOfStr, "", true, nil); err == nil {
+ u.ArrayOfStr = arrayOfStr
+ u.Type = GetEventMetricsFiltersTenantIDTypeArrayOfStr
+ return nil
+ }
+
+ return fmt.Errorf("could not unmarshal `%s` into any supported union types for GetEventMetricsFiltersTenantID", string(data))
+}
+
+func (u GetEventMetricsFiltersTenantID) MarshalJSON() ([]byte, error) {
+ if u.Str != nil {
+ return utils.MarshalJSON(u.Str, "", true)
+ }
+
+ if u.ArrayOfStr != nil {
+ return utils.MarshalJSON(u.ArrayOfStr, "", true)
+ }
+
+ return nil, errors.New("could not marshal union type GetEventMetricsFiltersTenantID: all fields are null")
+}
+
+type GetEventMetricsRequest struct {
+ // Start of the time range (inclusive). ISO 8601 timestamp.
+ TimeStart time.Time `queryParam:"style=form,explode=true,name=time[start]"`
+ // End of the time range (exclusive). ISO 8601 timestamp.
+ TimeEnd time.Time `queryParam:"style=form,explode=true,name=time[end]"`
+ // Time bucketing granularity. Pattern: ``.
+ // Units: `s` (1-60), `m` (1-60), `h` (1-24), `d` (1-31), `w` (1-4), `M` (1-12).
+ // When omitted, returns a single aggregate row per dimension combination.
+ //
+ Granularity *string `queryParam:"style=form,explode=true,name=granularity"`
+ // Measures to compute. At least one required. `rate` is events/second throughput. Use bracket notation for multiple values (e.g., `measures[0]=count`).
+ Measures GetEventMetricsMeasuresUnion `queryParam:"style=form,explode=true,name=measures"`
+ // Dimensions to group results by. Use bracket notation for multiple values (e.g., `dimensions[0]=topic&dimensions[1]=destination_id`).
+ Dimensions *GetEventMetricsDimensionsUnion `queryParam:"style=form,explode=true,name=dimensions"`
+ // Filter by topic name(s). Use bracket notation for multiple values (e.g., `filters[topic][0]=user.created&filters[topic][1]=user.updated`).
+ FiltersTopic *GetEventMetricsFiltersTopic `queryParam:"style=form,explode=true,name=filters[topic]"`
+ // Filter by destination ID(s). Use bracket notation for multiple values (e.g., `filters[destination_id][0]=d1&filters[destination_id][1]=d2`).
+ FiltersDestinationID *GetEventMetricsFiltersDestinationID `queryParam:"style=form,explode=true,name=filters[destination_id]"`
+ // Filter by tenant ID(s). Admin-only — rejected with 403 for JWT callers. Use bracket notation for multiple values (e.g., `filters[tenant_id][0]=t1&filters[tenant_id][1]=t2`).
+ FiltersTenantID *GetEventMetricsFiltersTenantID `queryParam:"style=form,explode=true,name=filters[tenant_id]"`
+}
+
+func (g GetEventMetricsRequest) MarshalJSON() ([]byte, error) {
+ return utils.MarshalJSON(g, "", false)
+}
+
+func (g *GetEventMetricsRequest) UnmarshalJSON(data []byte) error {
+ if err := utils.UnmarshalJSON(data, &g, "", false, nil); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (g *GetEventMetricsRequest) GetTimeStart() time.Time {
+ if g == nil {
+ return time.Time{}
+ }
+ return g.TimeStart
+}
+
+func (g *GetEventMetricsRequest) GetTimeEnd() time.Time {
+ if g == nil {
+ return time.Time{}
+ }
+ return g.TimeEnd
+}
+
+func (g *GetEventMetricsRequest) GetGranularity() *string {
+ if g == nil {
+ return nil
+ }
+ return g.Granularity
+}
+
+func (g *GetEventMetricsRequest) GetMeasures() GetEventMetricsMeasuresUnion {
+ if g == nil {
+ return GetEventMetricsMeasuresUnion{}
+ }
+ return g.Measures
+}
+
+func (g *GetEventMetricsRequest) GetDimensions() *GetEventMetricsDimensionsUnion {
+ if g == nil {
+ return nil
+ }
+ return g.Dimensions
+}
+
+func (g *GetEventMetricsRequest) GetFiltersTopic() *GetEventMetricsFiltersTopic {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersTopic
+}
+
+func (g *GetEventMetricsRequest) GetFiltersDestinationID() *GetEventMetricsFiltersDestinationID {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersDestinationID
+}
+
+func (g *GetEventMetricsRequest) GetFiltersTenantID() *GetEventMetricsFiltersTenantID {
+ if g == nil {
+ return nil
+ }
+ return g.FiltersTenantID
+}
+
+type GetEventMetricsResponse struct {
+ HTTPMeta components.HTTPMetadata `json:"-"`
+ // Aggregated event metrics.
+ MetricsResponse *components.MetricsResponse
+}
+
+func (g *GetEventMetricsResponse) GetHTTPMeta() components.HTTPMetadata {
+ if g == nil {
+ return components.HTTPMetadata{}
+ }
+ return g.HTTPMeta
+}
+
+func (g *GetEventMetricsResponse) GetMetricsResponse() *components.MetricsResponse {
+ if g == nil {
+ return nil
+ }
+ return g.MetricsResponse
+}
diff --git a/sdks/outpost-go/models/operations/gettenantdestinationattempt.go b/sdks/outpost-go/models/operations/gettenantdestinationattempt.go
index 5a8f9a6f8..1a2d2e171 100644
--- a/sdks/outpost-go/models/operations/gettenantdestinationattempt.go
+++ b/sdks/outpost-go/models/operations/gettenantdestinationattempt.go
@@ -17,6 +17,7 @@ type GetTenantDestinationAttemptRequest struct {
// - `event`: Include event summary
// - `event.data`: Include full event with payload data
// - `response_data`: Include response body and headers
+ // - `destination`: Include the full destination object
//
Include []string `queryParam:"style=form,explode=true,name=include"`
}
diff --git a/sdks/outpost-go/models/operations/listattempts.go b/sdks/outpost-go/models/operations/listattempts.go
index aa71fe196..9b77f5298 100644
--- a/sdks/outpost-go/models/operations/listattempts.go
+++ b/sdks/outpost-go/models/operations/listattempts.go
@@ -120,6 +120,7 @@ type ListAttemptsRequest struct {
// - `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
// - `event.data`: Include full event with payload data
// - `response_data`: Include response body and headers
+ // - `destination`: Include the full destination object
//
Include []string `queryParam:"style=form,explode=true,name=include"`
// Field to sort by.
diff --git a/sdks/outpost-go/models/operations/listtenantdestinationattempts.go b/sdks/outpost-go/models/operations/listtenantdestinationattempts.go
index 883ad4769..b0c530555 100644
--- a/sdks/outpost-go/models/operations/listtenantdestinationattempts.go
+++ b/sdks/outpost-go/models/operations/listtenantdestinationattempts.go
@@ -117,6 +117,7 @@ type ListTenantDestinationAttemptsRequest struct {
// - `event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
// - `event.data`: Include full event with payload data
// - `response_data`: Include response body and headers
+ // - `destination`: Include the full destination object
//
Include []string `queryParam:"style=form,explode=true,name=include"`
// Field to sort by.
diff --git a/sdks/outpost-go/outpost.go b/sdks/outpost-go/outpost.go
index ece5f32e5..ba6c4ec49 100644
--- a/sdks/outpost-go/outpost.go
+++ b/sdks/outpost-go/outpost.go
@@ -2,7 +2,7 @@
package outpostgo
-// Generated from OpenAPI doc version 0.0.1 and generator version 2.865.2
+// Generated from OpenAPI doc version 0.0.1 and generator version 2.869.10
import (
"context"
@@ -77,6 +77,7 @@ type Outpost struct {
// - `include=event`: Include event summary (id, topic, time, eligible_for_retry, metadata)
// - `include=event.data`: Include full event with payload data
// - `include=response_data`: Include response body and headers from the attempt
+ // - `include=destination`: Include the full destination object with target information
//
Attempts *Attempts
// Destinations are the endpoints where events are sent. Each destination is associated with a tenant and can be configured to receive specific event topics.
@@ -110,6 +111,9 @@ type Outpost struct {
Schemas *Schemas
// Operations for retrieving available event topics.
Topics *Topics
+ // Aggregated metrics for events and delivery attempts. Supports time bucketing, dimensional grouping, and filtering.
+ //
+ Metrics *Metrics
sdkConfiguration config.SDKConfiguration
hooks *hooks.Hooks
@@ -186,9 +190,9 @@ func WithTimeout(timeout time.Duration) SDKOption {
// New creates a new instance of the SDK with the provided options
func New(opts ...SDKOption) *Outpost {
sdk := &Outpost{
- SDKVersion: "0.8.1",
+ SDKVersion: "0.8.2",
sdkConfiguration: config.SDKConfiguration{
- UserAgent: "speakeasy-sdk/go 0.8.1 2.865.2 0.0.1 github.com/hookdeck/outpost/sdks/outpost-go",
+ UserAgent: "speakeasy-sdk/go 0.8.2 2.869.10 0.0.1 github.com/hookdeck/outpost/sdks/outpost-go",
ServerList: ServerList,
},
hooks: hooks.New(),
@@ -217,6 +221,7 @@ func New(opts ...SDKOption) *Outpost {
sdk.Publish = newPublish(sdk, sdk.sdkConfiguration, sdk.hooks)
sdk.Schemas = newSchemas(sdk, sdk.sdkConfiguration, sdk.hooks)
sdk.Topics = newTopics(sdk, sdk.sdkConfiguration, sdk.hooks)
+ sdk.Metrics = newMetrics(sdk, sdk.sdkConfiguration, sdk.hooks)
return sdk
}