sendly 4.5.0__tar.gz → 4.5.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.
- {sendly-4.5.0 → sendly-4.5.1}/PKG-INFO +13 -10
- {sendly-4.5.0 → sendly-4.5.1}/README.md +12 -9
- {sendly-4.5.0 → sendly-4.5.1}/pyproject.toml +1 -1
- {sendly-4.5.0 → sendly-4.5.1}/sendly/__init__.py +1 -1
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/whatsapp.py +23 -17
- {sendly-4.5.0 → sendly-4.5.1}/sendly/utils/http.py +1 -1
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_whatsapp_extras.py +4 -2
- {sendly-4.5.0 → sendly-4.5.1}/.github/header.svg +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/.gitignore +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/CHANGELOG.md +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/examples/async_example.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/examples/error_handling.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/examples/send_sms.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/client.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/errors.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/py.typed +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/__init__.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/account.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/business_upgrade.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/calls.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/campaigns.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/contacts.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/conversations.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/drafts.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/enterprise.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/labels.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/links.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/media.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/messages.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/numbers.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/rcs.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/rules.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/templates.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/tendlc.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/verify.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/voice.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/resources/webhooks.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/types.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/utils/__init__.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/utils/validation.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/sendly/webhooks.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/conftest.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_account.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_async_client.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_calls.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_campaigns.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_client.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_contacts.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_conversations.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_enterprise.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_errors.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_http_body_kwarg.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_http_retry.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_idempotency.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_media.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_messages.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_messages.py.bak +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_messages_batch.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_messages_schedule.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_messages_wire.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_numbers.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_path_ids.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_rcs.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_rcs_registration.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_rules.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_templates.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_tendlc.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_validation.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_voice.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_webhooks.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_webhooks_resource.py +0 -0
- {sendly-4.5.0 → sendly-4.5.1}/tests/test_whatsapp.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: sendly
|
|
3
|
-
Version: 4.5.
|
|
3
|
+
Version: 4.5.1
|
|
4
4
|
Summary: Official Sendly Python SDK for SMS messaging
|
|
5
5
|
Project-URL: Homepage, https://sendly.live
|
|
6
6
|
Project-URL: Documentation, https://sendly.live/docs
|
|
@@ -448,7 +448,7 @@ File uploads (`media.upload()`, `business_upgrade.start()` and `resubmit()`,
|
|
|
448
448
|
make is the `too_many_concurrent_verifications` wait. `whatsapp.signup.verify()`
|
|
449
449
|
and `whatsapp.signup.create()` with a `business_account_id` also raise a
|
|
450
450
|
timeout, a network error or a `5xx` at once, because repeating them can use up
|
|
451
|
-
a verification attempt or start a new signup; they still wait out a
|
|
451
|
+
a verification attempt or start a new charged signup; they still wait out a
|
|
452
452
|
`429` the API never ran.
|
|
453
453
|
|
|
454
454
|
After the last attempt the SDK raises the error it last saw (`TimeoutError`,
|
|
@@ -1355,7 +1355,7 @@ client.links.update(link.code, True)
|
|
|
1355
1355
|
|
|
1356
1356
|
## WhatsApp
|
|
1357
1357
|
|
|
1358
|
-
Connect a number you own to WhatsApp (
|
|
1358
|
+
Connect a number you own to WhatsApp ($9.99 one-time, no monthly fee), create
|
|
1359
1359
|
Meta-reviewed message templates, and send on the `whatsapp` channel. Connecting
|
|
1360
1360
|
the first number always ends with a human step: hand the `connect_url` to your
|
|
1361
1361
|
user - they open it in a browser and log in with Facebook to link their
|
|
@@ -1387,8 +1387,11 @@ print(f'Open {signup.connect_url} and log in with Facebook')
|
|
|
1387
1387
|
# After the Facebook step it stays 'registering' while WhatsApp activates the
|
|
1388
1388
|
# number. Activation usually takes a few minutes but can take hours. If it
|
|
1389
1389
|
# hasn't finished about 6 hours after the session began, the session fails
|
|
1390
|
-
# with registration_timeout ('failed', with
|
|
1391
|
-
# why).
|
|
1390
|
+
# with registration_timeout and the fee is refunded ('failed', with
|
|
1391
|
+
# signup.failure_reasons explaining why). The one-time $9.99 connection fee is
|
|
1392
|
+
# charged to your card when you start connecting the number and refunded
|
|
1393
|
+
# automatically if the connection fails; it is not refundable once the number
|
|
1394
|
+
# is connected.
|
|
1392
1395
|
|
|
1393
1396
|
# 2. Create a template (Meta reviews it, usually 24-48h). category is required
|
|
1394
1397
|
# (UTILITY, AUTHENTICATION or MARKETING) with no default, and an update can't
|
|
@@ -1472,7 +1475,7 @@ components = client.whatsapp.senders.get_conversational_components('+15555550123
|
|
|
1472
1475
|
client.whatsapp.senders.set_calling('+15555550123', enabled=True)
|
|
1473
1476
|
|
|
1474
1477
|
# Add another number to an account you already connected: no Facebook step.
|
|
1475
|
-
#
|
|
1478
|
+
# Same $9.99 fee, refunded if it fails. WhatsApp sends the number a 6-digit code
|
|
1476
1479
|
senders = client.whatsapp.senders.list().senders
|
|
1477
1480
|
account_id = next(
|
|
1478
1481
|
s.business_account_id for s in senders if s.status == 'active' and s.business_account_id
|
|
@@ -1496,7 +1499,7 @@ Senders also carry `business_account_id` (None while `pending`),
|
|
|
1496
1499
|
name on file), `calling_enabled`, and `outbound_calling_allowed`, which is
|
|
1497
1500
|
False for +1, +20, +84 and +234 numbers. A signup that is `verifying` carries
|
|
1498
1501
|
`verification_method` and `verification_attempts_remaining`; after 5 wrong
|
|
1499
|
-
codes it fails with `verification_failed
|
|
1502
|
+
codes it fails with `verification_failed` and the fee is refunded. Calls carry
|
|
1500
1503
|
`channel` (`phone`, `whatsapp` or `browser`; see `CallChannel`).
|
|
1501
1504
|
|
|
1502
1505
|
`verification_code` comes only from `signup.get()`. Until a code has been
|
|
@@ -1529,7 +1532,7 @@ Errors specific to WhatsApp:
|
|
|
1529
1532
|
body carries `retryAfter: 3600` and the response a `Retry-After: 3600`
|
|
1530
1533
|
header. The SDK retries it like any `5xx` before raising;
|
|
1531
1534
|
`e.response.retry_after` says how many seconds to wait before trying again.
|
|
1532
|
-
- `whatsapp_signup_limit_reached` (HTTP 429) after 5 failed signups in
|
|
1535
|
+
- `whatsapp_signup_limit_reached` (HTTP 429) after 5 failed, charged signups in
|
|
1533
1536
|
24 hours. It is final and not retried; try again the next day.
|
|
1534
1537
|
- `whatsapp_send_failed` on a send: HTTP 422 when WhatsApp refused the message,
|
|
1535
1538
|
which is final (cached under the idempotency key and replayed for 24 hours),
|
|
@@ -1565,8 +1568,8 @@ Errors specific to WhatsApp:
|
|
|
1565
1568
|
- Adding a number by code: `whatsapp_business_account_not_found` (HTTP 404),
|
|
1566
1569
|
`display_name_required` (HTTP 400), `whatsapp_signup_in_progress` and
|
|
1567
1570
|
`whatsapp_already_enabled` (HTTP 409), and
|
|
1568
|
-
`whatsapp_verification_start_failed` (HTTP 422 refused, 503 unreachable
|
|
1569
|
-
Facebook `signup.create()` for a number being
|
|
1571
|
+
`whatsapp_verification_start_failed` (HTTP 422 refused, 503 unreachable; the
|
|
1572
|
+
fee is refunded either way). A Facebook `signup.create()` for a number being
|
|
1570
1573
|
added by code gets `whatsapp_verification_in_progress` (HTTP 409).
|
|
1571
1574
|
`verify()`: `invalid_verification_code` (HTTP 400, not 6 digits),
|
|
1572
1575
|
`whatsapp_verification_code_invalid` (HTTP 422, with
|
|
@@ -413,7 +413,7 @@ File uploads (`media.upload()`, `business_upgrade.start()` and `resubmit()`,
|
|
|
413
413
|
make is the `too_many_concurrent_verifications` wait. `whatsapp.signup.verify()`
|
|
414
414
|
and `whatsapp.signup.create()` with a `business_account_id` also raise a
|
|
415
415
|
timeout, a network error or a `5xx` at once, because repeating them can use up
|
|
416
|
-
a verification attempt or start a new signup; they still wait out a
|
|
416
|
+
a verification attempt or start a new charged signup; they still wait out a
|
|
417
417
|
`429` the API never ran.
|
|
418
418
|
|
|
419
419
|
After the last attempt the SDK raises the error it last saw (`TimeoutError`,
|
|
@@ -1320,7 +1320,7 @@ client.links.update(link.code, True)
|
|
|
1320
1320
|
|
|
1321
1321
|
## WhatsApp
|
|
1322
1322
|
|
|
1323
|
-
Connect a number you own to WhatsApp (
|
|
1323
|
+
Connect a number you own to WhatsApp ($9.99 one-time, no monthly fee), create
|
|
1324
1324
|
Meta-reviewed message templates, and send on the `whatsapp` channel. Connecting
|
|
1325
1325
|
the first number always ends with a human step: hand the `connect_url` to your
|
|
1326
1326
|
user - they open it in a browser and log in with Facebook to link their
|
|
@@ -1352,8 +1352,11 @@ print(f'Open {signup.connect_url} and log in with Facebook')
|
|
|
1352
1352
|
# After the Facebook step it stays 'registering' while WhatsApp activates the
|
|
1353
1353
|
# number. Activation usually takes a few minutes but can take hours. If it
|
|
1354
1354
|
# hasn't finished about 6 hours after the session began, the session fails
|
|
1355
|
-
# with registration_timeout ('failed', with
|
|
1356
|
-
# why).
|
|
1355
|
+
# with registration_timeout and the fee is refunded ('failed', with
|
|
1356
|
+
# signup.failure_reasons explaining why). The one-time $9.99 connection fee is
|
|
1357
|
+
# charged to your card when you start connecting the number and refunded
|
|
1358
|
+
# automatically if the connection fails; it is not refundable once the number
|
|
1359
|
+
# is connected.
|
|
1357
1360
|
|
|
1358
1361
|
# 2. Create a template (Meta reviews it, usually 24-48h). category is required
|
|
1359
1362
|
# (UTILITY, AUTHENTICATION or MARKETING) with no default, and an update can't
|
|
@@ -1437,7 +1440,7 @@ components = client.whatsapp.senders.get_conversational_components('+15555550123
|
|
|
1437
1440
|
client.whatsapp.senders.set_calling('+15555550123', enabled=True)
|
|
1438
1441
|
|
|
1439
1442
|
# Add another number to an account you already connected: no Facebook step.
|
|
1440
|
-
#
|
|
1443
|
+
# Same $9.99 fee, refunded if it fails. WhatsApp sends the number a 6-digit code
|
|
1441
1444
|
senders = client.whatsapp.senders.list().senders
|
|
1442
1445
|
account_id = next(
|
|
1443
1446
|
s.business_account_id for s in senders if s.status == 'active' and s.business_account_id
|
|
@@ -1461,7 +1464,7 @@ Senders also carry `business_account_id` (None while `pending`),
|
|
|
1461
1464
|
name on file), `calling_enabled`, and `outbound_calling_allowed`, which is
|
|
1462
1465
|
False for +1, +20, +84 and +234 numbers. A signup that is `verifying` carries
|
|
1463
1466
|
`verification_method` and `verification_attempts_remaining`; after 5 wrong
|
|
1464
|
-
codes it fails with `verification_failed
|
|
1467
|
+
codes it fails with `verification_failed` and the fee is refunded. Calls carry
|
|
1465
1468
|
`channel` (`phone`, `whatsapp` or `browser`; see `CallChannel`).
|
|
1466
1469
|
|
|
1467
1470
|
`verification_code` comes only from `signup.get()`. Until a code has been
|
|
@@ -1494,7 +1497,7 @@ Errors specific to WhatsApp:
|
|
|
1494
1497
|
body carries `retryAfter: 3600` and the response a `Retry-After: 3600`
|
|
1495
1498
|
header. The SDK retries it like any `5xx` before raising;
|
|
1496
1499
|
`e.response.retry_after` says how many seconds to wait before trying again.
|
|
1497
|
-
- `whatsapp_signup_limit_reached` (HTTP 429) after 5 failed signups in
|
|
1500
|
+
- `whatsapp_signup_limit_reached` (HTTP 429) after 5 failed, charged signups in
|
|
1498
1501
|
24 hours. It is final and not retried; try again the next day.
|
|
1499
1502
|
- `whatsapp_send_failed` on a send: HTTP 422 when WhatsApp refused the message,
|
|
1500
1503
|
which is final (cached under the idempotency key and replayed for 24 hours),
|
|
@@ -1530,8 +1533,8 @@ Errors specific to WhatsApp:
|
|
|
1530
1533
|
- Adding a number by code: `whatsapp_business_account_not_found` (HTTP 404),
|
|
1531
1534
|
`display_name_required` (HTTP 400), `whatsapp_signup_in_progress` and
|
|
1532
1535
|
`whatsapp_already_enabled` (HTTP 409), and
|
|
1533
|
-
`whatsapp_verification_start_failed` (HTTP 422 refused, 503 unreachable
|
|
1534
|
-
Facebook `signup.create()` for a number being
|
|
1536
|
+
`whatsapp_verification_start_failed` (HTTP 422 refused, 503 unreachable; the
|
|
1537
|
+
fee is refunded either way). A Facebook `signup.create()` for a number being
|
|
1535
1538
|
added by code gets `whatsapp_verification_in_progress` (HTTP 409).
|
|
1536
1539
|
`verify()`: `invalid_verification_code` (HTTP 400, not 6 digits),
|
|
1537
1540
|
`whatsapp_verification_code_invalid` (HTTP 422, with
|
|
@@ -5,7 +5,7 @@ WhatsApp is a first-class Sendly channel: connect a number you own, create
|
|
|
5
5
|
Meta-reviewed message templates, and send via
|
|
6
6
|
``client.messages.send(channel='whatsapp', ...)``.
|
|
7
7
|
|
|
8
|
-
Connecting a number
|
|
8
|
+
Connecting a number costs a one-time $9.99 fee (no monthly fee) and always ends
|
|
9
9
|
with a human step: ``signup.create()`` returns a ``connect_url`` that a person
|
|
10
10
|
must open in a browser and log in with Facebook to link their WhatsApp
|
|
11
11
|
Business Account. Hand the URL to your user - that connection cannot be
|
|
@@ -99,35 +99,41 @@ class WhatsAppSignupResource:
|
|
|
99
99
|
) -> Union[WhatsAppSignupSession, WhatsAppSignup]:
|
|
100
100
|
"""Start connecting a number to WhatsApp.
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
Charges a one-time $9.99 connection fee per number (no monthly fee) to
|
|
103
|
+
your card when the connection starts, and returns a
|
|
103
104
|
``connect_url``. Completing the connection requires a human: hand the
|
|
104
105
|
URL to your user - they open it in a browser and log in with Facebook
|
|
105
106
|
to link their WhatsApp Business Account. Then poll :meth:`get` until
|
|
106
107
|
the status is ``active``.
|
|
107
108
|
|
|
108
109
|
Calling again for a number with an in-flight signup returns the
|
|
109
|
-
existing signup (same ``connect_url``).
|
|
110
|
+
existing signup (same ``connect_url``) without charging again.
|
|
110
111
|
Requires a live API key with the ``whatsapp:write`` scope and, in a
|
|
111
112
|
team workspace, an owner or admin (``settings:write``). After the
|
|
112
113
|
Facebook step the signup stays ``registering`` while WhatsApp
|
|
113
114
|
activates the number. Activation usually takes a few minutes but can
|
|
114
115
|
take hours. If it hasn't finished about 6 hours after the session
|
|
115
|
-
began, the session fails with ``registration_timeout
|
|
116
|
+
began, the session fails with ``registration_timeout`` and the fee is
|
|
117
|
+
refunded. If the connection fails, the $9.99 fee is refunded
|
|
118
|
+
automatically; once the number has connected it is not refundable, and
|
|
119
|
+
a later disconnect gets nothing back.
|
|
116
120
|
|
|
117
121
|
Pass ``business_account_id`` to add the number to a WhatsApp
|
|
118
122
|
Business Account this workspace has already connected, without the
|
|
119
|
-
Facebook step.
|
|
120
|
-
|
|
123
|
+
Facebook step. The same $9.99 fee applies (refunded automatically if the
|
|
124
|
+
connection fails), then WhatsApp sends the number a 6-digit code by
|
|
125
|
+
text or voice call. This returns a :class:`WhatsAppSignup` with status
|
|
121
126
|
``verifying`` and no ``connect_url``: submit the code with
|
|
122
127
|
:meth:`verify`, or read it from :meth:`get` as ``verification_code``
|
|
123
128
|
once the text reaches the number. Calling again for a number that is
|
|
124
|
-
already verifying returns that signup without a second
|
|
125
|
-
two exceptions: if the first call stopped before
|
|
129
|
+
already verifying returns that signup without a second charge or a
|
|
130
|
+
second code, with two exceptions: if the first call stopped before
|
|
126
131
|
the code was requested, the repeat requests it (201); and a verifying
|
|
127
|
-
signup more than 3 hours old is failed and
|
|
132
|
+
signup more than 3 hours old is failed and refunded, and a new charged
|
|
133
|
+
one is started. With ``business_account_id`` a 5xx, a timeout or a
|
|
128
134
|
network error is raised at once, never retried: each attempt can
|
|
129
|
-
start a new signup and
|
|
130
|
-
API never ran is retried.
|
|
135
|
+
start a new signup that is charged and, when it fails, refunded. Only
|
|
136
|
+
a 429 the API never ran is retried.
|
|
131
137
|
|
|
132
138
|
Args:
|
|
133
139
|
phone_number: The number to connect, in E.164 format. Must be an
|
|
@@ -164,12 +170,12 @@ class WhatsAppSignupResource:
|
|
|
164
170
|
lacks ``whatsapp:write`` or the role isn't owner or admin.
|
|
165
171
|
SendlyError: ``whatsapp_requires_live_key`` (403) with a test key.
|
|
166
172
|
SendlyError: ``whatsapp_unavailable`` (503) while WhatsApp
|
|
167
|
-
connections are unavailable. Only signup
|
|
173
|
+
connections are unavailable. Nothing is charged. Only signup
|
|
168
174
|
returns it, with ``retryAfter: 3600`` in the body and a
|
|
169
175
|
``Retry-After: 3600`` header. The SDK retries it like any 5xx
|
|
170
176
|
before raising.
|
|
171
177
|
SendlyError: ``whatsapp_signup_limit_reached`` (429) after 5
|
|
172
|
-
failed signups (or 20 cancelled) in 24 hours. Not retried;
|
|
178
|
+
failed, charged signups (or 20 cancelled) in 24 hours. Not retried;
|
|
173
179
|
try again the next day.
|
|
174
180
|
SendlyError: ``whatsapp_verification_in_progress`` (409) without
|
|
175
181
|
``business_account_id`` for a number being added by code;
|
|
@@ -184,8 +190,8 @@ class WhatsAppSignupResource:
|
|
|
184
190
|
``whatsapp_already_enabled`` (409) when it is connected.
|
|
185
191
|
SendlyError: ``whatsapp_verification_start_failed``: 422 when
|
|
186
192
|
WhatsApp refused to send a code (final), 503 when it couldn't
|
|
187
|
-
be reached. Either way the signup failed
|
|
188
|
-
retried automatically.
|
|
193
|
+
be reached. Either way the signup failed and the fee is
|
|
194
|
+
refunded; start again. Not retried automatically.
|
|
189
195
|
"""
|
|
190
196
|
validate_phone_number(phone_number)
|
|
191
197
|
body = _signup_body(phone_number, business_account_id, verification_method, display_name)
|
|
@@ -228,7 +234,7 @@ class WhatsAppSignupResource:
|
|
|
228
234
|
wrong code; ``e.response.attempts_remaining`` says how many
|
|
229
235
|
tries are left.
|
|
230
236
|
SendlyError: ``whatsapp_verification_failed`` (409) after 5 wrong
|
|
231
|
-
codes: the signup failed.
|
|
237
|
+
codes: the signup failed and the fee is refunded.
|
|
232
238
|
SendlyError: ``whatsapp_verification_busy`` (409) while another
|
|
233
239
|
code for the number is being checked; try again in a moment.
|
|
234
240
|
SendlyError: ``signup_not_active`` (409) when the signup isn't
|
|
@@ -766,7 +772,7 @@ class WhatsAppResource:
|
|
|
766
772
|
"""WhatsApp API resource (sync)
|
|
767
773
|
|
|
768
774
|
Example:
|
|
769
|
-
>>> # 1. Connect a number (
|
|
775
|
+
>>> # 1. Connect a number ($9.99 one-time, no monthly fee). The connect
|
|
770
776
|
>>> # URL must be opened by a human - they log in with Facebook in
|
|
771
777
|
>>> # a browser to link their WhatsApp Business Account.
|
|
772
778
|
>>> signup = client.whatsapp.signup.create('+15559876543')
|
|
@@ -892,7 +892,8 @@ def no_async_sleep(monkeypatch):
|
|
|
892
892
|
START_FAILED = {
|
|
893
893
|
"error": "whatsapp_verification_start_failed",
|
|
894
894
|
"message": (
|
|
895
|
-
"WhatsApp couldn't start verifying this number.
|
|
895
|
+
"WhatsApp couldn't start verifying this number. Any setup fee is refunded "
|
|
896
|
+
"automatically. Please try again shortly."
|
|
896
897
|
),
|
|
897
898
|
}
|
|
898
899
|
|
|
@@ -943,7 +944,8 @@ class TestServerErrorsOnCallsThatMustNotRepeat:
|
|
|
943
944
|
json={
|
|
944
945
|
"error": "internal_error",
|
|
945
946
|
"message": (
|
|
946
|
-
"Something went wrong asking WhatsApp for the code.
|
|
947
|
+
"Something went wrong asking WhatsApp for the code. Any setup fee is "
|
|
948
|
+
"refunded automatically. Please try again."
|
|
947
949
|
),
|
|
948
950
|
},
|
|
949
951
|
is_reusable=True,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|