sendora 2.0.0__tar.gz → 2.0.2__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.
Files changed (38) hide show
  1. {sendora-2.0.0 → sendora-2.0.2}/CHANGELOG.md +13 -0
  2. {sendora-2.0.0 → sendora-2.0.2}/PKG-INFO +54 -54
  3. {sendora-2.0.0 → sendora-2.0.2}/README.md +53 -53
  4. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_version.py +1 -1
  5. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/types.py +10 -5
  6. {sendora-2.0.0 → sendora-2.0.2}/.gitignore +0 -0
  7. {sendora-2.0.0 → sendora-2.0.2}/LICENSE +0 -0
  8. {sendora-2.0.0 → sendora-2.0.2}/pyproject.toml +0 -0
  9. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/__init__.py +0 -0
  10. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_account.py +0 -0
  11. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_answers.py +0 -0
  12. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_client.py +0 -0
  13. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_errors.py +0 -0
  14. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_json.py +0 -0
  15. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_keys.py +0 -0
  16. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_model.py +0 -0
  17. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_options.py +0 -0
  18. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_pages.py +0 -0
  19. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_retry.py +0 -0
  20. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_transport.py +0 -0
  21. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_webhooks.py +0 -0
  22. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/_wire.py +0 -0
  23. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/py.typed +0 -0
  24. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/__init__.py +0 -0
  25. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/broadcasts.py +0 -0
  26. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/domains.py +0 -0
  27. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/email.py +0 -0
  28. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/erasures.py +0 -0
  29. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/inbound.py +0 -0
  30. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/inbound_domains.py +0 -0
  31. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/messages.py +0 -0
  32. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/server.py +0 -0
  33. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/servers.py +0 -0
  34. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/streams.py +0 -0
  35. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/suppressions.py +0 -0
  36. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/tokens.py +0 -0
  37. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/resources/webhooks.py +0 -0
  38. {sendora-2.0.0 → sendora-2.0.2}/src/sendora/skills/sendora/SKILL.md +0 -0
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.0.2
4
+
5
+ - The README says what `payment_required` means in each of its four cases:
6
+ the first payment has not arrived, an invoice is unpaid, payment is
7
+ paused, or the subscription has ended. No call changes.
8
+
9
+ ## 2.0.1
10
+
11
+ - The docstrings of `ServerLimit.period`, `InboundCap.limit` and a refused
12
+ batch item's `resets_at` say what an account's month is. An account that
13
+ pays by card counts a month from the day and time of its first payment,
14
+ and any other account the calendar month in UTC. No call changes.
15
+
3
16
  ## 2.0.0
4
17
 
5
18
  - The error code `unpaid_limit_reached` is removed, since the API no
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: sendora
3
- Version: 2.0.0
3
+ Version: 2.0.2
4
4
  Summary: The Python client for Sendora's email API.
5
5
  Project-URL: Homepage, https://sendora.se/docs
6
6
  License-Expression: MIT
@@ -494,59 +494,59 @@ except SendoraError as error:
494
494
  print([(entry.address, entry.reason) for entry in error.suppressed])
