hookbridge 2.1.0__tar.gz → 2.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: hookbridge
3
- Version: 2.1.0
3
+ Version: 2.1.1
4
4
  Summary: Official HookBridge SDK for Python
5
5
  Project-URL: Homepage, https://hookbridge.io
6
6
  Project-URL: Documentation, https://hookbridge.io/docs/sdks/python
@@ -98,7 +98,7 @@ from hookbridge.types import (
98
98
  UsageHistoryRow,
99
99
  )
100
100
 
101
- __version__ = "2.1.0"
101
+ __version__ = "2.1.1"
102
102
 
103
103
  __all__ = [
104
104
  "HookBridge",
@@ -423,19 +423,77 @@ class PullEndpoint:
423
423
  token_query_param: Optional[str] = None
424
424
  verify_hmac: Optional[bool] = None
425
425
  hmac_header_name: Optional[str] = None
426
- hmac_signature_encoding: Optional[HMACSignatureEncoding] = None
427
426
  timestamp_header_name: Optional[str] = None
428
427
  timestamp_ttl_seconds: Optional[int] = None
429
428
  verify_ip_allowlist: Optional[bool] = None
430
429
  allowed_cidrs: Optional[list[str]] = None
431
430
  ingest_response_code: Optional[int] = None
432
431
  idempotency_header_names: Optional[list[str]] = None
432
+ hmac_signature_encoding: Optional[HMACSignatureEncoding] = None
433
433
 
434
434
 
435
- @dataclass(frozen=True)
435
+ @dataclass(frozen=True, init=False)
436
436
  class CreatePullEndpointResponse(PullEndpoint):
437
437
  secret_token: Optional[str] = None
438
438
 
439
+ def __init__(
440
+ self,
441
+ id: str,
442
+ mode: PullEndpointMode,
443
+ ingest_url: str,
444
+ active: bool,
445
+ paused: bool,
446
+ created_at: datetime,
447
+ updated_at: datetime,
448
+ name: Optional[str] = None,
449
+ description: Optional[str] = None,
450
+ retention_days: Optional[int] = None,
451
+ event_type_source: Optional[PullEventTypeSource] = None,
452
+ event_type_path: Optional[str] = None,
453
+ counts: Optional[PullEndpointCounts] = None,
454
+ verify_static_token: Optional[bool] = None,
455
+ token_header_name: Optional[str] = None,
456
+ token_query_param: Optional[str] = None,
457
+ verify_hmac: Optional[bool] = None,
458
+ hmac_header_name: Optional[str] = None,
459
+ timestamp_header_name: Optional[str] = None,
460
+ timestamp_ttl_seconds: Optional[int] = None,
461
+ verify_ip_allowlist: Optional[bool] = None,
462
+ allowed_cidrs: Optional[list[str]] = None,
463
+ ingest_response_code: Optional[int] = None,
464
+ idempotency_header_names: Optional[list[str]] = None,
465
+ secret_token: Optional[str] = None,
466
+ hmac_signature_encoding: Optional[HMACSignatureEncoding] = None,
467
+ ) -> None:
468
+ super().__init__(
469
+ id=id,
470
+ mode=mode,
471
+ ingest_url=ingest_url,
472
+ active=active,
473
+ paused=paused,
474
+ created_at=created_at,
475
+ updated_at=updated_at,
476
+ name=name,
477
+ description=description,
478
+ retention_days=retention_days,
479
+ event_type_source=event_type_source,
480
+ event_type_path=event_type_path,
481
+ counts=counts,
482
+ verify_static_token=verify_static_token,
483
+ token_header_name=token_header_name,
484
+ token_query_param=token_query_param,
485
+ verify_hmac=verify_hmac,
486
+ hmac_header_name=hmac_header_name,
487
+ timestamp_header_name=timestamp_header_name,
488
+ timestamp_ttl_seconds=timestamp_ttl_seconds,
489
+ verify_ip_allowlist=verify_ip_allowlist,
490
+ allowed_cidrs=allowed_cidrs,
491
+ ingest_response_code=ingest_response_code,
492
+ idempotency_header_names=idempotency_header_names,
493
+ hmac_signature_encoding=hmac_signature_encoding,
494
+ )
495
+ object.__setattr__(self, "secret_token", secret_token)
496
+
439
497
 
440
498
  @dataclass(frozen=True)
441
499
  class PullEndpointSummary:
@@ -650,14 +708,14 @@ class ExportRecord:
650
708
  created_at: datetime
651
709
  filter_status: Optional[str] = None
652
710
  filter_endpoint_id: Optional[str] = None
653
- filter_inbound_endpoint_id: Optional[str] = None
654
- direction: Optional[ExportDirection] = None
655
711
  row_count: Optional[int] = None
656
712
  file_size_bytes: Optional[int] = None
657
713
  error_message: Optional[str] = None
658
714
  started_at: Optional[datetime] = None
659
715
  completed_at: Optional[datetime] = None
660
716
  expires_at: Optional[datetime] = None
717
+ filter_inbound_endpoint_id: Optional[str] = None
718
+ direction: Optional[ExportDirection] = None
661
719
 
662
720
 
663
721
  @dataclass(frozen=True)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "hookbridge"
7
- version = "2.1.0"
7
+ version = "2.1.1"
8
8
  description = "Official HookBridge SDK for Python"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -0,0 +1,614 @@
1
+ import dataclasses
2
+ import inspect
3
+ from datetime import datetime, timedelta, timezone
4
+
5
+ import hookbridge.types as types_module
6
+ from hookbridge.types import CreatePullEndpointResponse, ExportRecord, PullEndpoint
7
+
8
+ NOW = datetime(2026, 1, 1, tzinfo=timezone.utc)
9
+
10
+
11
+ def at(day: int) -> datetime:
12
+ return NOW + timedelta(days=day)
13
+
14
+
15
+ def test_export_record_positional_2_0_0_order() -> None:
16
+ record = ExportRecord(
17
+ "id1",
18
+ "proj1",
19
+ "completed",
20
+ at(1),
21
+ at(2),
22
+ at(3),
23
+ "failed",
24
+ "ep1",
25
+ 42,
26
+ 1024,
27
+ "boom",
28
+ at(4),
29
+ at(5),
30
+ at(6),
31
+ )
32
+ assert record.id == "id1"
33
+ assert record.project_id == "proj1"
34
+ assert record.status == "completed"
35
+ assert record.filter_status == "failed"
36
+ assert record.filter_endpoint_id == "ep1"
37
+ assert record.row_count == 42
38
+ assert record.file_size_bytes == 1024
39
+ assert record.error_message == "boom"
40
+ assert record.filter_start_time == at(1)
41
+ assert record.filter_end_time == at(2)
42
+ assert record.created_at == at(3)
43
+ assert record.started_at == at(4)
44
+ assert record.completed_at == at(5)
45
+ assert record.expires_at == at(6)
46
+ assert record.filter_inbound_endpoint_id is None
47
+ assert record.direction is None
48
+
49
+
50
+ def test_pull_endpoint_positional_2_0_0_order() -> None:
51
+ counts = None
52
+ endpoint = PullEndpoint(
53
+ "id1",
54
+ "pull",
55
+ "https://ingest.example.com/x",
56
+ True,
57
+ False,
58
+ at(1),
59
+ at(2),
60
+ "name",
61
+ "desc",
62
+ 7,
63
+ "header",
64
+ "$.type",
65
+ counts,
66
+ True,
67
+ "X-Token",
68
+ "token",
69
+ True,
70
+ "X-Sig",
71
+ "X-Ts",
72
+ 300,
73
+ True,
74
+ ["10.0.0.0/8"],
75
+ 202,
76
+ ["X-Idem"],
77
+ )
78
+ assert endpoint.created_at == at(1)
79
+ assert endpoint.updated_at == at(2)
80
+ assert endpoint.hmac_header_name == "X-Sig"
81
+ assert endpoint.timestamp_header_name == "X-Ts"
82
+ assert endpoint.timestamp_ttl_seconds == 300
83
+ assert endpoint.verify_ip_allowlist is True
84
+ assert endpoint.allowed_cidrs == ["10.0.0.0/8"]
85
+ assert endpoint.ingest_response_code == 202
86
+ assert endpoint.idempotency_header_names == ["X-Idem"]
87
+ assert endpoint.hmac_signature_encoding is None
88
+
89
+
90
+ def test_create_pull_endpoint_response_positional_2_0_0_order() -> None:
91
+ resp = CreatePullEndpointResponse(
92
+ "id1",
93
+ "pull",
94
+ "https://ingest.example.com/x",
95
+ True,
96
+ False,
97
+ at(1),
98
+ at(2),
99
+ "name",
100
+ "desc",
101
+ 7,
102
+ "header",
103
+ "$.type",
104
+ None,
105
+ True,
106
+ "X-Token",
107
+ "token",
108
+ True,
109
+ "X-Sig",
110
+ "X-Ts",
111
+ 300,
112
+ True,
113
+ ["10.0.0.0/8"],
114
+ 202,
115
+ ["X-Idem"],
116
+ "sekret",
117
+ )
118
+ assert isinstance(resp, PullEndpoint)
119
+ assert resp.created_at == at(1)
120
+ assert resp.updated_at == at(2)
121
+ assert resp.idempotency_header_names == ["X-Idem"]
122
+ assert resp.secret_token == "sekret"
123
+ assert resp.hmac_signature_encoding is None
124
+
125
+
126
+ def test_create_pull_endpoint_response_keywords() -> None:
127
+ resp = CreatePullEndpointResponse(
128
+ id="id1",
129
+ mode="pull",
130
+ ingest_url="u",
131
+ active=True,
132
+ paused=False,
133
+ created_at=NOW,
134
+ updated_at=NOW,
135
+ hmac_signature_encoding="base64",
136
+ secret_token="s",
137
+ )
138
+ assert resp.hmac_signature_encoding == "base64"
139
+ assert resp.secret_token == "s"
140
+ assert resp.name is None
141
+ assert resp == CreatePullEndpointResponse(
142
+ id="id1",
143
+ mode="pull",
144
+ ingest_url="u",
145
+ active=True,
146
+ paused=False,
147
+ created_at=NOW,
148
+ updated_at=NOW,
149
+ hmac_signature_encoding="base64",
150
+ secret_token="s",
151
+ )
152
+
153
+
154
+ def test_create_pull_endpoint_response_init_covers_every_field() -> None:
155
+ params = set(inspect.signature(CreatePullEndpointResponse.__init__).parameters) - {"self"}
156
+ assert params == {f.name for f in dataclasses.fields(CreatePullEndpointResponse)}
157
+
158
+
159
+ def test_init_parameter_order_is_pinned() -> None:
160
+ actual = {
161
+ name: [p for p in inspect.signature(cls.__init__).parameters if p != "self"]
162
+ for name, cls in inspect.getmembers(types_module, inspect.isclass)
163
+ if dataclasses.is_dataclass(cls) and cls.__module__ == types_module.__name__
164
+ }
165
+ assert set(INIT_ORDER) <= set(actual)
166
+ for name, expected in INIT_ORDER.items():
167
+ assert actual[name][: len(expected)] == expected, name
168
+
169
+
170
+ INIT_ORDER: dict[str, list[str]] = {
171
+ "APIKeyInfo": ["key_id", "label", "prefix", "created_at", "last_used_at"],
172
+ "AckPullEventsResponse": ["acknowledged"],
173
+ "ActorLookupResult": ["users", "api_keys"],
174
+ "AttemptRecord": [
175
+ "id",
176
+ "attempt_no",
177
+ "created_at",
178
+ "response_status",
179
+ "response_latency_ms",
180
+ "processing_ms",
181
+ "error_text",
182
+ "response_headers",
183
+ "retry_type",
184
+ "retry_after_seconds",
185
+ "resolved_ip",
186
+ "request_headers",
187
+ "dns_ms",
188
+ "tcp_connect_ms",
189
+ "tls_handshake_ms",
190
+ "ttfb_ms",
191
+ "transfer_ms",
192
+ "conn_reused",
193
+ "response_body_url",
194
+ "response_body_truncated",
195
+ ],
196
+ "AttemptsResponse": ["attempts", "has_more"],
197
+ "CreateAPIKeyResponse": ["key_id", "key", "prefix", "label", "created_at"],
198
+ "CreateEndpointResponse": [
199
+ "id",
200
+ "url",
201
+ "signing_secret",
202
+ "created_at",
203
+ "description",
204
+ "signing_key_id",
205
+ "key_hint",
206
+ "ephemeral",
207
+ "expires_at",
208
+ ],
209
+ "CreateInboundEndpointResponse": [
210
+ "id",
211
+ "name",
212
+ "url",
213
+ "mode",
214
+ "ingest_url",
215
+ "secret_token",
216
+ "created_at",
217
+ "signing_key_id",
218
+ "signing_secret",
219
+ "key_hint",
220
+ "hmac_signature_encoding",
221
+ "ephemeral",
222
+ "expires_at",
223
+ ],
224
+ "CreatePullEndpointResponse": [
225
+ "id",
226
+ "mode",
227
+ "ingest_url",
228
+ "active",
229
+ "paused",
230
+ "created_at",
231
+ "updated_at",
232
+ "name",
233
+ "description",
234
+ "retention_days",
235
+ "event_type_source",
236
+ "event_type_path",
237
+ "counts",
238
+ "verify_static_token",
239
+ "token_header_name",
240
+ "token_query_param",
241
+ "verify_hmac",
242
+ "hmac_header_name",
243
+ "timestamp_header_name",
244
+ "timestamp_ttl_seconds",
245
+ "verify_ip_allowlist",
246
+ "allowed_cidrs",
247
+ "ingest_response_code",
248
+ "idempotency_header_names",
249
+ "secret_token",
250
+ "hmac_signature_encoding",
251
+ ],
252
+ "DLQMessagesResponse": ["messages", "has_more", "next_cursor"],
253
+ "DeleteAllResult": ["deleted", "deleted_message_ids", "error"],
254
+ "DeleteBatchItemResult": ["message_id", "outcome", "deleted_at"],
255
+ "DeleteBatchResult": ["results", "deleted_count", "already_deleted_count", "not_found_count"],
256
+ "DeleteEventBatchItemResult": ["event_id", "outcome", "deleted_at"],
257
+ "DeleteEventBatchResult": [
258
+ "results",
259
+ "deleted_count",
260
+ "already_deleted_count",
261
+ "not_found_count",
262
+ ],
263
+ "DeleteEventResult": ["event_id", "deleted_at", "already_deleted"],
264
+ "DeleteMessageResult": ["message_id", "deleted_at", "already_deleted"],
265
+ "DeletePartialError": ["code", "message"],
266
+ "DeletePullEventsAllResult": ["deleted", "deleted_event_ids", "error"],
267
+ "DeleteResult": ["deleted", "id"],
268
+ "Endpoint": [
269
+ "id",
270
+ "url",
271
+ "created_at",
272
+ "updated_at",
273
+ "paused",
274
+ "description",
275
+ "rate_limit_rps",
276
+ "burst",
277
+ "headers",
278
+ "ephemeral",
279
+ "expires_at",
280
+ ],
281
+ "EndpointSummary": [
282
+ "id",
283
+ "url",
284
+ "created_at",
285
+ "paused",
286
+ "description",
287
+ "ephemeral",
288
+ "expires_at",
289
+ ],
290
+ "ExportRecord": [
291
+ "id",
292
+ "project_id",
293
+ "status",
294
+ "filter_start_time",
295
+ "filter_end_time",
296
+ "created_at",
297
+ "filter_status",
298
+ "filter_endpoint_id",
299
+ "row_count",
300
+ "file_size_bytes",
301
+ "error_message",
302
+ "started_at",
303
+ "completed_at",
304
+ "expires_at",
305
+ "filter_inbound_endpoint_id",
306
+ "direction",
307
+ ],
308
+ "InboundEndpoint": [
309
+ "id",
310
+ "name",
311
+ "url",
312
+ "mode",
313
+ "active",
314
+ "paused",
315
+ "verify_static_token",
316
+ "verify_hmac",
317
+ "verify_ip_allowlist",
318
+ "ingest_response_code",
319
+ "idempotency_header_names",
320
+ "signing_enabled",
321
+ "created_at",
322
+ "updated_at",
323
+ "description",
324
+ "hmac_signature_encoding",
325
+ "ingest_url",
326
+ "ephemeral",
327
+ "expires_at",
328
+ ],
329
+ "InboundEndpointSummary": [
330
+ "id",
331
+ "name",
332
+ "url",
333
+ "mode",
334
+ "active",
335
+ "paused",
336
+ "created_at",
337
+ "ephemeral",
338
+ "expires_at",
339
+ ],
340
+ "InboundLogEntry": [
341
+ "message_id",
342
+ "inbound_endpoint_id",
343
+ "endpoint",
344
+ "status",
345
+ "attempt_count",
346
+ "received_at",
347
+ "delivered_at",
348
+ "response_status",
349
+ "response_latency_ms",
350
+ "last_error",
351
+ "total_delivery_ms",
352
+ "deleted_at",
353
+ ],
354
+ "InboundLogsResponse": ["entries", "has_more", "next_cursor"],
355
+ "InboundMessage": [
356
+ "id",
357
+ "project_id",
358
+ "inbound_endpoint_id",
359
+ "status",
360
+ "attempt_count",
361
+ "replay_count",
362
+ "received_at",
363
+ "updated_at",
364
+ "content_type",
365
+ "size_bytes",
366
+ "payload_sha256",
367
+ "idempotency_key",
368
+ "next_attempt_at",
369
+ "last_error",
370
+ "response_status",
371
+ "response_latency_ms",
372
+ "queue_wait_ms",
373
+ "total_delivery_ms",
374
+ "delivered_at",
375
+ "failed_at",
376
+ "deleted_at",
377
+ "deleted_by_user_id",
378
+ "deleted_by_api_key_id",
379
+ "retention_hours",
380
+ ],
381
+ "InboundMetrics": [
382
+ "window",
383
+ "total_messages",
384
+ "succeeded",
385
+ "failed",
386
+ "retries",
387
+ "success_rate",
388
+ "avg_latency_ms",
389
+ "avg_delivery_time_ms",
390
+ ],
391
+ "InboundRejection": [
392
+ "id",
393
+ "reason_code",
394
+ "received_at",
395
+ "inbound_endpoint_id",
396
+ "reason_detail",
397
+ "source_ip",
398
+ "headers_redacted",
399
+ ],
400
+ "InboundRejectionsResponse": ["entries", "has_more", "next_cursor"],
401
+ "Invoice": [
402
+ "id",
403
+ "status",
404
+ "amount_due",
405
+ "amount_paid",
406
+ "currency",
407
+ "period_start",
408
+ "period_end",
409
+ "created",
410
+ "lines",
411
+ "invoice_pdf",
412
+ "hosted_invoice_url",
413
+ ],
414
+ "InvoiceLine": ["description", "amount", "quantity"],
415
+ "InvoicesResponse": ["invoices", "has_more"],
416
+ "ListEndpointsResponse": ["endpoints", "has_more", "next_cursor"],
417
+ "ListInboundEndpointsResponse": ["endpoints", "has_more", "next_cursor"],
418
+ "ListPullEndpointsResponse": ["endpoints", "has_more", "next_cursor"],
419
+ "ListPullEventsResponse": ["events", "has_more", "next_cursor"],
420
+ "ListenInboundEndpointResponse": ["messages", "next_cursor"],
421
+ "ListenMessage": [
422
+ "message_id",
423
+ "content_type",
424
+ "headers",
425
+ "size_bytes",
426
+ "received_at",
427
+ "body",
428
+ "body_encoding",
429
+ "body_error",
430
+ ],
431
+ "LogsResponse": ["messages", "has_more", "next_cursor"],
432
+ "Message": [
433
+ "id",
434
+ "project_id",
435
+ "endpoint_id",
436
+ "status",
437
+ "attempt_count",
438
+ "replay_count",
439
+ "content_type",
440
+ "size_bytes",
441
+ "payload_sha256",
442
+ "created_at",
443
+ "updated_at",
444
+ "idempotency_key",
445
+ "next_attempt_at",
446
+ "last_error",
447
+ "response_status",
448
+ "response_latency_ms",
449
+ "deleted_at",
450
+ "deleted_by_user_id",
451
+ "deleted_by_api_key_id",
452
+ "first_attempt_at",
453
+ "delivered_at",
454
+ "processing_ms",
455
+ "total_delivery_ms",
456
+ "queue_wait_ms",
457
+ "retention_hours",
458
+ ],
459
+ "MessageSummary": [
460
+ "message_id",
461
+ "endpoint",
462
+ "status",
463
+ "attempt_count",
464
+ "created_at",
465
+ "delivered_at",
466
+ "next_attempt_at",
467
+ "response_status",
468
+ "response_latency_ms",
469
+ "last_error",
470
+ "deleted_at",
471
+ "first_attempt_at",
472
+ "processing_ms",
473
+ "total_delivery_ms",
474
+ "queue_wait_ms",
475
+ ],
476
+ "Metrics": [
477
+ "window",
478
+ "total_messages",
479
+ "succeeded",
480
+ "failed",
481
+ "retries",
482
+ "success_rate",
483
+ "avg_latency_ms",
484
+ "avg_delivery_time_ms",
485
+ "avg_queue_wait_ms",
486
+ ],
487
+ "PauseState": ["id", "paused", "messages_requeued"],
488
+ "PullEndpoint": [
489
+ "id",
490
+ "mode",
491
+ "ingest_url",
492
+ "active",
493
+ "paused",
494
+ "created_at",
495
+ "updated_at",
496
+ "name",
497
+ "description",
498
+ "retention_days",
499
+ "event_type_source",
500
+ "event_type_path",
501
+ "counts",
502
+ "verify_static_token",
503
+ "token_header_name",
504
+ "token_query_param",
505
+ "verify_hmac",
506
+ "hmac_header_name",
507
+ "timestamp_header_name",
508
+ "timestamp_ttl_seconds",
509
+ "verify_ip_allowlist",
510
+ "allowed_cidrs",
511
+ "ingest_response_code",
512
+ "idempotency_header_names",
513
+ "hmac_signature_encoding",
514
+ ],
515
+ "PullEndpointCounts": ["stored", "fetched", "delivered", "total"],
516
+ "PullEndpointSummary": ["id", "active", "paused", "ingest_url", "created_at", "name"],
517
+ "PullEvent": [
518
+ "id",
519
+ "status",
520
+ "content_type",
521
+ "payload",
522
+ "size_bytes",
523
+ "received_at",
524
+ "event_type",
525
+ "headers",
526
+ "fetched_at",
527
+ "delivered_at",
528
+ "timing",
529
+ "deleted_at",
530
+ "deleted_by_user_id",
531
+ "deleted_by_api_key_id",
532
+ ],
533
+ "PullEventSummary": [
534
+ "id",
535
+ "status",
536
+ "size_bytes",
537
+ "received_at",
538
+ "event_type",
539
+ "fetched_at",
540
+ "delivered_at",
541
+ "timing",
542
+ "deleted_at",
543
+ ],
544
+ "PullLogEntry": [
545
+ "event_id",
546
+ "pull_endpoint_id",
547
+ "status",
548
+ "size_bytes",
549
+ "received_at",
550
+ "endpoint_name",
551
+ "event_type",
552
+ "fetched_at",
553
+ "delivered_at",
554
+ "timing",
555
+ ],
556
+ "PullLogsResponse": ["entries", "has_more", "next_cursor"],
557
+ "PullTimeSeriesBucket": ["timestamp", "succeeded", "stored", "fetched", "total"],
558
+ "PullTimeSeriesMetrics": ["window", "buckets"],
559
+ "PullTimingBreakdown": [
560
+ "ingest_processing_ms",
561
+ "time_to_fetch_ms",
562
+ "time_to_ack_ms",
563
+ "total_lifecycle_ms",
564
+ ],
565
+ "ReplayAllMessagesResponse": [
566
+ "replayed",
567
+ "failed",
568
+ "stuck",
569
+ "replayed_message_ids",
570
+ "stuck_message_ids",
571
+ ],
572
+ "ReplayBatchMessagesResponse": ["replayed", "failed", "stuck", "results"],
573
+ "ReplayBatchResult": ["message_id", "status", "error", "error_code"],
574
+ "ReplayMessageResponse": ["message_id", "status"],
575
+ "RotateSecretResponse": ["id", "signing_secret", "key_hint", "created_at"],
576
+ "SendWebhookResponse": ["message_id", "status"],
577
+ "SigningKey": ["id", "key_hint", "created_at"],
578
+ "Subscription": [
579
+ "plan",
580
+ "status",
581
+ "limits",
582
+ "usage",
583
+ "cancel_at_period_end",
584
+ "current_period_end",
585
+ ],
586
+ "SubscriptionLimits": [
587
+ "plan",
588
+ "messages_per_month",
589
+ "max_projects",
590
+ "max_endpoints",
591
+ "retention_days",
592
+ "max_retries",
593
+ "overage_rate_per_message",
594
+ ],
595
+ "SubscriptionUsage": [
596
+ "messages_used",
597
+ "period_start",
598
+ "period_end",
599
+ "overage_count",
600
+ "overage_rate",
601
+ "estimated_overage_charge",
602
+ ],
603
+ "TimeSeriesBucket": ["timestamp", "total", "succeeded", "failed", "retrying", "avg_latency_ms"],
604
+ "TimeSeriesMetrics": ["window", "buckets"],
605
+ "UpdateResult": ["id", "updated"],
606
+ "UsageHistoryResponse": ["rows", "total", "limit", "offset", "has_more"],
607
+ "UsageHistoryRow": [
608
+ "period_start",
609
+ "period_end",
610
+ "message_count",
611
+ "overage_count",
612
+ "plan_limit",
613
+ ],
614
+ }
File without changes
File without changes
File without changes
File without changes
File without changes