├── .env.dist ├── .github └── workflows │ └── linter.yml ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── SNIPPETS.md ├── account ├── configure-account.py ├── create-secret.py ├── fetch-a-secret.py ├── get-balance.py ├── list-all-secrets.py └── revoke-secret.py ├── application ├── create-application.py ├── delete-application.py ├── get-application.py ├── list-applications.py └── update-application.py ├── decode-jwt ├── README.md └── main.py ├── meetings ├── create-instant-room.py ├── create-long-term-room.py ├── create-theme.py ├── delete-recording.py ├── delete-theme.py ├── get-recording.py ├── get-room.py ├── get-theme.py ├── list-dial-in-numbers.py ├── list-recordings.py ├── list-rooms-by-theme.py ├── list-rooms.py ├── list-themes.py ├── update-application.py ├── update-room.py ├── update-theme.py └── upload-logo-to-theme.py ├── messages ├── inbound-message.py ├── message-status.py ├── messenger │ ├── send-audio.py │ ├── send-file.py │ ├── send-image.py │ ├── send-text.py │ └── send-video.py ├── mms │ ├── send-audio.py │ ├── send-image.py │ ├── send-vcard.py │ └── send-video.py ├── rcs │ ├── revoke-message.py │ ├── send-file.py │ ├── send-image.py │ ├── send-rich-card-carousel.py │ ├── send-rich-card-standalone.py │ ├── send-suggested-action-create-calendar-event.py │ ├── send-suggested-action-dial.py │ ├── send-suggested-action-multiple.py │ ├── send-suggested-action-open-url.py │ ├── send-suggested-action-share-location.py │ ├── send-suggested-action-view-location.py │ ├── send-suggested-reply.py │ ├── send-text.py │ └── send-video.py ├── sandbox │ ├── messenger │ │ └── send_text.py │ ├── viber │ │ └── send_text.py │ └── whatsapp │ │ └── send_text.py ├── sms │ └── send-sms.py ├── verify-signed-webhooks.py ├── viber │ ├── send-file.py │ ├── send-image.py │ ├── send-text.py │ └── send-video.py ├── webhook-server.py └── whatsapp │ ├── mark-as-read.py │ ├── send-audio.py │ ├── send-authentication-template.py │ ├── send-button-link.py │ ├── send-button-quick-reply.py │ ├── send-contact.py │ ├── send-file.py │ ├── send-image.py │ ├── send-location.py │ ├── send-media-template.py │ ├── send-product-message-multiple-item.py │ ├── send-product-message-single-item.py │ ├── send-sticker-by-id.py │ ├── send-sticker-by-url.py │ ├── send-template.py │ ├── send-text.py │ └── send-video.py ├── number-insight-v2 ├── get-fraud-score.py └── get-sim-swap-status.py ├── number-insight ├── async-callback │ ├── README.md │ └── main.py ├── ni-advanced-async-trigger.py ├── ni-advanced.py ├── ni-basic.py └── ni-standard.py ├── numbers ├── buy.py ├── cancel.py ├── list.py ├── search.py └── update.py ├── readme-base.md ├── requirements.txt ├── sms ├── delivery-receipts.py ├── receive-sms.py ├── send-an-sms-with-unicode.py ├── send-an-sms.py ├── send-signed-sms.py ├── submit-sms-conversion.py └── verify-signed-sms │ ├── README.md │ └── main.py ├── subaccounts ├── create-subaccount.py ├── get-subaccount.py ├── list-balance-transfers.py ├── list-credit-transfers.py ├── list-subaccounts.py ├── reactivate-subaccount.py ├── suspend-subaccount.py ├── transfer-balance.py ├── transfer-credit.py └── transfer-number.py ├── tools └── aggregate_snippets.py ├── users ├── create-user.py ├── delete-user.py ├── get-user.py ├── list-users.py └── update-user.py ├── verify ├── cancel-request.py ├── check-verification-code.py ├── send-request-email.py ├── send-request-silent-auth.py ├── send-request-sms.py ├── send-request-voice.py ├── send-request-whatsapp-interactive.py ├── send-request-whatsapp.py └── send-request-with-fallback.py ├── verify_legacy ├── cancel.py ├── check.py ├── psd2-request.py ├── request.py ├── search.py ├── send-psd2-verification-request-with-workflow.py ├── send-verification-request-with-workflow.py └── trigger-next-step.py └── voice ├── connect-an-inbound-call.py ├── connect-callers-to-a-conference.py ├── earmuff-a-call.py ├── get-recording.py ├── handle-user-input-with-asr.py ├── handle-user-input.py ├── make-an-outbound-call.py ├── make-outbound-call-ncco.py ├── mute-a-call.py ├── play-audio-stream-into-call.py ├── play-dtmf-into-call.py ├── play-tts-into-call.py ├── receive-an-inbound-call.py ├── record-a-call-with-split-audio.py ├── record-a-call.py ├── record-a-conversation.py ├── record-a-message.py ├── retrieve-info-for-a-call.py ├── retrieve-info-for-all-calls.py ├── track-ncco.py ├── transfer-a-call.py └── transfer-call-inline-ncco.py /.env.dist: -------------------------------------------------------------------------------- 1 | # General 2 | VONAGE_API_KEY='VONAGE_API_KEY' 3 | VONAGE_API_SECRET='VONAGE_API_SECRET' 4 | VONAGE_APPLICATION_ID='VONAGE_APPLICATION_ID' 5 | VONAGE_PRIVATE_KEY='VONAGE_PRIVATE_KEY' 6 | VONAGE_SIGNATURE_SECRET='VONAGE_SIGNATURE_SECRET' 7 | 8 | # Account 9 | ACCOUNT_ID='ACCOUNT_ID' 10 | ACCOUNT_SECRET='ACCOUNT_SECRET' 11 | ACCOUNT_SECRET_ID='ACCOUNT_SECRET_ID' 12 | ACCOUNT_SMS_CALLBACK_URL='ACCOUNT_SMS_CALLBACK_URL' 13 | 14 | # Application and Users 15 | APPLICATION_NAME='APPLICATION_NAME' 16 | USER_ID='USER_ID' 17 | USER_NAME='USER_NAME' 18 | USER_DISPLAY_NAME='USER_DISPLAY_NAME' 19 | 20 | # Messages 21 | MESSAGES_TO_NUMBER='MESSAGES_TO_NUMBER' 22 | MESSAGES_API_URL='MESSAGES_API_URL' 23 | GEOSPECIFIC_VONAGE_API_HOST='GEOSPECIFIC_VONAGE_API_HOST' 24 | MESSAGES_MESSAGE_ID='MESSAGES_MESSAGE_ID' 25 | SMS_SENDER_ID='SMS_SENDER_ID' 26 | MMS_SENDER_ID='MMS_SENDER_ID' 27 | RCS_SENDER_ID='RCS_SENDER_ID' 28 | WHATSAPP_SENDER_ID='WHATSAPP_SENDER_ID' 29 | WHATSAPP_TEMPLATE_NAME='WHATSAPP_TEMPLATE_NAME' 30 | WHATSAPP_CATALOG_ID='WHATSAPP_CATALOG_ID' 31 | WHATSAPP_PRODUCT_ID_1='WHATSAPP_PRODUCT_ID_1' 32 | WHATSAPP_PRODUCT_ID_2='WHATSAPP_PRODUCT_ID_2' 33 | WHATSAPP_OTP='WHATSAPP_OTP' 34 | MESSENGER_RECIPIENT_ID='MESSENGER_RECIPIENT_ID' 35 | MESSENGER_SENDER_ID='MESSENGER_SENDER_ID' 36 | VIBER_SENDER_ID='VIBER_SENDER_ID' 37 | MESSAGES_IMAGE_URL='MESSAGES_IMAGE_URL' 38 | MESSAGES_AUDIO_URL='MESSAGES_AUDIO_URL' 39 | MESSAGES_VIDEO_URL='MESSAGES_VIDEO_URL' 40 | MESSAGES_VIDEO_DURATION='MESSAGES_VIDEO_DURATION' 41 | MESSAGES_VIDEO_FILE_SIZE='MESSAGES_VIDEO_FILE_SIZE' 42 | MESSAGES_FILE_URL='MESSAGES_FILE_URL' 43 | MESSAGES_VCARD_URL='MESSAGES_VCARD_URL' 44 | MESSAGES_EMOJI='MESSAGES_EMOJI' 45 | WHATSAPP_STICKER_ID='WHATSAPP_STICKER_ID' 46 | WHATSAPP_STICKER_URL='WHATSAPP_STICKER_URL' 47 | 48 | # NI 49 | INSIGHT_NUMBER='INSIGHT_NUMBER' 50 | INSIGHT_CALLBACK_URL='INSIGHT_CALLBACK_URL' 51 | 52 | # Numbers 53 | NUMBER_MSISDN='NUMBER_MSISDN' 54 | NUMBER_COUNTRY_CODE='NUMBER_COUNTRY_CODE' 55 | NUMBER_TYPE='NUMBER_TYPE' 56 | NUMBER_FEATURES='NUMBER_FEATURES' 57 | NUMBER_SEARCH_CRITERIA='NUMBER_SEARCH_CRITERIA' 58 | NUMBER_SEARCH_PATTERN='NUMBER_SEARCH_PATTERN' 59 | NUMBER_SMS_CALLBACK_URL='NUMBER_SMS_CALLBACK_URL' 60 | NUMBER_VOICE_CALLBACK_URL='NUMBER_VOICE_CALLBACK_URL' 61 | NUMBER_VOICE_STATUS_CALLBACK_URL='NUMBER_VOICE_STATUS_CALLBACK_URL' 62 | 63 | # SMS 64 | ## Note: Set SMS_SENDER_ID under the Messages section 65 | SMS_TO_NUMBER='SMS_TO_NUMBER' 66 | SMS_SIGNATURE='SMS_SIGNATURE' 67 | SMS_TIMESTAMP='SMS_TIMESTAMP' 68 | 69 | # Subaccounts 70 | SUBACCOUNT_NAME='SUBACCOUNT_NAME' 71 | SUBACCOUNT_SECRET='SUBACCOUNT_SECRET' 72 | SUBACCOUNT_KEY='SUBACCOUNT_KEY' 73 | SUBACCOUNT_BALANCE_AMOUNT='SUBACCOUNT_BALANCE_AMOUNT' 74 | SUBACCOUNT_CREDIT_AMOUNT='SUBACCOUNT_CREDIT_AMOUNT' 75 | SUBACCOUNT_START_DATE='SUBACCOUNT_START_DATE' 76 | 77 | # Verify 78 | VERIFY_NUMBER='VERIFY_NUMBER' 79 | VERIFY_FROM_NUMBER='VERIFY_FROM_NUMBER' 80 | VERIFY_BRAND_NAME='VERIFY_BRAND_NAME' 81 | VERIFY_REQUEST_ID='VERIFY_REQUEST_ID' 82 | VERIFY_CODE='VERIFY_CODE' 83 | VERIFY_TEMPLATE_ID='VERIFY_TEMPLATE_ID' 84 | VERIFY_TEMPLATE_FRAGMENT_ID='VERIFY_TEMPLATE_FRAGMENT_ID' 85 | VERIFY_TO_EMAIL='VERIFY_TO_EMAIL' 86 | VERIFY_FROM_EMAIL='VERIFY_FROM_EMAIL' 87 | 88 | # Verify Legacy 89 | VERIFY_PAYEE_NAME='VERIFY_PAYEE_NAME' 90 | VERIFY_AMOUNT='VERIFY_AMOUNT' 91 | VERIFY_WORKFLOW_ID='VERIFY_WORKFLOW_ID' 92 | 93 | # Voice 94 | VONAGE_VIRTUAL_NUMBER='VONAGE_VIRTUAL_NUMBER' 95 | VOICE_TO_NUMBER='VOICE_TO_NUMBER' 96 | VOICE_CONFERENCE_NAME='VOICE_CONFERENCE_NAME' 97 | VOICE_RECORDING_URL='VOICE_RECORDING_URL' 98 | VOICE_ANSWER_URL='VOICE_ANSWER_URL' 99 | VOICE_CALL_ID='VOICE_CALL_ID' 100 | VOICE_STREAM_URL='VOICE_STREAM_URL' 101 | VOICE_DTMF_DIGITS='VOICE_DTMF_DIGITS' 102 | VOICE_TEXT='VOICE_TEXT' 103 | VOICE_LANGUAGE='VOICE_LANGUAGE' 104 | VOICE_NCCO_URL='VOICE_NCCO_URL' -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | # This workflow will install Python dependencies, run tests and lint with a single version of Python 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions 3 | 4 | name: Check Lint 5 | 6 | permissions: 7 | actions: write 8 | checks: write 9 | contents: read 10 | deployments: read 11 | issues: write 12 | discussions: write 13 | packages: read 14 | pages: write 15 | pull-requests: write 16 | security-events: write 17 | statuses: write 18 | 19 | on: 20 | push: 21 | branches: [ main ] 22 | pull_request: 23 | branches: [ main ] 24 | 25 | jobs: 26 | build: 27 | 28 | runs-on: ubuntu-latest 29 | 30 | steps: 31 | - uses: actions/checkout@v4 32 | - name: Set up Python 3.13 33 | uses: actions/setup-python@v5 34 | with: 35 | python-version: '3.13' 36 | - name: Install dependencies 37 | run: | 38 | python -m pip install --upgrade pip 39 | pip install flake8 40 | if [ -f requirements.txt ]; then pip install -r requirements.txt; fi 41 | - name: Lint with flake8 42 | run: | 43 | python3 -m flake8 --count --select=E9,F63,F7,F82 --ignore=F821 --show-source --statistics 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | local_settings.py 55 | 56 | # Flask stuff: 57 | instance/ 58 | .webassets-cache 59 | 60 | # Scrapy stuff: 61 | .scrapy 62 | 63 | # Sphinx documentation 64 | docs/_build/ 65 | 66 | # PyBuilder 67 | target/ 68 | 69 | # IPython Notebook 70 | .ipynb_checkpoints 71 | 72 | # pyenv 73 | .python-version 74 | 75 | # celery beat schedule file 76 | celerybeat-schedule 77 | 78 | # dotenv 79 | .env 80 | 81 | # virtualenv 82 | venv*/ 83 | ENV/ 84 | .venv*/ 85 | 86 | # Spyder project settings 87 | .spyderproject 88 | 89 | # Rope project settings 90 | .ropeproject 91 | 92 | # Vonage key files 93 | *.key 94 | 95 | #IDE's and Editor's Temporary Files 96 | .vscode 97 | .idea 98 | 99 | .DS_Store 100 | settings.json 101 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Getting Involved 2 | 3 | Thanks for your interest in the project, we'd love to have you involved! Check out the sections below to find out more about what to do next... 4 | 5 | ## Opening an Issue 6 | 7 | We always welcome issues, if you've seen something that isn't quite right or you have a suggestion for a new feature, please go ahead and open an issue in this project. Include as much information as you have, it really helps. 8 | 9 | ## Making a Code Change 10 | 11 | We're always open to pull requests, but these should be small and clearly described so that we can understand what you're trying to do. Feel free to open an issue first and get some discussion going. 12 | 13 | When you're ready to start coding, fork this repository to your own GitHub account and make your changes in a new branch. Once you're happy, open a pull request and explain what the change is and why you think we should include it in our project. 14 | 15 | 16 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024 Vonage Community 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /account/configure-account.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 10 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 11 | ACCOUNT_SMS_CALLBACK_URL = os.getenv('ACCOUNT_SMS_CALLBACK_URL') 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_account import SettingsResponse 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | settings: SettingsResponse = client.account.update_default_sms_webhook( 19 | mo_callback_url=ACCOUNT_SMS_CALLBACK_URL 20 | ) 21 | 22 | print(settings) 23 | -------------------------------------------------------------------------------- /account/create-secret.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | ACCOUNT_SECRET = os.getenv('ACCOUNT_SECRET') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_account import VonageApiSecret 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: VonageApiSecret = client.account.create_secret(ACCOUNT_SECRET) 20 | print(response) 21 | -------------------------------------------------------------------------------- /account/fetch-a-secret.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.environ.get("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.environ.get("VONAGE_API_SECRET") 11 | ACCOUNT_SECRET_ID = os.environ.get("ACCOUNT_SECRET_ID") 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_account import VonageApiSecret 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | secret: VonageApiSecret = client.account.get_secret(ACCOUNT_SECRET_ID) 19 | 20 | print(f'Secret ID: {secret.id}; Created at {secret.created_at}') 21 | -------------------------------------------------------------------------------- /account/get-balance.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 10 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 11 | 12 | from vonage import Auth, Vonage 13 | from vonage_account import Balance 14 | 15 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 16 | 17 | balance: Balance = client.account.get_balance() 18 | 19 | print(f'{balance.value:0.2f} EUR, auto-reload: {balance.auto_reload}') 20 | -------------------------------------------------------------------------------- /account/list-all-secrets.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.environ.get("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.environ.get("VONAGE_API_SECRET") 11 | 12 | from vonage import Auth, Vonage 13 | from vonage_account import VonageApiSecret 14 | 15 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 16 | 17 | response: list[VonageApiSecret] = client.account.list_secrets() 18 | print(response) 19 | -------------------------------------------------------------------------------- /account/revoke-secret.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.environ.get("VONAGE_API_KEY") 11 | VONAGE_API_SECRET = os.environ.get("VONAGE_API_SECRET") 12 | ACCOUNT_SECRET_ID = os.getenv("ACCOUNT_SECRET_ID") 13 | 14 | from vonage import Auth, Vonage 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | client.account.revoke_secret(ACCOUNT_SECRET_ID) 18 | -------------------------------------------------------------------------------- /application/create-application.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from os.path import dirname, join 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_application import (ApplicationConfig, ApplicationData, 15 | ApplicationUrl, Capabilities, Messages, 16 | MessagesWebhooks, Region, Verify, 17 | VerifyWebhooks, Voice, VoiceUrl, VoiceWebhooks) 18 | 19 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 20 | 21 | # Voice application options 22 | voice = Voice( 23 | webhooks=VoiceWebhooks( 24 | answer_url=VoiceUrl( 25 | address='https://example.com/answer', 26 | http_method='POST', 27 | connect_timeout=500, 28 | socket_timeout=3000, 29 | ), 30 | fallback_answer_url=VoiceUrl( 31 | address='https://example.com/fallback', 32 | http_method='POST', 33 | connect_timeout=500, 34 | socket_timeout=3000, 35 | ), 36 | event_url=VoiceUrl( 37 | address='https://example.com/event', 38 | http_method='POST', 39 | connect_timeout=500, 40 | socket_timeout=3000, 41 | ), 42 | ), 43 | signed_callbacks=True, 44 | conversations_ttl=8000, 45 | leg_persistence_time=14, 46 | region=Region.NA_EAST, 47 | ) 48 | 49 | # Messages application options 50 | messages = Messages( 51 | version='v1', 52 | webhooks=MessagesWebhooks( 53 | inbound_url=ApplicationUrl( 54 | address='https://example.com/inbound', http_method='POST' 55 | ), 56 | status_url=ApplicationUrl( 57 | address='https://example.com/status', http_method='POST' 58 | ), 59 | ), 60 | authenticate_inbound_media=True, 61 | ) 62 | 63 | # Verify application options 64 | verify = Verify( 65 | webhooks=VerifyWebhooks( 66 | status_url=ApplicationUrl(address='https://example.com/status', http_method='GET') 67 | ), 68 | ) 69 | 70 | # Set the application capabilities 71 | capabilities = Capabilities(voice=voice, messages=messages, verify=verify) 72 | 73 | # Set the application configuration that will be applied 74 | params = ApplicationConfig( 75 | name='My Custom Application', 76 | capabilities=capabilities, 77 | ) 78 | 79 | # Call the API 80 | response: ApplicationData = client.application.create_application(params) 81 | 82 | print(response) 83 | -------------------------------------------------------------------------------- /application/delete-application.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from os.path import dirname, join 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 13 | 14 | from vonage import Auth, Vonage 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | client.application.delete_application(VONAGE_APPLICATION_ID) 19 | -------------------------------------------------------------------------------- /application/get-application.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from os.path import dirname, join 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_application import ApplicationData 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: ApplicationData = client.application.get_application(VONAGE_APPLICATION_ID) 20 | 21 | print(response) 22 | -------------------------------------------------------------------------------- /application/list-applications.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_application import ListApplicationsFilter 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | applications, next_page = client.application.list_applications( 19 | filter=ListApplicationsFilter(page_size=10, page=1) 20 | ) 21 | 22 | pprint(f'Applications:\n{applications}, \nNext page: {next_page}') 23 | -------------------------------------------------------------------------------- /application/update-application.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | import os 3 | from os.path import dirname, join 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_application import (ApplicationConfig, ApplicationData, 16 | ApplicationUrl, Messages, MessagesWebhooks) 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | config = ApplicationConfig( 21 | name='My Renamed Application', 22 | capabilities=Messages( 23 | webhooks=MessagesWebhooks( 24 | inbound_url=ApplicationUrl( 25 | address='https://example.com/inbound_new_url', http_method='GET' 26 | ), 27 | status_url=ApplicationUrl( 28 | address='https://example.com/status_new_url', http_method='GET' 29 | ), 30 | ), 31 | authenticate_inbound_media=False, 32 | ), 33 | ) 34 | response: ApplicationData = client.application.update_application( 35 | id=VONAGE_APPLICATION_ID, config=config 36 | ) 37 | 38 | print(response) 39 | -------------------------------------------------------------------------------- /decode-jwt/README.md: -------------------------------------------------------------------------------- 1 | # Verifying Signed Webhooks Demo 2 | 3 | This quick demo shows how to verify an incoming Webhook signature by decoding the incoming JWT sent by Vonage. 4 | 5 | For signed incoming SMS signatures through the Messaging API, please see the snippet for verifying a signed incoming SMS message instead. 6 | 7 | ## Usage 8 | 9 | You may want to use a localhost tunnel agent such as [ngrok](https://ngrok.com/) for local testing. 10 | 11 | ### Set Up Your Environment 12 | 13 | Install dependencies with `pip` in a virtual environment: 14 | 15 | ```bash 16 | python3 -m venv venv 17 | . ./venv/bin/activate 18 | 19 | # Point to the requirements file in the root of the python-code-snippets repo 20 | pip install -r requirements.txt 21 | ``` 22 | 23 | ### Set Up an Incoming Webhook 24 | 1. Start ngrok with `ngrok http 8000`. ngrok will give you a forwarding address you can now use to recieve event webhooks. 25 | 1. Go to the [Customer Dashboard](https://dashboard.nexmo.com/sign-in). 26 | 1. Click on ["Applications"](https://dashboard.nexmo.com/applications). 27 | 1. Click the three dots and select "Edit" for the application you are using. 28 | 1. Under "Capabilities", enter `https://your-ngrok-url/events` for the Voice capability. 29 | 1. Click "Save". 30 | 31 | ### Start the FastAPI Server 32 | 33 | Run the FastAPI server with 34 | 35 | ```bash 36 | fastapi dev decode-jwt/main.py 37 | ``` 38 | 39 | You can now create a voice call using the voice sample in this repo. This sample app will verify the incoming signature. -------------------------------------------------------------------------------- /decode-jwt/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), '../.env') 8 | load_dotenv(envpath) 9 | 10 | 11 | VONAGE_SIGNATURE_SECRET = os.getenv('VONAGE_SIGNATURE_SECRET') 12 | 13 | from fastapi import FastAPI, Request 14 | from vonage_jwt.verify_jwt import verify_signature 15 | 16 | app = FastAPI() 17 | 18 | 19 | @app.get('/events') 20 | async def verify_signed_webhook(request: Request): 21 | # Need to get the JWT after "Bearer " in the authorization header 22 | auth_header = request.headers["authorization"].split() 23 | token = auth_header[1].strip() 24 | 25 | if verify_signature(token, VONAGE_SIGNATURE_SECRET): 26 | print('Valid signature') 27 | else: 28 | print('Invalid signature') 29 | -------------------------------------------------------------------------------- /meetings/create-instant-room.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | ROOM_DISPLAY_NAME = os.environ.get('ROOM_DISPLAY_NAME') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.create_room({'display_name': ROOM_DISPLAY_NAME}) 21 | -------------------------------------------------------------------------------- /meetings/create-long-term-room.py: -------------------------------------------------------------------------------- 1 | import os 2 | from datetime import datetime, timedelta 3 | from os.path import dirname, join 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | ROOM_DISPLAY_NAME = os.environ.get('ROOM_DISPLAY_NAME') 13 | 14 | 15 | import vonage 16 | 17 | client = vonage.Client( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | 22 | expiration_date = (datetime.utcnow() + timedelta(days=30)).isoformat() 23 | 24 | params = { 25 | 'display_name': ROOM_DISPLAY_NAME, 26 | 'type': 'long_term', 27 | 'expires_at': expiration_date, 28 | } 29 | 30 | response = client.meetings.create_room(params) 31 | -------------------------------------------------------------------------------- /meetings/create-theme.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | MAIN_COLOR = os.environ.get('MAIN_COLOR') 12 | BRAND_TEXT = os.environ.get('BRAND_TEXT') 13 | 14 | import vonage 15 | 16 | client = vonage.Client( 17 | application_id=VONAGE_APPLICATION_ID, 18 | private_key=VONAGE_PRIVATE_KEY, 19 | ) 20 | 21 | response = client.meetings.create_theme( 22 | { 23 | 'main_color': MAIN_COLOR, 24 | 'brand_text': BRAND_TEXT, 25 | } 26 | ) 27 | -------------------------------------------------------------------------------- /meetings/delete-recording.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | RECORDING_ID = os.environ.get('RECORDING_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | client.meetings.delete_recording(RECORDING_ID) 21 | -------------------------------------------------------------------------------- /meetings/delete-theme.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | THEME_ID = os.environ.get('THEME_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | client.meetings.delete_theme(THEME_ID) 21 | -------------------------------------------------------------------------------- /meetings/get-recording.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | RECORDING_ID = os.environ.get('RECORDING_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.get_recording(RECORDING_ID) 21 | -------------------------------------------------------------------------------- /meetings/get-room.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | ROOM_ID = os.environ.get('ROOM_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.get_room(ROOM_ID) 21 | -------------------------------------------------------------------------------- /meetings/get-theme.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | THEME_ID = os.environ.get('THEME_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.get_theme(THEME_ID) 21 | -------------------------------------------------------------------------------- /meetings/list-dial-in-numbers.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | 12 | import vonage 13 | 14 | client = vonage.Client( 15 | application_id=VONAGE_APPLICATION_ID, 16 | private_key=VONAGE_PRIVATE_KEY, 17 | ) 18 | 19 | response = client.meetings.list_dial_in_numbers() 20 | -------------------------------------------------------------------------------- /meetings/list-recordings.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | SESSION_ID = os.environ.get('SESSION_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.get_session_recordings(SESSION_ID) 21 | -------------------------------------------------------------------------------- /meetings/list-rooms-by-theme.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | THEME_ID = os.environ.get('THEME_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.list_rooms_with_theme_id(THEME_ID) 21 | -------------------------------------------------------------------------------- /meetings/list-rooms.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | 12 | import vonage 13 | 14 | client = vonage.Client( 15 | application_id=VONAGE_APPLICATION_ID, 16 | private_key=VONAGE_PRIVATE_KEY, 17 | ) 18 | 19 | response = client.meetings.list_rooms() 20 | -------------------------------------------------------------------------------- /meetings/list-themes.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | 12 | import vonage 13 | 14 | client = vonage.Client( 15 | application_id=VONAGE_APPLICATION_ID, 16 | private_key=VONAGE_PRIVATE_KEY, 17 | ) 18 | 19 | response = client.meetings.list_themes() 20 | -------------------------------------------------------------------------------- /meetings/update-application.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | THEME_ID = os.environ.get('THEME_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.update_application_theme(THEME_ID) 21 | -------------------------------------------------------------------------------- /meetings/update-room.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | ROOM_ID = os.environ.get('ROOM_ID') 12 | THEME_ID = os.environ.get('THEME_ID') 13 | 14 | import vonage 15 | 16 | client = vonage.Client( 17 | application_id=VONAGE_APPLICATION_ID, 18 | private_key=VONAGE_PRIVATE_KEY, 19 | ) 20 | 21 | params = {'update_details': {'theme_id': THEME_ID}} 22 | response = client.meetings.update_room(ROOM_ID, params) 23 | -------------------------------------------------------------------------------- /meetings/update-theme.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | THEME_ID = os.environ.get('THEME_ID') 12 | MAIN_COLOR = os.environ.get('MAIN_COLOR') 13 | BRAND_TEXT = os.environ.get('BRAND_TEXT') 14 | 15 | import vonage 16 | 17 | client = vonage.Client( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | 22 | response = client.meetings.update_theme( 23 | THEME_ID, 24 | { 25 | 'main_color': MAIN_COLOR, 26 | 'brand_text': BRAND_TEXT, 27 | }, 28 | ) 29 | -------------------------------------------------------------------------------- /meetings/upload-logo-to-theme.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | THEME_ID = os.environ.get('THEME_ID') 12 | 13 | import vonage 14 | 15 | client = vonage.Client( 16 | application_id=VONAGE_APPLICATION_ID, 17 | private_key=VONAGE_PRIVATE_KEY, 18 | ) 19 | 20 | response = client.meetings.upload_logo_to_theme( 21 | theme_id=THEME_ID, 22 | path_to_image='path/to/my_image.png', 23 | logo_type='favicon', 24 | ) 25 | -------------------------------------------------------------------------------- /messages/inbound-message.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import FastAPI, Request 4 | 5 | app = FastAPI() 6 | 7 | 8 | @app.post('/webhooks/inbound-message') 9 | async def inbound_message(request: Request): 10 | data = await request.json() 11 | pprint(data) 12 | -------------------------------------------------------------------------------- /messages/message-status.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import FastAPI, Request, status 4 | 5 | app = FastAPI() 6 | 7 | 8 | @app.post('/webhooks/message-status', status_code=status.HTTP_200_OK) 9 | async def message_status(request: Request): 10 | data = await request.json() 11 | pprint(data) 12 | -------------------------------------------------------------------------------- /messages/messenger/send-audio.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSENGER_RECIPIENT_ID = os.environ.get("MESSENGER_RECIPIENT_ID") 13 | MESSENGER_SENDER_ID = os.environ.get("MESSENGER_SENDER_ID") 14 | MESSAGES_AUDIO_URL = os.environ.get("MESSAGES_AUDIO_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import MessengerAudio, MessengerResource 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = MessengerAudio( 27 | to=MESSENGER_RECIPIENT_ID, 28 | from_=MESSENGER_SENDER_ID, 29 | audio=MessengerResource(url=MESSAGES_AUDIO_URL), 30 | ) 31 | 32 | response = client.messages.send(message) 33 | print(response) 34 | -------------------------------------------------------------------------------- /messages/messenger/send-file.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSENGER_RECIPIENT_ID = os.environ.get("MESSENGER_RECIPIENT_ID") 13 | MESSENGER_SENDER_ID = os.environ.get("MESSENGER_SENDER_ID") 14 | MESSAGES_FILE_URL = os.environ.get("MESSAGES_FILE_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import MessengerFile, MessengerResource 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = MessengerFile( 27 | to=MESSENGER_RECIPIENT_ID, 28 | from_=MESSENGER_SENDER_ID, 29 | file=MessengerResource(url=MESSAGES_FILE_URL), 30 | ) 31 | 32 | response = client.messages.send(message) 33 | print(response) 34 | -------------------------------------------------------------------------------- /messages/messenger/send-image.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSENGER_RECIPIENT_ID = os.environ.get("MESSENGER_RECIPIENT_ID") 13 | MESSENGER_SENDER_ID = os.environ.get("MESSENGER_SENDER_ID") 14 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import MessengerImage, MessengerResource 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = MessengerImage( 27 | to=MESSENGER_RECIPIENT_ID, 28 | from_=MESSENGER_SENDER_ID, 29 | image=MessengerResource(url=MESSAGES_IMAGE_URL), 30 | ) 31 | 32 | response = client.messages.send(message) 33 | print(response) 34 | -------------------------------------------------------------------------------- /messages/messenger/send-text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSENGER_RECIPIENT_ID = os.environ.get("MESSENGER_RECIPIENT_ID") 13 | MESSENGER_SENDER_ID = os.environ.get("MESSENGER_SENDER_ID") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import MessengerText 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = MessengerText( 26 | to=MESSENGER_RECIPIENT_ID, 27 | from_=MESSENGER_SENDER_ID, 28 | text='Hello from the Vonage Messages API.', 29 | ) 30 | try: 31 | response = client.messages.send(message) 32 | print(response) 33 | except Exception as e: 34 | print(e) 35 | print(client.http_client.last_request.url) 36 | -------------------------------------------------------------------------------- /messages/messenger/send-video.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSENGER_RECIPIENT_ID = os.environ.get("MESSENGER_RECIPIENT_ID") 12 | MESSENGER_SENDER_ID = os.environ.get("MESSENGER_SENDER_ID") 13 | MESSAGES_VIDEO_URL = os.environ.get("MESSAGES_VIDEO_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import MessengerResource, MessengerVideo 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = MessengerVideo( 26 | to=MESSENGER_RECIPIENT_ID, 27 | from_=MESSENGER_SENDER_ID, 28 | video=MessengerResource(url=MESSAGES_VIDEO_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/mms/send-audio.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | MMS_SENDER_ID = os.environ.get("MMS_SENDER_ID") 13 | MESSAGES_AUDIO_URL = os.environ.get("MESSAGES_AUDIO_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import MmsAudio, MmsResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = MmsAudio( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=MMS_SENDER_ID, 28 | audio=MmsResource(url=MESSAGES_AUDIO_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/mms/send-image.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | MMS_SENDER_ID = os.environ.get("MMS_SENDER_ID") 13 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import MmsImage, MmsResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = MmsImage( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=MMS_SENDER_ID, 28 | image=MmsResource(url=MESSAGES_IMAGE_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/mms/send-vcard.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | MMS_SENDER_ID = os.environ.get("MMS_SENDER_ID") 13 | MESSAGES_VCARD_URL = os.environ.get("MESSAGES_VCARD_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import MmsResource, MmsVcard 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = MmsVcard( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=MMS_SENDER_ID, 28 | vcard=MmsResource(url=MESSAGES_VCARD_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/mms/send-video.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | MMS_SENDER_ID = os.environ.get("MMS_SENDER_ID") 13 | MESSAGES_VIDEO_URL = os.environ.get("MESSAGES_VIDEO_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import MmsResource, MmsVideo 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = MmsVideo( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=MMS_SENDER_ID, 28 | video=MmsResource(url=MESSAGES_VIDEO_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/rcs/revoke-message.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | GEOSPECIFIC_VONAGE_API_HOST = os.environ.get("GEOSPECIFIC_VONAGE_API_HOST") 12 | MESSAGES_MESSAGE_ID = os.environ.get("MESSAGES_MESSAGE_ID") 13 | 14 | from vonage import Auth, Vonage 15 | 16 | client = Vonage( 17 | auth=Auth( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | ) 22 | 23 | response = client.messages.revoke_rcs_message(MESSAGES_MESSAGE_ID) 24 | print(response) 25 | -------------------------------------------------------------------------------- /messages/rcs/send-file.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | MESSAGES_FILE_URL = os.environ.get("MESSAGES_FILE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import RcsFile, RcsResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = RcsFile( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=RCS_SENDER_ID, 28 | file=RcsResource(url=MESSAGES_FILE_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/rcs/send-image.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import RcsImage, RcsResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = RcsImage( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=RCS_SENDER_ID, 28 | image=RcsResource(url=MESSAGES_IMAGE_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/rcs/send-rich-card-carousel.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 14 | MESSAGES_VIDEO_URL = os.environ.get("MESSAGES_VIDEO_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import RcsCustom 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | custom_dict = { 27 | "contentMessage": { 28 | "richCard": { 29 | "carouselCard": { 30 | "cardWidth": "MEDIUM", 31 | "cardContents": [ 32 | { 33 | "title": "Option 1: Photo", 34 | "description": "Do you prefer this photo?", 35 | "suggestions": [ 36 | { 37 | "reply": { 38 | "text": "Option 1", 39 | "postbackData": "card_1", 40 | } 41 | } 42 | ], 43 | "media": { 44 | "height": "MEDIUM", 45 | "contentInfo": { 46 | "fileUrl": MESSAGES_IMAGE_URL, 47 | "forceRefresh": "false", 48 | }, 49 | }, 50 | }, 51 | { 52 | "title": "Option 2: Video", 53 | "description": "Or this video?", 54 | "suggestions": [ 55 | { 56 | "reply": { 57 | "text": "Option 2", 58 | "postbackData": "card_2", 59 | } 60 | } 61 | ], 62 | "media": { 63 | "height": "MEDIUM", 64 | "contentInfo": { 65 | "fileUrl": MESSAGES_VIDEO_URL, 66 | "forceRefresh": "false", 67 | }, 68 | }, 69 | }, 70 | ], 71 | } 72 | } 73 | } 74 | } 75 | 76 | message = RcsCustom( 77 | to=MESSAGES_TO_NUMBER, 78 | from_=RCS_SENDER_ID, 79 | custom=custom_dict, 80 | ) 81 | 82 | response = client.messages.send(message) 83 | print(response) 84 | -------------------------------------------------------------------------------- /messages/rcs/send-rich-card-standalone.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import RcsCustom 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | custom_dict = { 26 | "contentMessage": { 27 | "richCard": { 28 | "standaloneCard": { 29 | "thumbnailImageAlignment": "RIGHT", 30 | "cardOrientation": "VERTICAL", 31 | "cardContent": { 32 | "title": "Quick question", 33 | "description": "Do you like this picture?", 34 | "media": { 35 | "height": "TALL", 36 | "contentInfo": { 37 | "fileUrl": MESSAGES_IMAGE_URL, 38 | "forceRefresh": "false", 39 | }, 40 | }, 41 | "suggestions": [ 42 | { 43 | "reply": { 44 | "text": "Yes", 45 | "postbackData": "suggestion_1", 46 | } 47 | }, 48 | { 49 | "reply": { 50 | "text": "I love it!", 51 | "postbackData": "suggestion_2", 52 | } 53 | }, 54 | ], 55 | }, 56 | } 57 | } 58 | } 59 | } 60 | 61 | message = RcsCustom( 62 | to=MESSAGES_TO_NUMBER, 63 | from_=RCS_SENDER_ID, 64 | custom=custom_dict, 65 | ) 66 | 67 | response = client.messages.send(message) 68 | print(response) 69 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-action-create-calendar-event.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "Product Launch: Save the date!", 27 | "suggestions": [ 28 | { 29 | "action": { 30 | "text": "Save to calendar", 31 | "postbackData": "postback_data_1234", 32 | "fallbackUrl": "https://www.google.com/calendar", 33 | "createCalendarEventAction": { 34 | "startTime": "2024-06-28T19:00:00Z", 35 | "endTime": "2024-06-28T20:00:00Z", 36 | "title": "Vonage API Product Launch", 37 | "description": "Event to demo Vonage\'s new and exciting API product", 38 | }, 39 | } 40 | } 41 | ], 42 | } 43 | } 44 | message = RcsCustom( 45 | to=MESSAGES_TO_NUMBER, 46 | from_=RCS_SENDER_ID, 47 | custom=custom_dict, 48 | ) 49 | 50 | response = client.messages.send(message) 51 | print(response) 52 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-action-dial.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "Call us to claim your free gift!", 27 | "suggestions": [ 28 | { 29 | "action": { 30 | "text": "Call now!", 31 | "postbackData": "postback_data_1234", 32 | "fallbackUrl": "https://www.example.com/contact/", 33 | "dialAction": {"phoneNumber": "+447900000000"}, 34 | } 35 | } 36 | ], 37 | } 38 | } 39 | 40 | message = RcsCustom( 41 | to=MESSAGES_TO_NUMBER, 42 | from_=RCS_SENDER_ID, 43 | custom=custom_dict, 44 | ) 45 | 46 | response = client.messages.send(message) 47 | print(response) 48 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-action-multiple.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "Need some help? Call us now or visit our website for more information.", 27 | "suggestions": [ 28 | { 29 | "action": { 30 | "text": "Call us", 31 | "postbackData": "postback_data_1234", 32 | "fallbackUrl": "https://www.example.com/contact/", 33 | "dialAction": {"phoneNumber": "+447900000000"}, 34 | } 35 | }, 36 | { 37 | "action": { 38 | "text": "Visit site", 39 | "postbackData": "postback_data_1234", 40 | "openUrlAction": {"url": "http://example.com/"}, 41 | } 42 | }, 43 | ], 44 | } 45 | } 46 | 47 | message = RcsCustom( 48 | to=MESSAGES_TO_NUMBER, 49 | from_=RCS_SENDER_ID, 50 | custom=custom_dict, 51 | ) 52 | 53 | response = client.messages.send(message) 54 | print(response) 55 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-action-open-url.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "Check out our latest offers!", 27 | "suggestions": [ 28 | { 29 | "action": { 30 | "text": "Open product page", 31 | "postbackData": "postback_data_1234", 32 | "openUrlAction": {"url": "http://example.com/"}, 33 | } 34 | } 35 | ], 36 | } 37 | } 38 | 39 | message = RcsCustom( 40 | to=MESSAGES_TO_NUMBER, 41 | from_=RCS_SENDER_ID, 42 | custom=custom_dict, 43 | ) 44 | 45 | response = client.messages.send(message) 46 | print(response) 47 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-action-share-location.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "Your driver will come and meet you at your specified location.", 27 | "suggestions": [ 28 | { 29 | "action": { 30 | "text": "Share a location", 31 | "postbackData": "postback_data_1234", 32 | "shareLocationAction": {}, 33 | } 34 | } 35 | ], 36 | } 37 | } 38 | 39 | 40 | message = RcsCustom( 41 | to=MESSAGES_TO_NUMBER, 42 | from_=RCS_SENDER_ID, 43 | custom=custom_dict, 44 | ) 45 | 46 | response = client.messages.send(message) 47 | print(response) 48 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-action-view-location.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "Drop by our office!", 27 | "suggestions": [ 28 | { 29 | "action": { 30 | "text": "View map", 31 | "postbackData": "postback_data_1234", 32 | "fallbackUrl": "https://www.google.com/maps/place/Vonage/@51.5230371,-0.0852492,15z", 33 | "viewLocationAction": { 34 | "latLong": { 35 | "latitude": "51.5230371", 36 | "longitude": "-0.0852492", 37 | }, 38 | "label": "Vonage London Office", 39 | }, 40 | } 41 | } 42 | ], 43 | } 44 | } 45 | 46 | 47 | message = RcsCustom( 48 | to=MESSAGES_TO_NUMBER, 49 | from_=RCS_SENDER_ID, 50 | custom=custom_dict, 51 | ) 52 | 53 | response = client.messages.send(message) 54 | print(response) 55 | -------------------------------------------------------------------------------- /messages/rcs/send-suggested-reply.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | custom_dict = { 25 | "contentMessage": { 26 | "text": "What do you think of Vonage APIs?", 27 | "suggestions": [ 28 | { 29 | "reply": { 30 | "text": "They\'re great!", 31 | "postbackData": "suggestion_1", 32 | } 33 | }, 34 | { 35 | "reply": { 36 | "text": "They\'re awesome!", 37 | "postbackData": "suggestion_2", 38 | } 39 | }, 40 | ], 41 | } 42 | } 43 | 44 | message = RcsCustom( 45 | to=MESSAGES_TO_NUMBER, 46 | from_=RCS_SENDER_ID, 47 | custom=custom_dict, 48 | ) 49 | 50 | response = client.messages.send(message) 51 | print(response) 52 | -------------------------------------------------------------------------------- /messages/rcs/send-text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import RcsText 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | message = RcsText( 25 | to=MESSAGES_TO_NUMBER, 26 | from_=RCS_SENDER_ID, 27 | text="This is an RCS message sent via the Vonage Messages API.", 28 | ) 29 | 30 | response = client.messages.send(message) 31 | print(response) 32 | -------------------------------------------------------------------------------- /messages/rcs/send-video.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | RCS_SENDER_ID = os.environ.get("RCS_SENDER_ID") 13 | MESSAGES_VIDEO_URL = os.environ.get("MESSAGES_VIDEO_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import RcsResource, RcsVideo 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = RcsVideo( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=RCS_SENDER_ID, 28 | video=RcsResource(url=MESSAGES_VIDEO_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/sandbox/messenger/send_text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSAGES_SANDBOX_HOST = os.environ.get("MESSAGES_SANDBOX_HOST") 13 | MESSENGER_RECIPIENT_ID = os.environ.get("MESSENGER_RECIPIENT_ID") 14 | MESSENGER_SENDER_ID = os.environ.get("MESSENGER_SENDER_ID") 15 | 16 | from vonage import Auth, HttpClientOptions, Vonage 17 | from vonage_messages import MessengerText 18 | 19 | client = Vonage( 20 | auth=Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ), 24 | http_client_options=HttpClientOptions(api_host=MESSAGES_SANDBOX_HOST), 25 | ) 26 | 27 | message = MessengerText( 28 | to=MESSENGER_RECIPIENT_ID, 29 | from_=MESSENGER_SENDER_ID, 30 | text="This is a Facebook Messenger text message sent using the Vonage Messages API via the Messages Sandbox", 31 | ) 32 | 33 | response = client.messages.send(message) 34 | print(response) 35 | -------------------------------------------------------------------------------- /messages/sandbox/viber/send_text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSAGES_SANDBOX_HOST = os.environ.get("MESSAGES_SANDBOX_HOST") 13 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 14 | VIBER_SENDER_ID = os.environ.get("VIBER_SENDER_ID") 15 | 16 | from vonage import Auth, HttpClientOptions, Vonage 17 | from vonage_messages import ViberText 18 | 19 | client = Vonage( 20 | auth=Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ), 24 | http_client_options=HttpClientOptions(api_host=MESSAGES_SANDBOX_HOST), 25 | ) 26 | 27 | message = ViberText( 28 | to=MESSAGES_TO_NUMBER, 29 | from_=VIBER_SENDER_ID, 30 | text="This is a Viber Service Message text message sent using the Messages API via the Messages Sandbox", 31 | ) 32 | 33 | response = client.messages.send(message) 34 | print(response) 35 | -------------------------------------------------------------------------------- /messages/sandbox/whatsapp/send_text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | MESSAGES_SANDBOX_HOST = os.environ.get("MESSAGES_SANDBOX_HOST") 13 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 14 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 15 | 16 | from vonage import Auth, HttpClientOptions, Vonage 17 | from vonage_messages import WhatsappText 18 | 19 | client = Vonage( 20 | auth=Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ), 24 | http_client_options=HttpClientOptions(api_host=MESSAGES_SANDBOX_HOST), 25 | ) 26 | 27 | message = WhatsappText( 28 | to=MESSAGES_TO_NUMBER, 29 | from_=WHATSAPP_SENDER_ID, 30 | text="This is a WhatsApp text message sent using the Vonage Messages API via the Messages Sandbox", 31 | ) 32 | 33 | response = client.messages.send(message) 34 | print(response) 35 | -------------------------------------------------------------------------------- /messages/sms/send-sms.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | SMS_SENDER_ID = os.environ.get("SMS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import Sms 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | response = client.messages.send( 25 | Sms( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=SMS_SENDER_ID, 28 | text='This is an SMS sent using the Vonage Messages API.', 29 | ) 30 | ) 31 | print(response) 32 | -------------------------------------------------------------------------------- /messages/verify-signed-webhooks.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), '../.env') 8 | load_dotenv(envpath) 9 | 10 | 11 | VONAGE_SIGNATURE_SECRET = os.getenv('VONAGE_SIGNATURE_SECRET') 12 | 13 | from fastapi import FastAPI, Request 14 | from vonage_jwt.verify_jwt import verify_signature 15 | 16 | app = FastAPI() 17 | 18 | 19 | @app.get('/inbound') 20 | async def verify_signed_webhook(request: Request): 21 | # Need to get the JWT after "Bearer " in the authorization header 22 | auth_header = request.headers["authorization"].split() 23 | token = auth_header[1].strip() 24 | 25 | if verify_signature(token, VONAGE_SIGNATURE_SECRET): 26 | print('Valid signature') 27 | else: 28 | print('Invalid signature') 29 | -------------------------------------------------------------------------------- /messages/viber/send-file.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | VIBER_SENDER_ID = os.environ.get("VIBER_SENDER_ID") 13 | MESSAGES_FILE_URL = os.environ.get("MESSAGES_FILE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import ViberFile, ViberFileResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = ViberFile( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=VIBER_SENDER_ID, 28 | file=ViberFileResource(url=MESSAGES_FILE_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/viber/send-image.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | VIBER_SENDER_ID = os.environ.get("VIBER_SENDER_ID") 13 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import ViberImage, ViberImageResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = ViberImage( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=VIBER_SENDER_ID, 28 | image=ViberImageResource(url=MESSAGES_IMAGE_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/viber/send-text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | VIBER_SENDER_ID = os.environ.get("VIBER_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import ViberText 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | message = ViberText( 25 | to=MESSAGES_TO_NUMBER, 26 | from_=VIBER_SENDER_ID, 27 | text="This is a Viber message sent via the Vonage Messages API.", 28 | ) 29 | 30 | response = client.messages.send(message) 31 | print(response) 32 | -------------------------------------------------------------------------------- /messages/viber/send-video.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | VIBER_SENDER_ID = os.environ.get("VIBER_SENDER_ID") 13 | MESSAGES_VIDEO_URL = os.environ.get("MESSAGES_VIDEO_URL") 14 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 15 | MESSAGES_VIDEO_DURATION = os.environ.get("MESSAGES_VIDEO_DURATION") 16 | MESSAGES_VIDEO_FILE_SIZE = os.environ.get("MESSAGES_VIDEO_FILE_SIZE") 17 | 18 | from vonage import Auth, Vonage 19 | from vonage_messages import ViberVideo, ViberVideoOptions, ViberVideoResource 20 | 21 | client = Vonage( 22 | Auth( 23 | application_id=VONAGE_APPLICATION_ID, 24 | private_key=VONAGE_PRIVATE_KEY, 25 | ) 26 | ) 27 | 28 | message = ViberVideo( 29 | to=MESSAGES_TO_NUMBER, 30 | from_=VIBER_SENDER_ID, 31 | video=ViberVideoResource(url=MESSAGES_VIDEO_URL, thumb_url=MESSAGES_IMAGE_URL), 32 | viber_service=ViberVideoOptions( 33 | duration=MESSAGES_VIDEO_DURATION, 34 | file_size=MESSAGES_VIDEO_FILE_SIZE, 35 | ), 36 | ) 37 | 38 | response = client.messages.send(message) 39 | print(response) 40 | -------------------------------------------------------------------------------- /messages/webhook-server.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import FastAPI, Request, status 4 | 5 | app = FastAPI() 6 | 7 | 8 | @app.post('/webhooks/message-status', status_code=status.HTTP_200_OK) 9 | async def message_status(request: Request): 10 | data = await request.json() 11 | pprint(data) 12 | 13 | 14 | @app.post('/webhooks/inbound-message') 15 | async def inbound_message(request: Request): 16 | data = await request.json() 17 | pprint(data) 18 | -------------------------------------------------------------------------------- /messages/whatsapp/mark-as-read.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | GEOSPECIFIC_MESSAGES_API_URL = os.environ.get("GEOSPECIFIC_MESSAGES_API_URL") 12 | MESSAGES_MESSAGE_ID = os.environ.get("MESSAGES_MESSAGE_ID") 13 | 14 | from vonage import Auth, HttpClientOptions, Vonage 15 | 16 | client = Vonage( 17 | auth=Auth( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ), 21 | http_client_options=HttpClientOptions(api_host=GEOSPECIFIC_MESSAGES_API_URL), 22 | ) 23 | 24 | client.messages.mark_whatsapp_message_read("MESSAGES_MESSAGE_ID") 25 | -------------------------------------------------------------------------------- /messages/whatsapp/send-audio.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | MESSAGES_AUDIO_URL = os.environ.get("MESSAGES_AUDIO_URL") 14 | 15 | from vonage import Auth, HttpClientOptions, Vonage 16 | from vonage_messages import WhatsappAudio, WhatsappAudioResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ), 23 | http_client_options=HttpClientOptions(api_host='messages-sandbox.nexmo.com'), 24 | ) 25 | 26 | message = WhatsappAudio( 27 | to=MESSAGES_TO_NUMBER, 28 | from_=WHATSAPP_SENDER_ID, 29 | audio=WhatsappAudioResource(url=MESSAGES_AUDIO_URL, caption="Test audio file"), 30 | ) 31 | 32 | response = client.messages.send(message) 33 | print(response) 34 | -------------------------------------------------------------------------------- /messages/whatsapp/send-authentication-template.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_TEMPLATE_NAME = os.environ.get("WHATSAPP_TEMPLATE_NAME") 14 | WHATSAPP_OTP = os.environ.get("WHATSAPP_OTP") 15 | 16 | from vonage import Auth, HttpClientOptions, Vonage 17 | from vonage_messages import WhatsappCustom 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ), 24 | http_client_options=HttpClientOptions(api_host='messages-sandbox.nexmo.com'), 25 | ) 26 | 27 | message = WhatsappCustom( 28 | to=MESSAGES_TO_NUMBER, 29 | from_=WHATSAPP_SENDER_ID, 30 | custom={ 31 | "type": "template", 32 | "template": { 33 | "name": WHATSAPP_TEMPLATE_NAME, 34 | "language": {"policy": "deterministic", "code": "en"}, 35 | "components": [ 36 | {"type": "body", "parameters": [{"type": "text", "text": "'$OTP'"}]}, 37 | { 38 | "type": "button", 39 | "sub_type": "url", 40 | "index": "0", 41 | "parameters": [{"type": "text", "text": WHATSAPP_OTP}], 42 | }, 43 | ], 44 | }, 45 | }, 46 | ) 47 | 48 | response = client.messages.send(message) 49 | print(response) 50 | -------------------------------------------------------------------------------- /messages/whatsapp/send-button-link.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_TEMPLATE_NAME = os.environ.get("WHATSAPP_TEMPLATE_NAME") 14 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import WhatsappCustom 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = WhatsappCustom( 27 | to=MESSAGES_TO_NUMBER, 28 | from_=WHATSAPP_SENDER_ID, 29 | custom={ 30 | "type": "template", 31 | "template": { 32 | "name": WHATSAPP_TEMPLATE_NAME, 33 | "language": {"policy": "deterministic", "code": "en"}, 34 | "components": [ 35 | { 36 | "type": "header", 37 | "parameters": [ 38 | { 39 | "type": "image", 40 | "image": { 41 | "link": MESSAGES_IMAGE_URL, 42 | }, 43 | }, 44 | ], 45 | }, 46 | { 47 | "type": "body", 48 | "parameters": [ 49 | {"type": "text", "text": "Joe Bloggs"}, 50 | {"type": "text", "text": "AB123456"}, 51 | ], 52 | }, 53 | { 54 | "type": "button", 55 | "index": "0", 56 | "sub_type": "url", 57 | "parameters": [{"type": "text", "text": "AB123456"}], 58 | }, 59 | ], 60 | }, 61 | }, 62 | ) 63 | 64 | response = client.messages.send(message) 65 | print(response) 66 | -------------------------------------------------------------------------------- /messages/whatsapp/send-button-quick-reply.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_TEMPLATE_NAME = os.environ.get("WHATSAPP_TEMPLATE_NAME") 14 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import WhatsappCustom 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = WhatsappCustom( 27 | to=MESSAGES_TO_NUMBER, 28 | from_=WHATSAPP_SENDER_ID, 29 | custom={ 30 | "type": "template", 31 | "template": { 32 | "name": WHATSAPP_TEMPLATE_NAME, 33 | "language": {"policy": "deterministic", "code": "en"}, 34 | "components": [ 35 | { 36 | "type": "header", 37 | "parameters": [ 38 | { 39 | "type": "image", 40 | "image": { 41 | "link": MESSAGES_IMAGE_URL, 42 | }, 43 | }, 44 | ], 45 | }, 46 | { 47 | "type": "body", 48 | "parameters": [ 49 | { 50 | "type": "text", 51 | "parameter_name": "customer_name", 52 | "text": "Joe Bloggs", 53 | }, 54 | { 55 | "type": "text", 56 | "parameter_name": "dentist_name", 57 | "text": "Mr Smith", 58 | }, 59 | { 60 | "type": "text", 61 | "parameter_name": "appointment_date", 62 | "text": "2025-02-26", 63 | }, 64 | { 65 | "type": "text", 66 | "parameter_name": "appointment_location", 67 | "text": "ACME Dental Practice", 68 | }, 69 | ], 70 | }, 71 | { 72 | "type": "button", 73 | "sub_type": "quick_reply", 74 | "index": 0, 75 | "parameters": [{"type": "payload", "payload": "Yes-Button-Payload"}], 76 | }, 77 | { 78 | "type": "button", 79 | "sub_type": "quick_reply", 80 | "index": 1, 81 | "parameters": [{"type": "payload", "payload": "No-Button-Payload"}], 82 | }, 83 | ], 84 | }, 85 | }, 86 | ) 87 | 88 | response = client.messages.send(message) 89 | print(response) 90 | -------------------------------------------------------------------------------- /messages/whatsapp/send-contact.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import WhatsappCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | message = WhatsappCustom( 25 | to=MESSAGES_TO_NUMBER, 26 | from_=WHATSAPP_SENDER_ID, 27 | custom={ 28 | "type": "contacts", 29 | "contacts": [ 30 | { 31 | "addresses": [ 32 | { 33 | "city": "Menlo Park", 34 | "country": "United States", 35 | "country_code": "us", 36 | "state": "CA", 37 | "street": "1 Hacker Way", 38 | "type": "HOME", 39 | "zip": "94025", 40 | }, 41 | { 42 | "city": "Menlo Park", 43 | "country": "United States", 44 | "country_code": "us", 45 | "state": "CA", 46 | "street": "200 Jefferson Dr", 47 | "type": "WORK", 48 | "zip": "94025", 49 | }, 50 | ], 51 | "birthday": "2012-08-18", 52 | "emails": [ 53 | {"email": "test@fb.com", "type": "WORK"}, 54 | {"email": "test@whatsapp.com", "type": "WORK"}, 55 | ], 56 | "name": { 57 | "first_name": "John", 58 | "formatted_name": "John Smith", 59 | "last_name": "Smith", 60 | }, 61 | "org": { 62 | "company": "WhatsApp", 63 | "department": "Design", 64 | "title": "Manager", 65 | }, 66 | "phones": [ 67 | {"phone": "+1 (940) 555-1234", "type": "HOME"}, 68 | { 69 | "phone": "+1 (650) 555-1234", 70 | "type": "WORK", 71 | "wa_id": "16505551234", 72 | }, 73 | ], 74 | "urls": [{"url": "https://www.facebook.com", "type": "WORK"}], 75 | } 76 | ], 77 | }, 78 | ) 79 | 80 | response = client.messages.send(message) 81 | print(response) 82 | -------------------------------------------------------------------------------- /messages/whatsapp/send-file.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | MESSAGES_FILE_URL = os.environ.get("MESSAGES_FILE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import WhatsappFile, WhatsappFileResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = WhatsappFile( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=WHATSAPP_SENDER_ID, 28 | file=WhatsappFileResource(url=MESSAGES_FILE_URL, caption="Test file"), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/whatsapp/send-image.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import WhatsappImage, WhatsappImageResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = WhatsappImage( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=WHATSAPP_SENDER_ID, 28 | image=WhatsappImageResource(url=MESSAGES_IMAGE_URL, caption="Test image"), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/whatsapp/send-location.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import WhatsappCustom 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | message = WhatsappCustom( 25 | to=MESSAGES_TO_NUMBER, 26 | from_=WHATSAPP_SENDER_ID, 27 | custom={ 28 | "type": "location", 29 | "location": { 30 | "longitude": -122.425332, 31 | "latitude": 37.758056, 32 | "name": "Facebook HQ", 33 | "address": "1 Hacker Way, Menlo Park, CA 94025", 34 | }, 35 | }, 36 | ) 37 | 38 | response = client.messages.send(message) 39 | print(response) 40 | -------------------------------------------------------------------------------- /messages/whatsapp/send-media-template.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from re import M 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 13 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 14 | WHATSAPP_TEMPLATE_NAME = os.environ.get("WHATSAPP_TEMPLATE_NAME") 15 | MESSAGES_IMAGE_URL = os.environ.get("MESSAGES_IMAGE_URL") 16 | 17 | from vonage import Auth, Vonage 18 | from vonage_messages import WhatsappCustom 19 | 20 | client = Vonage( 21 | Auth( 22 | application_id=VONAGE_APPLICATION_ID, 23 | private_key=VONAGE_PRIVATE_KEY, 24 | ) 25 | ) 26 | 27 | message = WhatsappCustom( 28 | to=MESSAGES_TO_NUMBER, 29 | from_=WHATSAPP_SENDER_ID, 30 | custom={ 31 | "type": "template", 32 | "template": { 33 | "name": WHATSAPP_TEMPLATE_NAME, 34 | "language": {"policy": "deterministic", "code": "en"}, 35 | "components": [ 36 | { 37 | "type": "header", 38 | "parameters": [ 39 | { 40 | "type": "image", 41 | "image": { 42 | "link": MESSAGES_IMAGE_URL, 43 | }, 44 | }, 45 | ], 46 | }, 47 | { 48 | "type": "body", 49 | "parameters": [ 50 | {"type": "text", "text": "Joe Bloggs"}, 51 | {"type": "text", "text": "AB123456"}, 52 | ], 53 | }, 54 | ], 55 | }, 56 | }, 57 | ) 58 | 59 | response = client.messages.send(message) 60 | print(response) 61 | -------------------------------------------------------------------------------- /messages/whatsapp/send-product-message-multiple-item.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_CATALOG_ID = os.environ.get('WHATSAPP_CATALOG_ID') 14 | WHATSAPP_PRODUCT_ID_1 = os.environ.get('WHATSAPP_PRODUCT_ID_1') 15 | WHATSAPP_PRODUCT_ID_2 = os.environ.get('WHATSAPP_PRODUCT_ID_2') 16 | 17 | from vonage import Auth, Vonage 18 | from vonage_messages import WhatsappCustom 19 | 20 | client = Vonage( 21 | Auth( 22 | application_id=VONAGE_APPLICATION_ID, 23 | private_key=VONAGE_PRIVATE_KEY, 24 | ) 25 | ) 26 | 27 | message = WhatsappCustom( 28 | to=MESSAGES_TO_NUMBER, 29 | from_=WHATSAPP_SENDER_ID, 30 | custom={ 31 | 'type': 'interactive', 32 | 'interactive': { 33 | 'type': 'product_list', 34 | 'header': {'type': 'text', 'text': 'Our top products'}, 35 | 'body': {'text': 'Check out these great products'}, 36 | 'footer': {'text': 'Sale now on!'}, 37 | 'action': { 38 | 'catalog_id': WHATSAPP_CATALOG_ID, 39 | 'sections': [ 40 | { 41 | 'title': 'Cool products', 42 | 'product_items': [ 43 | {'WHATSAPP_PRODUCT_ID_1': WHATSAPP_PRODUCT_ID_1}, 44 | {'WHATSAPP_PRODUCT_ID_2': WHATSAPP_PRODUCT_ID_2}, 45 | ], 46 | }, 47 | { 48 | 'title': 'Awesome products', 49 | 'product_items': [ 50 | {'WHATSAPP_PRODUCT_ID_1': WHATSAPP_PRODUCT_ID_1} 51 | ], 52 | }, 53 | ], 54 | }, 55 | }, 56 | }, 57 | ) 58 | 59 | response = client.messages.send(message) 60 | print(response) 61 | -------------------------------------------------------------------------------- /messages/whatsapp/send-product-message-single-item.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_CATALOG_ID = os.environ.get('WHATSAPP_CATALOG_ID') 14 | WHATSAPP_PRODUCT_ID_1 = os.environ.get('WHATSAPP_PRODUCT_ID_1') 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_messages import WhatsappCustom 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = WhatsappCustom( 27 | to=MESSAGES_TO_NUMBER, 28 | from_=WHATSAPP_SENDER_ID, 29 | custom={ 30 | 'type': 'interactive', 31 | 'interactive': { 32 | 'type': 'product', 33 | 'body': {'text' 'Check out this cool product'}, 34 | 'footer': {'text': 'Sale now on!'}, 35 | 'action': { 36 | 'catalog_id': WHATSAPP_CATALOG_ID, 37 | 'product_retailer_id': WHATSAPP_PRODUCT_ID_1, 38 | }, 39 | }, 40 | }, 41 | ) 42 | 43 | response = client.messages.send(message) 44 | print(response) 45 | -------------------------------------------------------------------------------- /messages/whatsapp/send-sticker-by-id.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_STICKER_ID = os.environ.get("WHATSAPP_STICKER_ID") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import WhatsappSticker, WhatsappStickerId 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = WhatsappSticker( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=WHATSAPP_SENDER_ID, 28 | sticker=WhatsappStickerId(id=WHATSAPP_STICKER_ID), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/whatsapp/send-sticker-by-url.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_STICKER_URL = os.environ.get("WHATSAPP_STICKER_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import WhatsappSticker, WhatsappStickerUrl 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = WhatsappSticker( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=WHATSAPP_SENDER_ID, 28 | sticker=WhatsappStickerUrl(url=WHATSAPP_STICKER_URL), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /messages/whatsapp/send-template.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | WHATSAPP_TEMPLATE_NAME = os.environ.get("WHATSAPP_TEMPLATE_NAME") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import (WhatsappTemplate, WhatsappTemplateResource, 17 | WhatsappTemplateSettings) 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | message = WhatsappTemplate( 27 | to=MESSAGES_TO_NUMBER, 28 | from_=WHATSAPP_SENDER_ID, 29 | template=WhatsappTemplateResource( 30 | name=WHATSAPP_TEMPLATE_NAME, 31 | parameters=["Vonage Verification", "64873", "10"], 32 | ), 33 | whatsapp=WhatsappTemplateSettings( 34 | locale="en-GB", 35 | policy="deterministic", 36 | ), 37 | ) 38 | 39 | response = client.messages.send(message) 40 | print(response) 41 | -------------------------------------------------------------------------------- /messages/whatsapp/send-text.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_messages import WhatsappText 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | message = WhatsappText( 25 | to=MESSAGES_TO_NUMBER, 26 | from_=WHATSAPP_SENDER_ID, 27 | text='Hello from the Vonage Messages API.', 28 | ) 29 | 30 | response = client.messages.send(message) 31 | print(response) 32 | -------------------------------------------------------------------------------- /messages/whatsapp/send-video.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | MESSAGES_TO_NUMBER = os.environ.get("MESSAGES_TO_NUMBER") 12 | WHATSAPP_SENDER_ID = os.environ.get("WHATSAPP_SENDER_ID") 13 | MESSAGES_VIDEO_URL = os.environ.get("MESSAGES_VIDEO_URL") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_messages import WhatsappVideo, WhatsappVideoResource 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | message = WhatsappVideo( 26 | to=MESSAGES_TO_NUMBER, 27 | from_=WHATSAPP_SENDER_ID, 28 | video=WhatsappVideoResource(url=MESSAGES_VIDEO_URL, caption="Test video file"), 29 | ) 30 | 31 | response = client.messages.send(message) 32 | print(response) 33 | -------------------------------------------------------------------------------- /number-insight-v2/get-fraud-score.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | INSIGHT_NUMBER = os.getenv('INSIGHT_NUMBER') 13 | 14 | from vonage import Client 15 | 16 | client = Client(key=VONAGE_API_KEY, secret=VONAGE_API_SECRET) 17 | 18 | insight_response = client.number_insight_v2.fraud_check(INSIGHT_NUMBER, 'fraud_score') 19 | pprint(insight_response) 20 | -------------------------------------------------------------------------------- /number-insight-v2/get-sim-swap-status.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | INSIGHT_NUMBER = os.getenv('INSIGHT_NUMBER') 13 | 14 | from vonage import Client 15 | 16 | client = Client(key=VONAGE_API_KEY, secret=VONAGE_API_SECRET) 17 | 18 | insight_response = client.number_insight_v2.fraud_check(INSIGHT_NUMBER, 'sim_swap') 19 | pprint(insight_response) 20 | -------------------------------------------------------------------------------- /number-insight/async-callback/README.md: -------------------------------------------------------------------------------- 1 | # Verifying Signed Webhooks Demo 2 | 3 | This quick demo shows how to recieve an incoming Number Insight webhook. 4 | 5 | ## Usage 6 | 7 | You may want to use a localhost tunnel agent such as [ngrok](https://ngrok.com/) for local testing. 8 | 9 | ### Set Up Your Environment 10 | 11 | Install dependencies with `pip` in a virtual environment: 12 | 13 | ```bash 14 | python3 -m venv venv 15 | . ./venv/bin/activate 16 | 17 | # Point to the requirements file in the root of the python-code-snippets repo 18 | pip install -r requirements.txt 19 | ``` 20 | 21 | ### Start Your Localhost Tunnel 22 | 23 | Start ngrok with `ngrok http 8000`. ngrok will give you a forwarding address you can now use to recieve event webhooks. 24 | 25 | ### Start the FastAPI Server 26 | 27 | Run the FastAPI server with 28 | 29 | ```bash 30 | fastapi dev number-insight/async-callback/main.py 31 | ``` 32 | 33 | ### Trigger the Lookup 34 | 35 | 1. Edit the `ni-advanced-async-trigger.py` script to add the number to return insights for. 36 | 1. Add your ngrok URL as the callback to the `number_insight.get_advanced_info_async` method. 37 | 1. Run the trigger script with: 38 | 39 | python ni-advanced-async-trigger.py 40 | 41 | The output of the webhook should appear in the console output of the FastAPI application. -------------------------------------------------------------------------------- /number-insight/async-callback/main.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI, Request 2 | 3 | app = FastAPI() 4 | 5 | 6 | @app.post('/webhooks/insight') 7 | async def display_advanced_number_insight_info(request: Request): 8 | data = await request.json() 9 | print(data) 10 | -------------------------------------------------------------------------------- /number-insight/ni-advanced-async-trigger.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | INSIGHT_NUMBER = os.getenv('INSIGHT_NUMBER') 13 | INSIGHT_CALLBACK_URL = os.getenv('INSIGHT_CALLBACK_URL') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_number_insight import (AdvancedAsyncInsightRequest, 17 | AdvancedAsyncInsightResponse) 18 | 19 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 20 | 21 | insight: AdvancedAsyncInsightResponse = client.number_insight.get_advanced_info_async( 22 | AdvancedAsyncInsightRequest(number=INSIGHT_NUMBER, callback=INSIGHT_CALLBACK_URL) 23 | ) 24 | pprint(insight) 25 | -------------------------------------------------------------------------------- /number-insight/ni-advanced.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | INSIGHT_NUMBER = os.getenv('INSIGHT_NUMBER') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_number_insight import (AdvancedSyncInsightRequest, 16 | AdvancedSyncInsightResponse) 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | insight: AdvancedSyncInsightResponse = client.number_insight.get_advanced_info_sync( 21 | AdvancedSyncInsightRequest(number=INSIGHT_NUMBER) 22 | ) 23 | pprint(insight) 24 | -------------------------------------------------------------------------------- /number-insight/ni-basic.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | INSIGHT_NUMBER = os.getenv('INSIGHT_NUMBER') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_number_insight import BasicInsightRequest, BasicInsightResponse 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | insight: BasicInsightResponse = client.number_insight.get_basic_info( 20 | BasicInsightRequest(number=INSIGHT_NUMBER) 21 | ) 22 | pprint(insight) 23 | -------------------------------------------------------------------------------- /number-insight/ni-standard.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | INSIGHT_NUMBER = os.getenv('INSIGHT_NUMBER') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_number_insight import (StandardInsightRequest, 16 | StandardInsightResponse) 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | insight: StandardInsightResponse = client.number_insight.get_standard_info( 21 | StandardInsightRequest(number=INSIGHT_NUMBER) 22 | ) 23 | pprint(insight) 24 | -------------------------------------------------------------------------------- /numbers/buy.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | NUMBER_MSISDN = os.getenv("NUMBER_MSISDN") 12 | NUMBER_COUNTRY_CODE = os.getenv("NUMBER_COUNTRY_CODE") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_numbers import NumberParams, NumbersStatus 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | status: NumbersStatus = client.numbers.buy_number( 20 | params=NumberParams( 21 | country=NUMBER_COUNTRY_CODE, 22 | msisdn=NUMBER_MSISDN, 23 | ) 24 | ) 25 | 26 | print(status.model_dump()) 27 | -------------------------------------------------------------------------------- /numbers/cancel.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | NUMBER_MSISDN = os.getenv("NUMBER_MSISDN") 12 | NUMBER_COUNTRY_CODE = os.getenv("NUMBER_COUNTRY_CODE") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_numbers import NumberParams, NumbersStatus 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | status: NumbersStatus = client.numbers.cancel_number( 20 | NumberParams(country=NUMBER_COUNTRY_CODE, msisdn=NUMBER_MSISDN) 21 | ) 22 | 23 | print(status.model_dump()) 24 | -------------------------------------------------------------------------------- /numbers/list.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 11 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 12 | NUMBER_SEARCH_CRITERIA = os.getenv("NUMBER_SEARCH_CRITERIA") 13 | NUMBER_SEARCH_PATTERN = os.getenv("NUMBER_SEARCH_PATTERN") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_numbers import ListOwnedNumbersFilter 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | numbers, count, next = client.numbers.list_owned_numbers( 21 | ListOwnedNumbersFilter( 22 | pattern=NUMBER_SEARCH_CRITERIA, search_pattern=NUMBER_SEARCH_PATTERN 23 | ) 24 | ) 25 | 26 | pprint(numbers) 27 | print(count) 28 | print(next) 29 | -------------------------------------------------------------------------------- /numbers/search.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 11 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 12 | NUMBER_COUNTRY_CODE = os.getenv("NUMBER_COUNTRY_CODE") 13 | NUMBER_TYPE = os.getenv("NUMBER_TYPE") 14 | NUMBER_FEATURES = os.getenv("NUMBER_FEATURES") 15 | NUMBER_SEARCH_CRITERIA = os.getenv("NUMBER_SEARCH_CRITERIA") 16 | NUMBER_SEARCH_PATTERN = os.getenv("NUMBER_SEARCH_PATTERN") 17 | 18 | from vonage import Auth, Vonage 19 | from vonage_numbers import SearchAvailableNumbersFilter 20 | 21 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 22 | 23 | numbers, count, next = client.numbers.search_available_numbers( 24 | SearchAvailableNumbersFilter( 25 | country=NUMBER_COUNTRY_CODE, 26 | size=3, 27 | pattern=NUMBER_SEARCH_CRITERIA, 28 | search_pattern=NUMBER_SEARCH_PATTERN, 29 | type=NUMBER_TYPE, 30 | features=NUMBER_FEATURES, 31 | ) 32 | ) 33 | pprint(numbers) 34 | print(count) 35 | print(next) 36 | 37 | for number in numbers: 38 | print(f'Tel: {number.msisdn} Cost: {number.cost}') 39 | -------------------------------------------------------------------------------- /numbers/update.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | NUMBER_COUNTRY_CODE = os.getenv("NUMBER_COUNTRY_CODE") 12 | NUMBER_MSISDN = os.getenv("NUMBER_MSISDN") 13 | NUMBER_SMS_CALLBACK_URL = os.getenv("NUMBER_SMS_CALLBACK_URL") 14 | NUMBER_VOICE_CALLBACK_URL = os.getenv("NUMBER_VOICE_CALLBACK_URL") 15 | NUMBER_VOICE_STATUS_CALLBACK_URL = os.getenv("NUMBER_VOICE_STATUS_CALLBACK_URL") 16 | 17 | from vonage import Auth, Vonage 18 | from vonage_numbers import NumbersStatus, UpdateNumberParams 19 | 20 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 21 | 22 | status: NumbersStatus = client.numbers.update_number( 23 | UpdateNumberParams( 24 | country=NUMBER_COUNTRY_CODE, 25 | msisdn=NUMBER_MSISDN, 26 | app_id='vonage-application-id', 27 | mo_http_url=NUMBER_SMS_CALLBACK_URL, 28 | mo_smpp_sytem_type='inbound', 29 | voice_callback_value=NUMBER_VOICE_CALLBACK_URL, 30 | voice_status_callback=NUMBER_VOICE_STATUS_CALLBACK_URL, 31 | ) 32 | ) 33 | 34 | print(status.model_dump()) 35 | -------------------------------------------------------------------------------- /readme-base.md: -------------------------------------------------------------------------------- 1 | # Vonage Code Snippets for Python 2 | 3 | ![Author](https://img.shields.io/badge/author-Vonage-orange) 4 | ![Issues](https://img.shields.io/github/issues/Vonage/vonage-python-code-snippets) 5 | ![License](https://img.shields.io/github/license/Vonage/vonage-python-code-snippets) 6 | ![Stars](https://img.shields.io/github/stars/Vonage/vonage-python-code-snippets) 7 | ![Forks](https://img.shields.io/github/forks/Vonage/vonage-python-code-snippets) 8 | ![Last Commit](https://img.shields.io/github/last-commit/Vonage/vonage-python-code-snippets) 9 | ![Size](https://img.shields.io/github/repo-size/Vonage/vonage-python-code-snippets) 10 | 11 | The purpose of these Code Snippets is to provide simple examples focused 12 | on one goal. For example, sending an SMS, creating a Vonage Video API session, handling an incoming webhook, or making a Text-to-Speech call. 13 | 14 | ## Table of Contents 15 | 16 | - [Setup](#setup) 17 | - [Running the Examples](#running-the-examples) 18 | - [SDK Structure](#sdk-structure) 19 | - [How the SDK Handles Errors](#how-the-sdk-handles-errors) 20 | - [Troubleshooting](#troubleshooting) 21 | - [Useful Resources](#useful-resources) 22 | - [Request an Example](#request-an-example) 23 | - [License](#license) 24 | - [Python Code Snippets](#python-code-snippets) 25 | 26 | ## Setup 27 | 28 | These code samples are meant to be embedded into pages on [https://developer.vonage.com/](https://developer.vonage.com/). Developers are free to use these code snippets as a reference, but these may require changes to be worked into your specific application. We recommend checking out the [Vonage Developer Website](https://developer.vonage.com/), which displays these code snippets in a more copy/paste fashion. 29 | 30 | To use the examples, you will first need a [Vonage account][sign-up]. Then rename 31 | the `.env.dist` file to `.env` and set the values as required. 32 | 33 | For some of the examples you will need to [buy a number][buy-number]. 34 | 35 | ## Running the Examples 36 | 37 | If you would like to run these examples yourself, you will need to do the following: 38 | 39 | Use a virtual environment: 40 | 41 | ```sh 42 | # Create the virtual environment 43 | python3 -m venv venv 44 | 45 | # Activate the virtual environment in Mac/Linux 46 | . ./venv/bin/activate 47 | 48 | # Or on Windows Command Prompt 49 | venv\Scripts\activate 50 | ``` 51 | 52 | Install the dependencies: 53 | 54 | ```sh 55 | pip install -r requirements.txt 56 | ``` 57 | 58 | Run the code: 59 | 60 | For samples that don't use a web server, run with python, e.g. 61 | 62 | ```sh 63 | python sms/send-an-sms.py 64 | ``` 65 | 66 | For samples that require a web server, run with FastAPI, e.g. 67 | 68 | ```sh 69 | fastapi dev messages/inbound-message.py 70 | ``` 71 | 72 | ## SDK Structure 73 | 74 | The SDK is a monorepo - lots of packages in a single place. In the SDK, we have: 75 | 76 | 1. The top-level package `vonage`, which pulls in all the other packages you need. 77 | 1. A package referring to every API supported in the SDK (`vonage-sms`, `vonage-voice`, `vonage-video` etc.) 78 | 1. Internal packages for making HTTP requests, creating JWTs etc. (`vonage-http-client`, `vonage-jwt` etc.) 79 | 1. A utilities package (`vonage-utils`) 80 | 81 | There are important things to note: 82 | 83 | 1. The `vonage` package instantiates each of the API packages. For example, you can call `vonage.voice.any_method_from_the_voice_class`. This means you don’t have to instantiate packages that you need separately. 84 | 1. Many of the APIs require input data from the user. This is passed in through data models that you will find in the package for the specific API you want to call. This was intentional so the user doesn’t immediately import every data model from every single API whenever they import the top-level package, which would make it harder to find what is actually needed in an IDE, and allows for models with the same names in different namespaces. 85 | 86 | For example, to use a `VerifyRequest` object from the `vonage-verify` package, you’ll need to first import the `vonage` package to get the `Auth` object and the `Verify` methods, then import `VerifyRequest` from the `vonage-verify` package, like so: 87 | 88 | ```python 89 | from vonage import Auth, Vonage 90 | from vonage_verify import VerifyRequest, SmsChannel 91 | 92 | client = Vonage( 93 | Auth( 94 | application_id=VONAGE_APPLICATION_ID, 95 | private_key=VONAGE_APPLICATION_PRIVATE_KEY_PATH, 96 | ) 97 | ) 98 | 99 | verify_request = VerifyRequest( 100 | brand=BRAND_NAME, 101 | workflow=[ 102 | SmsChannel(to=TO_NUMBER), 103 | ], 104 | ) 105 | 106 | response = vonage_client.verify.start_verification(verify_request) 107 | ``` 108 | 109 | This is explained in more detail in the blog post shared above. You can also find full, working examples [in the Python Code Snippets repo](https://github.com/Vonage/vonage-python-code-snippets). 110 | 111 | ### Getting the Objects You Need Into Your Namespace 112 | 113 | If you’re working with e.g. the Voice API, if you know you’re likely to use many of the data models, you can import them all into your app’s namespace (making it easier for your autocomplete etc. to find them) with the `*` operator, e.g. 114 | 115 | ```python 116 | from vonage_voice import * 117 | 118 | request = CreateCallRequest(...) 119 | ``` 120 | 121 | It’s usually considered better practice to import just what you need, but using this method means the data models will all be available to you if you need to do some quick testing. 122 | 123 | ## How the SDK handles errors 124 | 125 | The Vonage Python SDK has various different classes of errors: 126 | 127 | - Some regular Python/package errors that can be raised during the course of SDK operation 128 | - The top-level `VonageError`, that custom SDK errors inherit from 129 | - Errors raised when using some packages, e.g. `VerifyError` 130 | - Errors raised by the HTTP client 131 | 132 | It’s likely that when troubleshooting, you’ll especially see HTTP request errors, so let’s discuss these. 133 | 134 | ### HTTP Request Errors 135 | 136 | This is a class of errors raised when actually making the HTTP request or when receiving an HTTP response. 137 | 138 | The high-level error here is the `HttpRequestError`. There are other errors which are based on this and have the same properties, but different names that are more specific to [the HTTP status code](https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) received from the Vonage server, e.g. an `AuthenticationError` or a `NotFoundError`. 139 | 140 | Each error of this type has properties that can be accessed when the error is caught, i.e. if you have a try-except block which catches an error, you can then access the error message and the response object which has additional information. This can be useful for debugging. 141 | 142 | To catch an error in this way, do this: 143 | 144 | ```python 145 | try: 146 | vonage_client.call_vonage_api(...) 147 | except HttpRequestError as e: 148 | print(‘Request failed:’) 149 | print(e.message) 150 | print(e.response.text) 151 | ``` 152 | 153 | You can access any information about the request or the response from the `e.response` object. 154 | 155 | ## Troubleshooting 156 | 157 | ### Viewing the last request and response 158 | 159 | Whether or not an HTTP request was successful, you can access the last request and response sent by accessing the relevant HTTP client attributes like this: 160 | 161 | ```python 162 | vonage_client.http_client.last_request 163 | vonage_client.http_client.last_response 164 | ``` 165 | 166 | For example, to see the last request body and headers sent by the SDK, you can do: 167 | 168 | ```python 169 | print(vonage_client.http_client.last_request.body) 170 | print(vonage_client.http_client.last_request.headers) 171 | ``` 172 | 173 | ### Authentication errors 174 | 175 | If the SDK returns an `AuthenticationError`, this is because the Vonage Server was not able to authenticate the SDK user. In this case, you should check the authentication details that were provided. 176 | 177 | ## Useful Resources 178 | - [Vonage Python SDK on Github](https://github.com/Vonage/vonage-python-sdk) 179 | - [Vonage Python SDK on PyPI](https://pypi.org/project/vonage/) 180 | - [Python SDK introduction blog](https://developer.vonage.com/en/blog/vonage-python-sdk-v4-is-now-live-#getting-started) 181 | - [Migration guide from old to new SDK](https://github.com/Vonage/vonage-python-sdk/blob/main/V3_TO_V4_SDK_MIGRATION_GUIDE.md) 182 | 183 | ## Request an Example 184 | 185 | Please [raise an issue](https://github.com/Vonage/vonage-python-code-snippets/issues) to request an example that isn't present within the quickstart. Pull requests will be gratefully received. 186 | 187 | ## License 188 | 189 | [MIT](LICENSE) 190 | 191 | [sign-up]: https://dashboard.nexmo.com/sign-up 192 | [buy-number]: https://dashboard.nexmo.com/buy-numbers 193 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | vonage 2 | python-dotenv 3 | fastapi[standard] -------------------------------------------------------------------------------- /sms/delivery-receipts.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import FastAPI, Request 4 | 5 | app = FastAPI() 6 | 7 | 8 | @app.post('/webhooks/delivery-receipt') 9 | async def get_delivery_receipt(request: Request): 10 | data = await request.json() 11 | pprint(data) 12 | -------------------------------------------------------------------------------- /sms/receive-sms.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import FastAPI, Request 4 | 5 | app = FastAPI() 6 | 7 | 8 | @app.post('/webhooks/inbound') 9 | async def inbound_message(request: Request): 10 | data = await request.json() 11 | pprint(data) 12 | -------------------------------------------------------------------------------- /sms/send-an-sms-with-unicode.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 10 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 11 | SMS_TO_NUMBER = os.getenv("SMS_TO_NUMBER") 12 | SMS_SENDER_ID = os.getenv("SMS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_sms import SmsMessage, SmsResponse 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | message = SmsMessage( 20 | to=SMS_TO_NUMBER, 21 | from_=SMS_SENDER_ID, 22 | text='こんにちは世界', 23 | type='unicode', 24 | ) 25 | 26 | response: SmsResponse = client.sms.send(message) 27 | print(response) 28 | -------------------------------------------------------------------------------- /sms/send-an-sms.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 10 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 11 | SMS_TO_NUMBER = os.getenv("SMS_TO_NUMBER") 12 | SMS_SENDER_ID = os.getenv("SMS_SENDER_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_sms import SmsMessage, SmsResponse 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | message = SmsMessage( 20 | to=SMS_TO_NUMBER, 21 | from_=SMS_SENDER_ID, 22 | text="A text message sent using the Vonage SMS API.", 23 | ) 24 | 25 | response: SmsResponse = client.sms.send(message) 26 | print(response) 27 | -------------------------------------------------------------------------------- /sms/send-signed-sms.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 10 | SMS_TO_NUMBER = os.getenv("SMS_TO_NUMBER") 11 | SMS_SENDER_ID = os.getenv("SMS_SENDER_ID") 12 | SMS_SIGNATURE = os.getenv('SMS_SIGNATURE') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_sms import SmsMessage, SmsResponse 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, signature_secret=SMS_SIGNATURE)) 18 | 19 | message = SmsMessage( 20 | to=SMS_TO_NUMBER, 21 | from_=SMS_SENDER_ID, 22 | text="A text message sent using the Vonage SMS API.", 23 | ) 24 | 25 | response: SmsResponse = client.sms.send(message) 26 | print(response) 27 | -------------------------------------------------------------------------------- /sms/submit-sms-conversion.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 10 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 11 | 12 | from vonage import Auth, Vonage 13 | 14 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 15 | 16 | client.sms.submit_sms_conversion( 17 | message_id='MESSAGE_ID', 18 | delivered=True, 19 | timestamp='2020-01-01T12:00:00Z', 20 | ) 21 | 22 | if client.http_client.last_response.status_code == 200: 23 | print('Conversion submitted successfully.') 24 | else: 25 | print('Conversion not submitted.') 26 | -------------------------------------------------------------------------------- /sms/verify-signed-sms/README.md: -------------------------------------------------------------------------------- 1 | # Verify an incoming SMS signature 2 | 3 | This sample application demonstrates how to verify an incoming SMS signature. 4 | 5 | Note: you must have enabled signed webhooks. To do this, please contact support. 6 | [This page](https://developer.vonage.com/getting-started/concepts/signing-messages) has more information. 7 | 8 | ## Usage 9 | 10 | You may want to use a localhost tunnel agent such as [ngrok](https://ngrok.com/) for local testing. 11 | 12 | ### Set Up Your Environment 13 | 14 | Install dependencies with `pip` in a virtual environment: 15 | 16 | ```bash 17 | python3 -m venv venv 18 | . ./venv/bin/activate 19 | 20 | # Point to the requirements file in the root of the python-code-snippets repo 21 | pip install -r requirements.txt 22 | ``` 23 | 24 | ### Set Up an Incoming Webhook 25 | 1. Start ngrok with `ngrok http 8000`. ngrok will give you a forwarding address you can now use to recieve event webhooks. 26 | 1. Go to the [Customer Dashboard](https://dashboard.nexmo.com/sign-in). 27 | 1. Go to ["API Settings"](https://dashboard.nexmo.com/settings). 28 | 1. Under "SMS Settings", choose the SMS API and paste in your ngrok URL in the "Delivery Receipts" section. 29 | 1. Click "Save Changes". 30 | 31 | ### Start the FastAPI Server 32 | 33 | Run the FastAPI server with 34 | 35 | ```bash 36 | fastapi dev sms/verify-signed-sms/main.py 37 | ``` 38 | 39 | You can now send an SMS and the incoming message will be sent to your webhook URL. You can check the console output of the application to see the results of the signature check. 40 | -------------------------------------------------------------------------------- /sms/verify-signed-sms/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | envpath = join(dirname(__file__), '../.env') 7 | load_dotenv(envpath) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_SIGNATURE_SECRET = os.getenv("VONAGE_SIGNATURE_SECRET") 11 | 12 | from fastapi import FastAPI, Request 13 | from vonage import Auth, Vonage 14 | 15 | client = Vonage(Auth(api_key=VONAGE_API_KEY, signature_secret=VONAGE_SIGNATURE_SECRET)) 16 | 17 | app = FastAPI() 18 | 19 | 20 | @app.post('/') 21 | async def verify_signed_webhook(request: Request): 22 | data = await request.json() 23 | 24 | if client.http_client.auth.check_signature(data): 25 | print('Valid signature') 26 | else: 27 | print('Invalid signature') 28 | -------------------------------------------------------------------------------- /subaccounts/create-subaccount.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_NAME = os.getenv('SUBACCOUNT_NAME') 13 | SUBACCOUNT_SECRET = os.getenv('SUBACCOUNT_SECRET') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_subaccounts import NewSubaccount, SubaccountOptions 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | response: NewSubaccount = client.subaccounts.create_subaccount( 21 | SubaccountOptions(name=SUBACCOUNT_NAME, secret=SUBACCOUNT_SECRET) 22 | ) 23 | 24 | print(response) 25 | -------------------------------------------------------------------------------- /subaccounts/get-subaccount.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_KEY = os.getenv('SUBACCOUNT_KEY') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_subaccounts import Subaccount 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | subaccount: Subaccount = client.subaccounts.get_subaccount(SUBACCOUNT_KEY) 20 | 21 | print(subaccount) 22 | -------------------------------------------------------------------------------- /subaccounts/list-balance-transfers.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_START_DATE = os.getenv("SUBACCOUNT_START_DATE") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_subaccounts import ListTransfersFilter, Transfer 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: list[Transfer] = client.subaccounts.list_balance_transfers( 20 | ListTransfersFilter(start_date=SUBACCOUNT_START_DATE) 21 | ) 22 | 23 | print(response) 24 | -------------------------------------------------------------------------------- /subaccounts/list-credit-transfers.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_START_DATE = os.getenv("SUBACCOUNT_START_DATE") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_subaccounts import ListTransfersFilter, Transfer 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: list[Transfer] = client.subaccounts.list_credit_transfers( 20 | ListTransfersFilter(start_date=SUBACCOUNT_START_DATE) 21 | ) 22 | 23 | print(response) 24 | -------------------------------------------------------------------------------- /subaccounts/list-subaccounts.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_subaccounts import ListSubaccountsResponse 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | response: ListSubaccountsResponse = client.subaccounts.list_subaccounts() 19 | 20 | print(response) 21 | -------------------------------------------------------------------------------- /subaccounts/reactivate-subaccount.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_KEY = os.getenv("SUBACCOUNT_KEY") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_subaccounts import ModifySubaccountOptions, Subaccount 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: Subaccount = client.subaccounts.modify_subaccount( 20 | subaccount_api_key=SUBACCOUNT_KEY, 21 | options=ModifySubaccountOptions(suspended=False), 22 | ) 23 | 24 | print(response) 25 | -------------------------------------------------------------------------------- /subaccounts/suspend-subaccount.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_KEY = os.getenv("SUBACCOUNT_KEY") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_subaccounts import ModifySubaccountOptions, Subaccount 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: Subaccount = client.subaccounts.modify_subaccount( 20 | subaccount_api_key=SUBACCOUNT_KEY, 21 | options=ModifySubaccountOptions(suspended=True), 22 | ) 23 | 24 | print(response) 25 | -------------------------------------------------------------------------------- /subaccounts/transfer-balance.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_KEY = os.getenv("SUBACCOUNT_KEY") 13 | SUBACCOUNT_BALANCE_AMOUNT = os.getenv("SUBACCOUNT_BALANCE_AMOUNT") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_subaccounts import Transfer, TransferRequest 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | request = TransferRequest( 21 | from_=VONAGE_API_KEY, to=SUBACCOUNT_KEY, amount=SUBACCOUNT_BALANCE_AMOUNT 22 | ) 23 | 24 | transfer: Transfer = client.subaccounts.transfer_balance(request) 25 | 26 | print(transfer) 27 | -------------------------------------------------------------------------------- /subaccounts/transfer-credit.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_KEY = os.getenv("SUBACCOUNT_KEY") 13 | SUBACCOUNT_CREDIT_AMOUNT = os.getenv("SUBACCOUNT_CREDIT_AMOUNT") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_subaccounts import Transfer, TransferRequest 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | request = TransferRequest( 21 | from_=VONAGE_API_KEY, to=SUBACCOUNT_KEY, amount=SUBACCOUNT_CREDIT_AMOUNT 22 | ) 23 | 24 | response: Transfer = client.subaccounts.transfer_credit(request) 25 | 26 | print(response) 27 | -------------------------------------------------------------------------------- /subaccounts/transfer-number.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_API_KEY = os.getenv('VONAGE_API_KEY') 11 | VONAGE_API_SECRET = os.getenv('VONAGE_API_SECRET') 12 | SUBACCOUNT_KEY = os.getenv("SUBACCOUNT_KEY") 13 | VONAGE_VIRTUAL_NUMBER = os.getenv("VONAGE_VIRTUAL_NUMBER") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_subaccounts import TransferNumberRequest, TransferNumberResponse 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | request = TransferNumberRequest( 21 | from_=VONAGE_API_KEY, to=SUBACCOUNT_KEY, number=VONAGE_VIRTUAL_NUMBER 22 | ) 23 | 24 | response: TransferNumberResponse = client.subaccounts.transfer_number(request) 25 | 26 | print(response) 27 | -------------------------------------------------------------------------------- /tools/aggregate_snippets.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | import os 3 | from typing import DefaultDict 4 | 5 | 6 | def extract_relevant_lines(content_lines: list[str]) -> tuple[int, int]: 7 | """ 8 | Extract the relevant line numbers from a Python file. 9 | Uses same logic as update_python_snippet_line_numbers.py from "content-repo". 10 | """ 11 | start_line = 0 12 | end_line = len(content_lines) 13 | 14 | # Check for FastAPI 15 | for line in content_lines: 16 | if line.startswith('from fastapi import'): 17 | return start_line, end_line 18 | 19 | # Find Vonage import 20 | for i, line in enumerate(content_lines): 21 | if line.startswith('from vonage import Auth, Vonage'): 22 | start_line = i 23 | break 24 | 25 | return start_line, end_line 26 | 27 | 28 | def get_display_title(snippet_title: str, directory: str) -> str: 29 | """ 30 | Generate a display title for a snippet. 31 | If the file is main.py, use the parent directory name instead. 32 | """ 33 | if snippet_title.startswith(directory + '/'): 34 | display_title = snippet_title[len(directory) + 1 :] 35 | else: 36 | display_title = snippet_title 37 | 38 | # Check if this is a main.py file 39 | parts = display_title.split('/') 40 | if parts[-1] == 'main': 41 | if len(parts) > 1: 42 | display_title = parts[-2] # Use parent directory name 43 | else: 44 | display_title = directory # Fallback to top dir if no parent 45 | 46 | # Format for display 47 | display_title = display_title.replace('/', ' ').replace('-', ' ').title() 48 | return display_title 49 | 50 | 51 | def main(): 52 | """ 53 | This script aggregates all the snippets from the content-repo into a single file. 54 | It recursively navigates through all folders that don't start with a dot, 55 | finds .py files, and adds their contents to the markdown file. 56 | 57 | It should be run from the root directory of the code snippets repo. 58 | """ 59 | 60 | repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) 61 | output_file = os.path.join(repo_root, 'SNIPPETS.md') 62 | snippets_by_directory: DefaultDict[str, dict[str, str]] = defaultdict(dict) 63 | 64 | for root, dirs, files in os.walk(repo_root): 65 | dirs[:] = [d for d in dirs if not d.startswith('.')] 66 | 67 | if os.path.basename(root) in {'tools', 'meetings', 'number-insight-v2'}: 68 | continue 69 | 70 | for file in files: 71 | if file.endswith('.py'): 72 | file_path = os.path.join(root, file) 73 | relative_path = os.path.relpath(file_path, repo_root) 74 | 75 | parts = relative_path.split(os.sep) 76 | if len(parts) > 1: 77 | top_dir = parts[0] 78 | snippet_title = relative_path[:-3] 79 | 80 | try: 81 | with open(file_path, 'r') as f: 82 | snippet_lines = f.readlines() 83 | start_line, end_line = extract_relevant_lines(snippet_lines) 84 | 85 | relevant_content = ''.join(snippet_lines[start_line:end_line]) 86 | 87 | snippets_by_directory[top_dir][snippet_title] = relevant_content 88 | except Exception as e: 89 | print(f"Error reading {file_path}: {e}") 90 | 91 | with open(output_file, 'w') as f: 92 | f.write('## Python Code Snippets\n\n') 93 | f.write( 94 | 'This is a list of all supported Python code snippets in the repo, organised by category.\n\n' 95 | ) 96 | 97 | # Table of contents 98 | f.write('### Table of Contents\n\n') 99 | for directory in sorted(snippets_by_directory.keys()): 100 | f.write(f'- [{directory.title().replace("-", " ")}](#{directory})\n') 101 | f.write('\n') 102 | 103 | # Table of contents for each section 104 | for directory in sorted(snippets_by_directory.keys()): 105 | dir_snippets = snippets_by_directory[directory] 106 | dir_title = directory.title().replace('-', ' ') 107 | 108 | f.write(f'### {dir_title}\n\n') 109 | f.write(f'#### Snippets in this Section\n\n') 110 | 111 | for snippet_title in sorted(dir_snippets.keys()): 112 | display_title = get_display_title(snippet_title, directory) 113 | snippet_link = display_title.lower().replace(' ', '-') 114 | f.write(f'- [{display_title}](#{snippet_link})\n') 115 | 116 | f.write('\n') 117 | 118 | # Individual snippets 119 | for snippet_title in sorted(dir_snippets.keys()): 120 | display_title = get_display_title(snippet_title, directory) 121 | 122 | f.write(f'#### {display_title}\n\n') 123 | f.write('```python\n') 124 | f.write(dir_snippets[snippet_title]) 125 | if not dir_snippets[snippet_title].endswith('\n'): 126 | f.write('\n') 127 | f.write('```\n\n') 128 | 129 | print(f"Successfully generated {output_file}") 130 | print(f"Found snippets in {len(snippets_by_directory)} top-level directories") 131 | total_snippets = sum(len(snippets) for snippets in snippets_by_directory.values()) 132 | print(f"Total snippets: {total_snippets}") 133 | 134 | # Add snippets to the readme 135 | with open('readme-base.md', 'r') as readme_base_file: 136 | readme_base = readme_base_file.read() 137 | 138 | with open('SNIPPETS.md') as snippets_file: 139 | snippets_base = snippets_file.read() 140 | 141 | with open('README.md', 'w') as readme_file: 142 | readme_file.write(readme_base) 143 | readme_file.write('\n\n') 144 | readme_file.write(snippets_base) 145 | 146 | 147 | if __name__ == '__main__': 148 | main() 149 | -------------------------------------------------------------------------------- /users/create-user.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.getenv('VONAGE_PRIVATE_KEY') 12 | USER_NAME = os.getenv('USER_NAME') 13 | USER_DISPLAY_NAME = os.getenv('USER_DISPLAY_NAME') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_users import Channels, PstnChannel, User 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | user_options = User( 26 | name=USER_NAME, 27 | display_name=USER_DISPLAY_NAME, 28 | channels=Channels(pstn=[PstnChannel(number=123456)]), 29 | ) 30 | user = client.users.create_user(user_options) 31 | 32 | print(user) 33 | -------------------------------------------------------------------------------- /users/delete-user.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.getenv('VONAGE_PRIVATE_KEY') 12 | USER_ID = os.getenv('USER_ID') 13 | 14 | from vonage import Auth, Vonage 15 | 16 | client = Vonage( 17 | Auth( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | ) 22 | client.users.delete_user(USER_ID) 23 | -------------------------------------------------------------------------------- /users/get-user.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.getenv('VONAGE_PRIVATE_KEY') 12 | USER_ID = os.getenv('USER_ID') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_users import User 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | user: User = client.users.get_user(USER_ID) 24 | 25 | print(user) 26 | -------------------------------------------------------------------------------- /users/list-users.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.getenv('VONAGE_PRIVATE_KEY') 12 | 13 | from vonage import Auth, Vonage 14 | 15 | client = Vonage( 16 | Auth( 17 | application_id=VONAGE_APPLICATION_ID, 18 | private_key=VONAGE_PRIVATE_KEY, 19 | ) 20 | ) 21 | 22 | users_list, next_page_cursor = client.users.list_users() 23 | 24 | print(users_list) 25 | -------------------------------------------------------------------------------- /users/update-user.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | # Load the environment 7 | envpath = join(dirname(__file__), "../.env") 8 | load_dotenv(envpath) 9 | 10 | VONAGE_APPLICATION_ID = os.getenv('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.getenv('VONAGE_PRIVATE_KEY') 12 | USER_ID = os.getenv('USER_ID') 13 | USER_NAME = os.getenv('USER_NAME') 14 | USER_DISPLAY_NAME = os.getenv('USER_DISPLAY_NAME') 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_users import Channels, PstnChannel, SmsChannel, User 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | user_params = User( 27 | name=USER_NAME, 28 | display_name=USER_DISPLAY_NAME, 29 | channels=Channels( 30 | sms=[SmsChannel(number='1234567890')], pstn=[PstnChannel(number=123456)] 31 | ), 32 | ) 33 | user: User = client.users.update_user(id=USER_ID, params=user_params) 34 | 35 | print(user) 36 | -------------------------------------------------------------------------------- /verify/cancel-request.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | VERIFY_REQUEST_ID = os.environ.get('VERIFY_REQUEST_ID') 12 | 13 | from vonage import Auth, Vonage 14 | 15 | client = Vonage( 16 | Auth( 17 | application_id=VONAGE_APPLICATION_ID, 18 | private_key=VONAGE_PRIVATE_KEY, 19 | ) 20 | ) 21 | 22 | client.verify.cancel_verification(request_id=VERIFY_REQUEST_ID) 23 | -------------------------------------------------------------------------------- /verify/check-verification-code.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | 12 | VERIFY_REQUEST_ID = os.environ.get('VERIFY_REQUEST_ID') 13 | VERIFY_CODE = os.environ.get('VERIFY_CODE') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_verify import CheckCodeResponse 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | response: CheckCodeResponse = client.verify.check_code( 26 | request_id=VERIFY_REQUEST_ID, code=VERIFY_CODE 27 | ) 28 | print(response) 29 | -------------------------------------------------------------------------------- /verify/send-request-email.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_VERIFY_BRAND_NAME = os.environ.get("VERIFY_VERIFY_BRAND_NAME") 14 | VERIFY_TO_EMAIL = os.environ.get("VERIFY_TO_EMAIL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_verify import (EmailChannel, StartVerificationResponse, 18 | VerifyRequest) 19 | 20 | client = Vonage( 21 | Auth( 22 | application_id=VONAGE_APPLICATION_ID, 23 | private_key=VONAGE_PRIVATE_KEY, 24 | ) 25 | ) 26 | 27 | verify_request = VerifyRequest( 28 | brand=VERIFY_VERIFY_BRAND_NAME, 29 | workflow=[ 30 | EmailChannel(to=VERIFY_TO_EMAIL), 31 | ], 32 | ) 33 | 34 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 35 | pprint(response) 36 | -------------------------------------------------------------------------------- /verify/send-request-silent-auth.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_BRAND_NAME = os.environ.get("VERIFY_BRAND_NAME") 14 | VERIFY_NUMBER = os.environ.get("VERIFY_NUMBER") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_verify import (SilentAuthChannel, StartVerificationResponse, 18 | VerifyRequest) 19 | 20 | client = Vonage( 21 | Auth( 22 | application_id=VONAGE_APPLICATION_ID, 23 | private_key=VONAGE_PRIVATE_KEY, 24 | ) 25 | ) 26 | 27 | verify_request = VerifyRequest( 28 | brand=VERIFY_BRAND_NAME, 29 | workflow=[SilentAuthChannel(to=VERIFY_NUMBER)], 30 | ) 31 | 32 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 33 | pprint(response) 34 | -------------------------------------------------------------------------------- /verify/send-request-sms.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_BRAND_NAME = os.environ.get("VERIFY_BRAND_NAME") 14 | VERIFY_NUMBER = os.environ.get("VERIFY_NUMBER") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_verify import SmsChannel, StartVerificationResponse, VerifyRequest 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | verify_request = VerifyRequest( 27 | brand=VERIFY_BRAND_NAME, 28 | workflow=[ 29 | SmsChannel(to=VERIFY_NUMBER), 30 | ], 31 | ) 32 | 33 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 34 | pprint(response) 35 | -------------------------------------------------------------------------------- /verify/send-request-voice.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_BRAND_NAME = os.environ.get("VERIFY_BRAND_NAME") 14 | VERIFY_NUMBER = os.environ.get("VERIFY_NUMBER") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_verify import (StartVerificationResponse, VerifyRequest, 18 | VoiceChannel) 19 | 20 | client = Vonage( 21 | Auth( 22 | application_id=VONAGE_APPLICATION_ID, 23 | private_key=VONAGE_PRIVATE_KEY, 24 | ) 25 | ) 26 | 27 | verify_request = VerifyRequest( 28 | brand=VERIFY_BRAND_NAME, 29 | workflow=[ 30 | VoiceChannel(to=VERIFY_NUMBER), 31 | ], 32 | ) 33 | 34 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 35 | pprint(response) 36 | -------------------------------------------------------------------------------- /verify/send-request-whatsapp-interactive.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_BRAND_NAME = os.environ.get("VERIFY_BRAND_NAME") 14 | VERIFY_NUMBER = os.environ.get("VERIFY_NUMBER") 15 | VERIFY_FROM_NUMBER = os.environ.get("VERIFY_FROM_NUMBER") 16 | 17 | from vonage import Auth, Vonage 18 | from vonage_verify import (StartVerificationResponse, VerifyRequest, 19 | WhatsappChannel) 20 | 21 | client = Vonage( 22 | Auth( 23 | application_id=VONAGE_APPLICATION_ID, 24 | private_key=VONAGE_PRIVATE_KEY, 25 | ) 26 | ) 27 | 28 | verify_request = VerifyRequest( 29 | brand=VERIFY_BRAND_NAME, 30 | workflow=[ 31 | WhatsappChannel(to=VERIFY_NUMBER, from_=VERIFY_FROM_NUMBER), 32 | ], 33 | ) 34 | 35 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 36 | pprint(response) 37 | -------------------------------------------------------------------------------- /verify/send-request-whatsapp.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_BRAND_NAME = os.environ.get("VERIFY_BRAND_NAME") 14 | VERIFY_NUMBER = os.environ.get("VERIFY_NUMBER") 15 | VERIFY_FROM_NUMBER = os.environ.get("VERIFY_FROM_NUMBER") 16 | 17 | from vonage import Auth, Vonage 18 | from vonage_verify import (StartVerificationResponse, VerifyRequest, 19 | WhatsappChannel) 20 | 21 | client = Vonage( 22 | Auth( 23 | application_id=VONAGE_APPLICATION_ID, 24 | private_key=VONAGE_PRIVATE_KEY, 25 | ) 26 | ) 27 | 28 | verify_request = VerifyRequest( 29 | brand=VERIFY_BRAND_NAME, 30 | workflow=[ 31 | WhatsappChannel(to=VERIFY_NUMBER, from_=VERIFY_FROM_NUMBER), 32 | ], 33 | ) 34 | 35 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 36 | pprint(response) 37 | -------------------------------------------------------------------------------- /verify/send-request-with-fallback.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | 13 | VERIFY_BRAND_NAME = os.environ.get("VERIFY_BRAND_NAME") 14 | VERIFY_NUMBER = os.environ.get("VERIFY_NUMBER") 15 | VERIFY_TO_EMAIL = os.environ.get("VERIFY_TO_EMAIL") 16 | VERIFY_FROM_EMAIL = os.environ.get("VERIFY_FROM_EMAIL") 17 | 18 | from vonage import Auth, Vonage 19 | from vonage_verify import (EmailChannel, SilentAuthChannel, 20 | StartVerificationResponse, VerifyRequest) 21 | 22 | client = Vonage( 23 | Auth( 24 | application_id=VONAGE_APPLICATION_ID, 25 | private_key=VONAGE_PRIVATE_KEY, 26 | ) 27 | ) 28 | 29 | verify_request = VerifyRequest( 30 | brand=VERIFY_BRAND_NAME, 31 | workflow=[ 32 | SilentAuthChannel(to=VERIFY_NUMBER), 33 | EmailChannel(to=VERIFY_TO_EMAIL, from_=VERIFY_FROM_EMAIL), 34 | ], 35 | ) 36 | 37 | response: StartVerificationResponse = client.verify.start_verification(verify_request) 38 | pprint(response) 39 | -------------------------------------------------------------------------------- /verify_legacy/cancel.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_REQUEST_ID = os.getenv("VERIFY_REQUEST_ID") 12 | 13 | from vonage import Auth, Vonage 14 | 15 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 16 | 17 | client.verify_legacy.cancel_verification(VERIFY_REQUEST_ID) 18 | -------------------------------------------------------------------------------- /verify_legacy/check.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_REQUEST_ID = os.getenv("VERIFY_REQUEST_ID") 12 | VERIFY_CODE = os.environ.get('VERIFY_CODE') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_verify_legacy import CheckCodeResponse 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | response: CheckCodeResponse = client.verify_legacy.check_code( 20 | VERIFY_REQUEST_ID, VERIFY_CODE 21 | ) 22 | print(response) 23 | -------------------------------------------------------------------------------- /verify_legacy/psd2-request.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_NUMBER = os.getenv("VERIFY_NUMBER") 12 | VERIFY_PAYEE_NAME = os.environ.get("VERIFY_PAYEE_NAME") 13 | VERIFY_AMOUNT = os.environ.get("VERIFY_AMOUNT") 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_verify_legacy import Psd2Request, StartVerificationResponse 17 | 18 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 19 | 20 | request = Psd2Request(number=VERIFY_NUMBER, payee=VERIFY_PAYEE_NAME, amount=VERIFY_AMOUNT) 21 | 22 | response: StartVerificationResponse = client.verify_legacy.start_psd2_verification( 23 | request 24 | ) 25 | print(response) 26 | -------------------------------------------------------------------------------- /verify_legacy/request.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_NUMBER = os.getenv("VERIFY_NUMBER") 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_verify_legacy import StartVerificationResponse, VerifyRequest 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | request = VerifyRequest(number=VERIFY_NUMBER, brand='AcmeInc') 19 | 20 | response: StartVerificationResponse = client.verify_legacy.start_verification(request) 21 | print(response) 22 | -------------------------------------------------------------------------------- /verify_legacy/search.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_REQUEST_ID = os.getenv("VERIFY_REQUEST_ID") 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_verify_legacy import VerifyStatus 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | response: VerifyStatus = client.verify_legacy.search(VERIFY_REQUEST_ID) 19 | print(response) 20 | -------------------------------------------------------------------------------- /verify_legacy/send-psd2-verification-request-with-workflow.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_NUMBER = os.getenv("VERIFY_NUMBER") 12 | VERIFY_PAYEE_NAME = os.environ.get("VERIFY_PAYEE_NAME") 13 | VERIFY_AMOUNT = os.environ.get("VERIFY_AMOUNT") 14 | VERIFY_WORKFLOW_ID = os.environ.get("VERIFY_WORKFLOW_ID") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_verify_legacy import Psd2Request, StartVerificationResponse 18 | 19 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 20 | 21 | request = Psd2Request( 22 | number=VERIFY_NUMBER, 23 | payee=VERIFY_PAYEE_NAME, 24 | amount=VERIFY_AMOUNT, 25 | workflow_id=VERIFY_WORKFLOW_ID, 26 | ) 27 | 28 | response: StartVerificationResponse = client.verify_legacy.start_psd2_verification( 29 | request 30 | ) 31 | print(response) 32 | -------------------------------------------------------------------------------- /verify_legacy/send-verification-request-with-workflow.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_NUMBER = os.getenv("VERIFY_NUMBER") 12 | VERIFY_WORKFLOW_ID = os.environ.get("VERIFY_WORKFLOW_ID") 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_verify_legacy import StartVerificationResponse, VerifyRequest 16 | 17 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 18 | 19 | request = VerifyRequest( 20 | number=VERIFY_NUMBER, brand='AcmeInc', workflow_id=VERIFY_WORKFLOW_ID 21 | ) 22 | 23 | response: StartVerificationResponse = client.verify_legacy.start_verification(request) 24 | print(response) 25 | -------------------------------------------------------------------------------- /verify_legacy/trigger-next-step.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_API_KEY = os.getenv("VONAGE_API_KEY") 10 | VONAGE_API_SECRET = os.getenv("VONAGE_API_SECRET") 11 | VERIFY_REQUEST_ID = os.getenv("VERIFY_REQUEST_ID") 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_verify_legacy import VerifyControlStatus 15 | 16 | client = Vonage(Auth(api_key=VONAGE_API_KEY, api_secret=VONAGE_API_SECRET)) 17 | 18 | response: VerifyControlStatus = client.verify_legacy.trigger_next_event(VERIFY_REQUEST_ID) 19 | print(response) 20 | -------------------------------------------------------------------------------- /voice/connect-an-inbound-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | from fastapi import FastAPI 6 | from vonage_voice import Connect, PhoneEndpoint 7 | 8 | dotenv_path = join(dirname(__file__), '../.env') 9 | load_dotenv(dotenv_path) 10 | 11 | VONAGE_VIRTUAL_NUMBER = os.environ.get('VONAGE_VIRTUAL_NUMBER') 12 | VOICE_VOICE_TO_NUMBER = os.environ.get('VOICE_VOICE_TO_NUMBER') 13 | 14 | app = FastAPI() 15 | 16 | 17 | @app.get('/webhooks/answer') 18 | async def inbound_call(): 19 | ncco = [ 20 | Connect( 21 | endpoint=[PhoneEndpoint(number=VOICE_VOICE_TO_NUMBER)], 22 | from_=VONAGE_VIRTUAL_NUMBER, 23 | ).model_dump(by_alias=True, exclude_none=True) 24 | ] 25 | 26 | return ncco 27 | -------------------------------------------------------------------------------- /voice/connect-callers-to-a-conference.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | from fastapi import FastAPI 6 | from vonage_voice import Conversation, NccoAction, Talk 7 | 8 | dotenv_path = join(dirname(__file__), '../.env') 9 | load_dotenv(dotenv_path) 10 | 11 | VOICE_CONFERENCE_NAME = os.environ.get("VOICE_CONFERENCE_NAME") 12 | 13 | app = FastAPI() 14 | 15 | 16 | @app.get('/webhooks/answer') 17 | async def answer_call(): 18 | ncco: list[NccoAction] = [ 19 | Talk(text="Please wait while we connect you to the conference"), 20 | Conversation(name=VOICE_CONFERENCE_NAME), 21 | ] 22 | 23 | return [action.model_dump(by_alias=True, exclude_none=True) for action in ncco] 24 | -------------------------------------------------------------------------------- /voice/earmuff-a-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from time import sleep 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_CALL_ID = os.environ.get('VOICE_CALL_ID') 13 | 14 | 15 | from vonage import Auth, Vonage 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | client.voice.earmuff(VOICE_CALL_ID) 25 | sleep(3) 26 | client.voice.unearmuff(VOICE_CALL_ID) 27 | -------------------------------------------------------------------------------- /voice/get-recording.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), '../.env') 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 10 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 11 | VOICE_RECORDING_URL = os.environ.get('VOICE_RECORDING_URL') 12 | 13 | from vonage import Auth, Vonage 14 | 15 | client = Vonage( 16 | Auth( 17 | application_id=VONAGE_APPLICATION_ID, 18 | private_key=VONAGE_PRIVATE_KEY, 19 | ) 20 | ) 21 | 22 | client.voice.download_recording(VOICE_RECORDING_URL, 'recording.mp3') 23 | -------------------------------------------------------------------------------- /voice/handle-user-input-with-asr.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import Body, FastAPI, Request 4 | from vonage_voice import Input, NccoAction, Speech, Talk 5 | 6 | app = FastAPI() 7 | 8 | 9 | @app.get('/webhooks/answer') 10 | async def answer_call(request: Request): 11 | ncco: list[NccoAction] = [ 12 | Talk(text=f'Please say something'), 13 | Input( 14 | type=['speech'], 15 | speech=Speech(endOnSilence=1, language='en-US'), 16 | eventUrl=[str(request.base_url) + 'webhooks/asr'], 17 | ), 18 | ] 19 | 20 | return [action.model_dump(by_alias=True, exclude_none=True) for action in ncco] 21 | 22 | 23 | @app.post('/webhooks/asr') 24 | async def answer_asr(data: dict = Body(...)): 25 | if data is not None and 'speech' in data: 26 | pprint(data) 27 | speech = data['speech']['results'][0]['text'] 28 | return [ 29 | Talk(text=f'Hello, you said {speech}').model_dump( 30 | by_alias=True, exclude_none=True 31 | ) 32 | ] 33 | return [ 34 | Talk(text=f'Sorry, I didn\'t understand your input.').model_dump( 35 | by_alias=True, exclude_none=True 36 | ) 37 | ] 38 | -------------------------------------------------------------------------------- /voice/handle-user-input.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import Body, FastAPI, Request 4 | from vonage_voice import Dtmf, Input, NccoAction, Talk 5 | 6 | app = FastAPI() 7 | 8 | 9 | @app.get('/webhooks/answer') 10 | async def answer_call(request: Request): 11 | ncco: list[NccoAction] = [ 12 | Talk(text=f'Hello, please press any key to continue.'), 13 | Input( 14 | type=['dtmf'], 15 | dtmf=Dtmf(timeOut=5, maxDigits=1), 16 | eventUrl=[str(request.base_url) + 'webhooks/dtmf'], 17 | ), 18 | ] 19 | 20 | return [action.model_dump(by_alias=True, exclude_none=True) for action in ncco] 21 | 22 | 23 | @app.post('/webhooks/dtmf') 24 | async def answer_dtmf(data: dict = Body(...)): 25 | pprint(data) 26 | return [ 27 | Talk(text=f'Hello, you pressed {data['dtmf']['digits']}').model_dump( 28 | by_alias=True, exclude_none=True 29 | ) 30 | ] 31 | -------------------------------------------------------------------------------- /voice/make-an-outbound-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), "../.env") 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 11 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 12 | VOICE_TO_NUMBER = os.environ.get("VOICE_TO_NUMBER") 13 | VONAGE_VIRTUAL_NUMBER = os.environ.get("VONAGE_VIRTUAL_NUMBER") 14 | VOICE_ANSWER_URL = os.environ.get("VOICE_ANSWER_URL") 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_voice import CreateCallRequest, Phone, ToPhone 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | response = client.voice.create_call( 27 | CreateCallRequest( 28 | answer_url=[VOICE_ANSWER_URL], 29 | to=[ToPhone(number=VOICE_TO_NUMBER)], 30 | from_=Phone(number=VONAGE_VIRTUAL_NUMBER), 31 | ) 32 | ) 33 | 34 | pprint(response) 35 | -------------------------------------------------------------------------------- /voice/make-outbound-call-ncco.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_TO_NUMBER = os.environ.get('VOICE_TO_NUMBER') 13 | VONAGE_VIRTUAL_NUMBER = os.environ.get('VONAGE_VIRTUAL_NUMBER') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_voice import CreateCallRequest, Phone, Talk, ToPhone 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | response = client.voice.create_call( 26 | CreateCallRequest( 27 | ncco=[Talk(text='This is a text to speech call from Vonage.')], 28 | to=[ToPhone(number=VOICE_TO_NUMBER)], 29 | from_=Phone(number=VONAGE_VIRTUAL_NUMBER), 30 | ) 31 | ) 32 | 33 | pprint(response) 34 | -------------------------------------------------------------------------------- /voice/mute-a-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from time import sleep 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_CALL_ID = os.environ.get('VOICE_CALL_ID') 13 | 14 | from vonage import Auth, Vonage 15 | 16 | client = Vonage( 17 | Auth( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | ) 22 | 23 | client.voice.mute(VOICE_CALL_ID) 24 | sleep(5) 25 | client.voice.unmute(VOICE_CALL_ID) 26 | -------------------------------------------------------------------------------- /voice/play-audio-stream-into-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_CALL_ID = os.environ.get('VOICE_CALL_ID') 13 | VOICE_STREAM_URL = os.environ.get('VOICE_STREAM_URL') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_voice import AudioStreamOptions, CallMessage 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | response: CallMessage = client.voice.play_audio_into_call( 26 | VOICE_CALL_ID, 27 | audio_stream_options=AudioStreamOptions(stream_url=[VOICE_STREAM_URL]), 28 | ) 29 | 30 | pprint(response) 31 | -------------------------------------------------------------------------------- /voice/play-dtmf-into-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_CALL_ID = os.environ.get('VOICE_CALL_ID') 13 | VOICE_DTMF_DIGITS = os.environ.get('VOICE_DTMF_DIGITS') 14 | 15 | from vonage import Auth, Vonage 16 | from vonage_voice import CallMessage 17 | 18 | client = Vonage( 19 | Auth( 20 | application_id=VONAGE_APPLICATION_ID, 21 | private_key=VONAGE_PRIVATE_KEY, 22 | ) 23 | ) 24 | 25 | response: CallMessage = client.voice.play_dtmf_into_call( 26 | uuid=VOICE_CALL_ID, dtmf=VOICE_DTMF_DIGITS 27 | ) 28 | 29 | pprint(response) 30 | -------------------------------------------------------------------------------- /voice/play-tts-into-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_CALL_ID = os.environ.get('VOICE_CALL_ID') 13 | VOICE_TEXT = os.environ.get('VOICE_TEXT') 14 | VOICE_LANGUAGE = os.environ.get('VOICE_LANGUAGE') 15 | 16 | from vonage import Auth, Vonage 17 | from vonage_voice import CallMessage, TtsStreamOptions 18 | 19 | client = Vonage( 20 | Auth( 21 | application_id=VONAGE_APPLICATION_ID, 22 | private_key=VONAGE_PRIVATE_KEY, 23 | ) 24 | ) 25 | 26 | response: CallMessage = client.voice.play_tts_into_call( 27 | uuid=VOICE_CALL_ID, 28 | tts_options=TtsStreamOptions(text=VOICE_TEXT, language=VOICE_LANGUAGE), 29 | ) 30 | 31 | pprint(response) 32 | -------------------------------------------------------------------------------- /voice/receive-an-inbound-call.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI, Query 2 | from vonage_voice import Talk 3 | 4 | app = FastAPI() 5 | 6 | 7 | @app.get('/webhooks/answer') 8 | async def answer_call(from_: str = Query(..., alias='from')): 9 | from_ = '-'.join(from_) 10 | return [ 11 | Talk(text=f'Thank you for calling from {from_}').model_dump( 12 | by_alias=True, exclude_none=True 13 | ) 14 | ] 15 | -------------------------------------------------------------------------------- /voice/record-a-call-with-split-audio.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | from fastapi import Body, FastAPI 7 | from vonage_voice import Connect, NccoAction, PhoneEndpoint, Record 8 | 9 | dotenv_path = join(dirname(__file__), '../.env') 10 | load_dotenv(dotenv_path) 11 | 12 | VONAGE_VIRTUAL_NUMBER = os.environ.get('VONAGE_VIRTUAL_NUMBER') 13 | VOICE_TO_NUMBER = os.environ.get('VOICE_TO_NUMBER') 14 | 15 | app = FastAPI() 16 | 17 | 18 | @app.get('/webhooks/answer') 19 | async def inbound_call(): 20 | ncco: list[NccoAction] = [ 21 | Record( 22 | split='conversation', 23 | channels=2, 24 | eventUrl=['https://demo.ngrok.io/webhooks/recordings'], 25 | ), 26 | Connect( 27 | from_=VONAGE_VIRTUAL_NUMBER, endpoint=[PhoneEndpoint(number=VOICE_TO_NUMBER)] 28 | ), 29 | ] 30 | 31 | return [step.model_dump(by_alias=True, exclude_none=True) for step in ncco] 32 | 33 | 34 | @app.post('/webhooks/recordings') 35 | async def recordings(data: dict = Body(...)): 36 | pprint(data) 37 | return {'message': 'webhook received'} 38 | -------------------------------------------------------------------------------- /voice/record-a-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | from fastapi import Body, FastAPI 7 | from vonage_voice import Connect, NccoAction, PhoneEndpoint, Record 8 | 9 | dotenv_path = join(dirname(__file__), '../.env') 10 | load_dotenv(dotenv_path) 11 | 12 | VONAGE_VIRTUAL_NUMBER = os.environ.get('VONAGE_VIRTUAL_NUMBER') 13 | VOICE_TO_NUMBER = os.environ.get('VOICE_TO_NUMBER') 14 | 15 | app = FastAPI() 16 | 17 | 18 | @app.get('/webhooks/answer') 19 | async def inbound_call(): 20 | ncco: list[NccoAction] = [ 21 | Record(eventUrl=['https://demo.ngrok.io/webhooks/recordings']), 22 | Connect( 23 | from_=VONAGE_VIRTUAL_NUMBER, endpoint=[PhoneEndpoint(number=VOICE_TO_NUMBER)] 24 | ), 25 | ] 26 | 27 | return [action.model_dump(by_alias=True, exclude_none=True) for action in ncco] 28 | 29 | 30 | @app.post('/webhooks/recordings') 31 | async def recordings(data: dict = Body(...)): 32 | pprint(data) 33 | return {'message': 'webhook received'} 34 | -------------------------------------------------------------------------------- /voice/record-a-conversation.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | from fastapi import Body, FastAPI 7 | from vonage_voice import Conversation 8 | 9 | dotenv_path = join(dirname(__file__), '../.env') 10 | load_dotenv(dotenv_path) 11 | 12 | VOICE_CONFERENCE_NAME = os.environ.get('VOICE_CONFERENCE_NAME') 13 | 14 | app = FastAPI() 15 | 16 | 17 | @app.get('/webhooks/answer') 18 | async def answer_call(): 19 | ncco = [ 20 | Conversation( 21 | name=VOICE_CONFERENCE_NAME, 22 | record=True, 23 | eventMethod='POST', 24 | eventUrl=['https://demo.ngrok.io/webhooks/recordings'], 25 | ) 26 | ] 27 | 28 | return ncco 29 | 30 | 31 | @app.post('/webhooks/recordings') 32 | async def recordings(data: dict = Body(...)): 33 | pprint(data) 34 | return {'message': 'webhook received'} 35 | -------------------------------------------------------------------------------- /voice/record-a-message.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | 3 | from fastapi import Body, FastAPI, Request 4 | from vonage_voice import NccoAction, Record, Talk 5 | 6 | app = FastAPI() 7 | 8 | 9 | @app.get('/webhooks/answer') 10 | async def answer_call(request: Request): 11 | print(request.base_url) 12 | ncco: list[NccoAction] = [ 13 | Talk( 14 | text='Please leave a message after the tone, then press #. We will get back to you as soon as we can.' 15 | ), 16 | Record( 17 | endOnSilence=3, 18 | endOnKey='#', 19 | beepStart=True, 20 | eventUrl=[str(request.base_url) + 'webhooks/recordings'], 21 | ), 22 | Talk(text='Thank you for your message. Goodbye.'), 23 | ] 24 | 25 | return [action.model_dump(by_alias=True, exclude_none=True) for action in ncco] 26 | 27 | 28 | @app.post('/webhooks/recordings') 29 | async def recordings(data: dict = Body(...)): 30 | pprint(data) 31 | return {'message': 'webhook received'} 32 | -------------------------------------------------------------------------------- /voice/retrieve-info-for-a-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | from pprint import pprint 4 | 5 | from dotenv import load_dotenv 6 | 7 | dotenv_path = join(dirname(__file__), '../.env') 8 | load_dotenv(dotenv_path) 9 | 10 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 11 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 12 | VOICE_CALL_ID = os.environ.get('VOICE_CALL_ID') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_voice import CallInfo 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | response: CallInfo = client.voice.get_call(VOICE_CALL_ID) 25 | pprint(response) 26 | -------------------------------------------------------------------------------- /voice/retrieve-info-for-all-calls.py: -------------------------------------------------------------------------------- 1 | import os 2 | from datetime import datetime, timedelta, timezone 3 | from os.path import dirname, join 4 | from pprint import pprint 5 | 6 | from dotenv import load_dotenv 7 | 8 | dotenv_path = join(dirname(__file__), '../.env') 9 | load_dotenv(dotenv_path) 10 | 11 | VONAGE_APPLICATION_ID = os.environ.get('VONAGE_APPLICATION_ID') 12 | VONAGE_PRIVATE_KEY = os.environ.get('VONAGE_PRIVATE_KEY') 13 | 14 | from vonage import Auth, Vonage 15 | from vonage_voice import ListCallsFilter 16 | 17 | client = Vonage( 18 | Auth( 19 | application_id=VONAGE_APPLICATION_ID, 20 | private_key=VONAGE_PRIVATE_KEY, 21 | ) 22 | ) 23 | 24 | now = datetime.now(timezone.utc) 25 | date_end = now.strftime('%Y-%m-%dT%H:%M:%SZ') 26 | start = now - timedelta(hours=24) 27 | date_start = start.strftime('%Y-%m-%dT%H:%M:%SZ') 28 | 29 | calls, _ = client.voice.list_calls( 30 | ListCallsFilter(date_start=date_start, date_end=date_end) 31 | ) 32 | 33 | for call in calls: 34 | pprint(call) 35 | -------------------------------------------------------------------------------- /voice/track-ncco.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI, Request 2 | from vonage_voice import NccoAction, Notify, Talk 3 | 4 | app = FastAPI() 5 | 6 | 7 | @app.get('/webhooks/answer') 8 | async def inbound_call(request: Request): 9 | ncco: list[NccoAction] = [ 10 | Talk(text=f'Thanks for calling the notification line.'), 11 | Notify( 12 | payload={"foo": "bar"}, 13 | eventUrl=[str(request.base_url) + 'webhooks/notification'], 14 | ), 15 | Talk(text=f'You will never hear me as the notification URL will return an NCCO.'), 16 | ] 17 | 18 | return [action.model_dump(by_alias=True, exclude_none=True) for action in ncco] 19 | 20 | 21 | @app.post('/webhooks/notification') 22 | async def on_notification(): 23 | return [ 24 | Talk(text=f'Your notification has been received, loud and clear').model_dump( 25 | by_alias=True, exclude_none=True 26 | ) 27 | ] 28 | -------------------------------------------------------------------------------- /voice/transfer-a-call.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | VOICE_CALL_ID = os.environ.get("VOICE_CALL_ID") 12 | VOICE_NCCO_URL = os.environ.get("VOICE_NCCO_URL") 13 | 14 | from vonage import Auth, Vonage 15 | 16 | client = Vonage( 17 | Auth( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | ) 22 | 23 | client.voice.transfer_call_answer_url(VOICE_CALL_ID, VOICE_NCCO_URL) 24 | -------------------------------------------------------------------------------- /voice/transfer-call-inline-ncco.py: -------------------------------------------------------------------------------- 1 | import os 2 | from os.path import dirname, join 3 | 4 | from dotenv import load_dotenv 5 | 6 | dotenv_path = join(dirname(__file__), "../.env") 7 | load_dotenv(dotenv_path) 8 | 9 | VONAGE_APPLICATION_ID = os.environ.get("VONAGE_APPLICATION_ID") 10 | VONAGE_PRIVATE_KEY = os.environ.get("VONAGE_PRIVATE_KEY") 11 | VOICE_CALL_ID = os.environ.get("VOICE_CALL_ID") 12 | 13 | from vonage import Auth, Vonage 14 | from vonage_voice import Talk 15 | 16 | client = Vonage( 17 | Auth( 18 | application_id=VONAGE_APPLICATION_ID, 19 | private_key=VONAGE_PRIVATE_KEY, 20 | ) 21 | ) 22 | 23 | ncco = [Talk(text='This is a transfer action using an inline NCCO')] 24 | 25 | client.voice.transfer_call_ncco(VOICE_CALL_ID, ncco) 26 | --------------------------------------------------------------------------------