495
495
  ```
496
496
 
497
- | Code | Status | Meaning |
498
- | --------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- |
499
- | `invalid_request` | 400 | A field is wrong; `issues` says which. |
500
- | `idempotency_key_required` | 400 | A batch was sent without a key. |
501
- | `unauthorized` | 401 | The key is missing, malformed or revoked. |
502
- | `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind. |
503
- | `payment_required` | 402 | The account's first payment has not arrived, or an unpaid charge has stopped live sending. |
504
- | `account_paused` | 403 | Sendora has paused the account. |
505
- | `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream. |
506
- | `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression. |
507
- | `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe. |
508
- | `not_found` | 404 | No such id on this server, or no such suppressed address. |
509
- | `domain_exists` | 409 | The account already has the domain; `existing_id` names it. |
510
- | `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it. |
511
- | `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified. |
512
- | `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it. |
513
- | `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it. |
514
- | `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it. |
515
- | `default_stream` | 409 | The default stream cannot be archived. |
516
- | `last_token` | 409 | The only live key cannot be revoked. |
517
- | `last_secret` | 409 | The only live secret of a webhook cannot be deleted. |
518
- | `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many. |
519
- | `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many. |
520
- | `server_exists` | 409 | The account already has a server with that name. |
521
- | `server_limit` | 409 | The account has as many servers as it may; `max` says how many. |
522
- | `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed. |
523
- | `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later. |
524
- | `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast. |
525
- | `from_domain_not_verified` | 422 | The From domain is not a verified sending domain. |
526
- | `stream_not_found` | 422 | `stream_id` names no stream of this server. |
527
- | `stream_archived` | 422 | The stream is archived and takes no new messages. |
528
- | `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it. |
529
- | `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list. |
530
- | `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional. |
531
- | `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which. |
532
- | `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel. |
533
- | `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part. |
534
- | `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out. |
535
- | `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them. |
536
- | `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them. |
537
- | `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server. |
538
- | `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode. |
539
- | `idempotency_key_mismatch` | 422 | The key was used before with a different body. |
540
- | `content_expired` | 410 | The received message's content window has passed; the message itself stays. |
541
- | `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told. |
542
- | `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once. |
543
- | `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`. |
544
- | `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`. |
545
- | `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why. |
546
- | `timeout` | none | A step of the request took longer than `timeout`. |
547
- | `unexpected_response` | any | An answer without a JSON error body, such as from a proxy. |
548
- | `invalid_signature` | none | A webhook's signature is missing, malformed or wrong. |
549
- | `stale_signature` | none | A webhook's signature is older than the tolerance. |
497
+ | Code | Status | Meaning |
498
+ | --------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------- |
499
+ | `invalid_request` | 400 | A field is wrong; `issues` says which. |
500
+ | `idempotency_key_required` | 400 | A batch was sent without a key. |
501
+ | `unauthorized` | 401 | The key is missing, malformed or revoked. |
502
+ | `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind. |
503
+ | `payment_required` | 402 | The first payment has not arrived, an invoice is unpaid, payment is paused, or the subscription has ended. |
504
+ | `account_paused` | 403 | Sendora has paused the account. |
505
+ | `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream. |
506
+ | `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression. |
507
+ | `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe. |
508
+ | `not_found` | 404 | No such id on this server, or no such suppressed address. |
509
+ | `domain_exists` | 409 | The account already has the domain; `existing_id` names it. |
510
+ | `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it. |
511
+ | `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified. |
512
+ | `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it. |
513
+ | `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it. |
514
+ | `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it. |
515
+ | `default_stream` | 409 | The default stream cannot be archived. |
516
+ | `last_token` | 409 | The only live key cannot be revoked. |
517
+ | `last_secret` | 409 | The only live secret of a webhook cannot be deleted. |
518
+ | `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many. |
519
+ | `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many. |
520
+ | `server_exists` | 409 | The account already has a server with that name. |
521
+ | `server_limit` | 409 | The account has as many servers as it may; `max` says how many. |
522
+ | `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed. |
523
+ | `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later. |
524
+ | `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast. |
525
+ | `from_domain_not_verified` | 422 | The From domain is not a verified sending domain. |
526
+ | `stream_not_found` | 422 | `stream_id` names no stream of this server. |
527
+ | `stream_archived` | 422 | The stream is archived and takes no new messages. |
528
+ | `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it. |
529
+ | `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list. |
530
+ | `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional. |
531
+ | `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which. |
532
+ | `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel. |
533
+ | `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part. |
534
+ | `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out. |
535
+ | `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them. |
536
+ | `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them. |
537
+ | `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server. |
538
+ | `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode. |
539
+ | `idempotency_key_mismatch` | 422 | The key was used before with a different body. |
540
+ | `content_expired` | 410 | The received message's content window has passed; the message itself stays. |
541
+ | `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told. |
542
+ | `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once. |
543
+ | `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`. |
544
+ | `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`. |
545
+ | `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why. |
546
+ | `timeout` | none | A step of the request took longer than `timeout`. |
547
+ | `unexpected_response` | any | An answer without a JSON error body, such as from a proxy. |
548
+ | `invalid_signature` | none | A webhook's signature is missing, malformed or wrong. |
549
+ | `stale_signature` | none | A webhook's signature is older than the tolerance. |
550
550
 
551
551
  `error.retryable` is true when waiting and calling again could succeed.
552
552
  Neither the key nor a request's subject, text, HTML or attachments is ever
@@ -472,59 +472,59 @@ except SendoraError as error:
472
472
  print([(entry.address, entry.reason) for entry in error.suppressed])
473
473
  ```
474
474
 
475
- | Code | Status | Meaning |
476
- | --------------------------------- | ------ | ----------------------------------------------------------------------------------------------------- |
477
- | `invalid_request` | 400 | A field is wrong; `issues` says which. |
478
- | `idempotency_key_required` | 400 | A batch was sent without a key. |
479
- | `unauthorized` | 401 | The key is missing, malformed or revoked. |
480
- | `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind. |
481
- | `payment_required` | 402 | The account's first payment has not arrived, or an unpaid charge has stopped live sending. |
482
- | `account_paused` | 403 | Sendora has paused the account. |
483
- | `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream. |
484
- | `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression. |
485
- | `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe. |
486
- | `not_found` | 404 | No such id on this server, or no such suppressed address. |
487
- | `domain_exists` | 409 | The account already has the domain; `existing_id` names it. |
488
- | `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it. |
489
- | `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified. |
490
- | `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it. |
491
- | `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it. |
492
- | `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it. |
493
- | `default_stream` | 409 | The default stream cannot be archived. |
494
- | `last_token` | 409 | The only live key cannot be revoked. |
495
- | `last_secret` | 409 | The only live secret of a webhook cannot be deleted. |
496
- | `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many. |
497
- | `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many. |
498
- | `server_exists` | 409 | The account already has a server with that name. |
499
- | `server_limit` | 409 | The account has as many servers as it may; `max` says how many. |
500
- | `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed. |
501
- | `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later. |
502
- | `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast. |
503
- | `from_domain_not_verified` | 422 | The From domain is not a verified sending domain. |
504
- | `stream_not_found` | 422 | `stream_id` names no stream of this server. |
505
- | `stream_archived` | 422 | The stream is archived and takes no new messages. |
506
- | `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it. |
507
- | `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list. |
508
- | `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional. |
509
- | `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which. |
510
- | `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel. |
511
- | `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part. |
512
- | `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out. |
513
- | `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them. |
514
- | `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them. |
515
- | `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server. |
516
- | `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode. |
517
- | `idempotency_key_mismatch` | 422 | The key was used before with a different body. |
518
- | `content_expired` | 410 | The received message's content window has passed; the message itself stays. |
519
- | `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told. |
520
- | `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once. |
521
- | `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`. |
522
- | `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`. |
523
- | `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why. |
524
- | `timeout` | none | A step of the request took longer than `timeout`. |
525
- | `unexpected_response` | any | An answer without a JSON error body, such as from a proxy. |
526
- | `invalid_signature` | none | A webhook's signature is missing, malformed or wrong. |
527
- | `stale_signature` | none | A webhook's signature is older than the tolerance. |
475
+ | Code | Status | Meaning |
476
+ | --------------------------------- | ------ | ---------------------------------------------------------------------------------------------------------- |
477
+ | `invalid_request` | 400 | A field is wrong; `issues` says which. |
478
+ | `idempotency_key_required` | 400 | A batch was sent without a key. |
479
+ | `unauthorized` | 401 | The key is missing, malformed or revoked. |
480
+ | `wrong_token_kind` | 403 | A server key where an account key is needed, or the reverse; `message` names the kind. |
481
+ | `payment_required` | 402 | The first payment has not arrived, an invoice is unpaid, payment is paused, or the subscription has ended. |
482
+ | `account_paused` | 403 | Sendora has paused the account. |
483
+ | `account_not_active` | 403 | The account is not approved to send, or not active for an inbound stream. |
484
+ | `spam_complaint_locked` | 403 | Only support can lift a spam-complaint suppression. |
485
+ | `unsubscribe_locked` | 403 | Only support can lift a recipient's own unsubscribe. |
486
+ | `not_found` | 404 | No such id on this server, or no such suppressed address. |
487
+ | `domain_exists` | 409 | The account already has the domain; `existing_id` names it. |
488
+ | `domain_reserved` | 400 | The name is Sendora's own; no account can receive on it. |
489
+ | `inbound_domain_exists` | 409 | The stream already has a domain (`existing_id` names it), or another account holds the name verified. |
490
+ | `webhook_exists` | 409 | The server already has a webhook for that URL; `existing_id` names it. |
491
+ | `stream_exists` | 409 | The server already has a stream with that name; `existing_id` names it. |
492
+ | `inbound_stream_exists` | 409 | The server already has a live inbound stream; `existing_id` names it. |
493
+ | `default_stream` | 409 | The default stream cannot be archived. |
494
+ | `last_token` | 409 | The only live key cannot be revoked. |
495
+ | `last_secret` | 409 | The only live secret of a webhook cannot be deleted. |
496
+ | `secret_limit` | 409 | The webhook already holds two live secrets; `max` says how many. |
497
+ | `token_limit` | 409 | The server or the account already holds two live keys; `max` says how many. |
498
+ | `server_exists` | 409 | The account already has a server with that name. |
499
+ | `server_limit` | 409 | The account has as many servers as it may; `max` says how many. |
500
+ | `server_reserved` | 409 | The server sends Sendora's own sign-in mail and cannot be renamed or removed. |
501
+ | `server_in_flight` | 409 | Messages of the server are still being delivered; delete it later. |
502
+ | `request_too_large` | 413 | The body exceeds 10 MB, or 64 MB for a broadcast. |
503
+ | `from_domain_not_verified` | 422 | The From domain is not a verified sending domain. |
504
+ | `stream_not_found` | 422 | `stream_id` names no stream of this server. |
505
+ | `stream_archived` | 422 | The stream is archived and takes no new messages. |
506
+ | `stream_paused` | 422 | Sendora paused the stream after complaints; support resumes it. |
507
+ | `stream_not_sendable` | 422 | An inbound stream receives mail; it takes no messages and has no list. |
508
+ | `stream_not_broadcast` | 422 | A broadcast goes on a broadcast stream; this one is transactional. |
509
+ | `substitution_missing` | 422 | The content names a `{{ key }}` a message does not give; `index` and `keys` say which. |
510
+ | `broadcast_not_open` | 409 | The broadcast is completed or cancelled; nothing is left to cancel. |
511
+ | `unsubscribe_placeholder_missing` | 422 | A broadcast message lacks `{{ unsubscribe_url }}` in a part. |
512
+ | `list_unsubscribe_reserved` | 422 | Sendora writes List-Unsubscribe on broadcast streams; leave it out. |
513
+ | `recipient_suppressed` | 422 | Recipients on the suppression list; `suppressed` lists them. |
514
+ | `test_address_on_live_server` | 422 | Addresses at simulator.sendora.se are for test servers; `addresses` lists them. |
515
+ | `stream_kind_not_allowed` | 422 | A test server has no inbound stream; receive on a live server. |
516
+ | `mode_immutable` | 400 | A server's mode is fixed at creation; create a new server for the other mode. |
517
+ | `idempotency_key_mismatch` | 422 | The key was used before with a different body. |
518
+ | `content_expired` | 410 | The received message's content window has passed; the message itself stays. |
519
+ | `content_unreadable` | 409 | The received message's stored content cannot be opened; Sendora has been told. |
520
+ | `rate_limited` | 429 | Per-minute limit; `retry_after`, `scope`, `limit`. From the edge, too many requests at once. |
521
+ | `monthly_cap_reached` | 429 | The monthly cap is used up; `scope`, `cap`, `used`, `resets_at`. |
522
+ | `sending_disabled` | 503 | Sending is paused for everyone; `retry_after`. |
523
+ | `connection_failed` | none | The request did not reach the API, or its answer was lost; `__cause__` says why. |
524
+ | `timeout` | none | A step of the request took longer than `timeout`. |
525
+ | `unexpected_response` | any | An answer without a JSON error body, such as from a proxy. |
526
+ | `invalid_signature` | none | A webhook's signature is missing, malformed or wrong. |
527
+ | `stale_signature` | none | A webhook's signature is older than the tolerance. |
528
528
 
529
529
  `error.retryable` is true when waiting and calling again could succeed.
530
530
  Neither the key nor a request's subject, text, HTML or attachments is ever
@@ -1,3 +1,3 @@
1
1
  """The package's version: the build reads it, and every request names it."""
2
2
 
3
- __version__ = "2.0.0"
3
+ __version__ = "2.0.2"
@@ -397,7 +397,8 @@ class RefusedBatchItem(Answer):
397
397
  retry_after: On ``rate_limited``, the seconds to wait.
398
398
  cap: On ``monthly_cap_reached``, the messages allowed a month.
399
399
  used: On ``monthly_cap_reached``, the messages sent this month.
400
- resets_at: On ``monthly_cap_reached``, when the month turns.
400
+ resets_at: On ``monthly_cap_reached``, when the month ends and the
401
+ count starts again.
401
402
  """
402
403
 
403
404
  index: int
@@ -917,7 +918,9 @@ class ServerLimit(Answer):
917
918
  Attributes:
918
919
  scope: Whose limit it is: the account's, the server's own, or the
919
920
  test cap the account's test servers share.
920
- period: The UTC minute or the calendar month in UTC it counts over.
921
+ period: The UTC minute, or the month it counts over: from the day
922
+ and time of the first payment for a paying account's live
923
+ server, otherwise the calendar month in UTC.
921
924
  limit: The emails allowed in the period, one per recipient.
922
925
  used: The emails the period has taken so far.
923
926
  resets_at: When the period ends and the count starts again.
@@ -950,9 +953,11 @@ class InboundCap(Answer):
950
953
  """The account's monthly cap on received mail, apart from the limits on sending.
951
954
 
952
955
  Attributes:
953
- limit: The emails the account may receive in the calendar month in
954
- UTC, over every inbound stream. It is the account's monthly cap
955
- on sending until an administrator moves it in the dashboard.
956
+ limit: The emails the account may receive in its month, over every
957
+ inbound stream. A paying account's month runs from the day and
958
+ time of its first payment, and any other account's is the
959
+ calendar month in UTC. It is the account's monthly cap on
960
+ sending until an administrator moves it in the dashboard.
956
961
  used: The emails received this month so far, one per recipient.
957
962
  resets_at: When the month ends and the count starts again.
958
963
  """
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes