{"id":18607858,"url":"https://github.com/licht1stein/pyzoom","last_synced_at":"2025-08-21T05:32:42.078Z","repository":{"id":38111527,"uuid":"259720728","full_name":"licht1stein/pyzoom","owner":"licht1stein","description":"Python wrapper for Zoom Video API with an OAUTH Wizard","archived":false,"fork":false,"pushed_at":"2025-05-19T21:57:24.000Z","size":271,"stargazers_count":39,"open_issues_count":11,"forks_count":15,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-23T21:22:53.053Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/licht1stein.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-28T18:35:33.000Z","updated_at":"2025-06-10T20:25:21.000Z","dependencies_parsed_at":"2024-06-21T04:10:55.997Z","dependency_job_id":null,"html_url":"https://github.com/licht1stein/pyzoom","commit_stats":{"total_commits":99,"total_committers":13,"mean_commits":7.615384615384615,"dds":0.7676767676767677,"last_synced_commit":"bbc819e62e45471c9192821b408d2eecc459bbb7"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/licht1stein/pyzoom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/licht1stein%2Fpyzoom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/licht1stein%2Fpyzoom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/licht1stein%2Fpyzoom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/licht1stein%2Fpyzoom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/licht1stein","download_url":"https://codeload.github.com/licht1stein/pyzoom/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/licht1stein%2Fpyzoom/sbom","scorecard":{"id":588504,"data":{"date":"2025-08-11","repo":{"name":"github.com/licht1stein/pyzoom","commit":"58906d5b80e52a27782ed235b4b1b45592c71ed6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test_and_deploy.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":2,"reason":"2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_and_deploy.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/licht1stein/pyzoom/test_and_deploy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_and_deploy.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/licht1stein/pyzoom/test_and_deploy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_and_deploy.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/licht1stein/pyzoom/test_and_deploy.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test_and_deploy.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/licht1stein/pyzoom/test_and_deploy.yml/master?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/test_and_deploy.yml:36","Warn: pipCommand not pinned by hash: .github/workflows/test_and_deploy.yml:37","Warn: pipCommand not pinned by hash: .github/workflows/test_and_deploy.yml:41","Warn: pipCommand not pinned by hash: .github/workflows/test_and_deploy.yml:64","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":2,"reason":"Found 5/23 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 12 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":1,"reason":"9 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6","Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: GHSA-jfmj-5v4g-7637"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T21:11:36.687Z","repository_id":38111527,"created_at":"2025-08-20T21:11:36.687Z","updated_at":"2025-08-20T21:11:36.687Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271430805,"owners_count":24758378,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-21T02:00:08.990Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T02:32:54.754Z","updated_at":"2025-08-21T05:32:41.819Z","avatar_url":"https://github.com/licht1stein.png","language":"Python","funding_links":["https://www.buymeacoffee.com/licht1stein"],"categories":[],"sub_categories":[],"readme":"![Zoom Logo](https://d24cgw3uvb9a9h.cloudfront.net/static/93946/image/new/ZoomLogo.png)\n\n**WARNING: Version 1.0.0 introduces breaking change. The library now only supports OAUTH tokens, since Zoom is deprecating the JWT support as of June 1, 2023**\n\n**On the bright side, `pyzoom` can handle the entire OAUTH flow for you!** \n\n\n# Python wrapper for Zoom API\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pyzoom)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n[![PyPI](https://img.shields.io/pypi/v/pyzoom)](https://pypi.org/project/pyzoom/)\n![PyPI - License](https://img.shields.io/pypi/l/pyzoom)\n![PyPI - Downloads](https://img.shields.io/pypi/dw/pyzoom)\n[![](https://img.shields.io/badge/Support-Buy_coffee!-Orange)](https://www.buymeacoffee.com/licht1stein)\n\n\nLinks:\n* [Api Reference](https://marketplace.zoom.us/docs/api-reference)\n* [Using Zoom API](https://marketplace.zoom.us/docs/api-reference/using-zoom-apis)\n\n## Installation\n\nUsing pip:\n\n`pip install -U pyzoom`\n\nUsing [poetry](https://python-poetry.org/):\n\n`poetry add pyzoom`\n\n## OAUTH Authorization Wizard\n`pyzoom` can handle the entire oauth flow for you. Yes, including starting a web server to receive the callback. And you can use it eiter interactively from the terminal, or from within the code. To run from code:\n\n```python\nfrom pyzoom import oauth_wizard\n\ntokens = oauth_wizard(\"APP_CLIENT_ID\", \"APP_CLIENT_SECRET\")\n```\n\nTo run from terminal (in your virtual environment):\n\n```sh\npython -c \"from pyzoom import oauth_wizard; oauth_wizard()\"\n```\n\n\nThis will launch the wizard in interactive mode:\n- asking for input of your client id and secret\n- starting the web server to capture callback code \n- opening the browser for you to authorize on Zoom\n- capturing the incoming code and running `request_tokens` with it\n\nAs the result it will print the credentials (if all was ok).\n\nNo external libraries were used to start the server and capture the code, only what's built into python.\n\n### Requesting Tokens\nOnce your user has accepted integration on the zoom side and you received the code from the redirect:\n\n```python\nfrom pyzoom import request_tokens\n\ntokens = request_tokens(\"APP_CLIENT_ID\", \"APP_CLIENT_SECRET\", \"APP_REDIRECT_URL\", \"CALLBACK_CODE\"):\n```\nThe result of a successful request will be a map with the tokens. \n\n### Refreshing tokens\n\n```python\nfrom pyzoom import refresh_tokens\n\ntokens = refresh_tokens(\"APP_CLIENT_ID\", \"APP_CLIENT_SECRET\", \"USER_REFRESH_TOKEN\")\n```\nThe result of a successful request will be a map with the new tokens. Remember, that the refresh token will also be updated, which will invalidate the token you just used. \n\n## Usage\n\n### Basic instantiation:\n\n```python\nfrom pyzoom import ZoomClient\n\nclient = ZoomClient('YOUR_ZOOM_ACCESS_TOKEN')\n```\n\nOptionally you can specify a different base URL either upon instantiation or any time later:\n\n```python\nclient = ZoomClient ('YOU_ZOOM_ACCCESS_TOKEN', base_url=\"https://api.zoomgov.us/v2\")\n```\n\n### Instantiation from environment variables\n\nYou can also create an instance of client when access key in environment variables `ZOOM_ACCESS_TOKEN`. *Since the access token expires after one hour, this method is not a good idea any more.*\n\n```python\nfrom pyzoom import ZoomClient\n\nclient = ZoomClient.from_environment()\n```\n\n\n### Meetings\n\n#### Create meeting, update meeting and add registrant\n```python\nfrom pyzoom import ZoomClient\nfrom datetime import datetime as dt\n\nclient = ZoomClient.from_environment()\n\n# Creating a meeting\nmeeting = client.meetings.create_meeting('Auto created 1', start_time=dt.now().isoformat(), duration_min=60, password='not-secure')\n\n# Update a meeting\nmeeting = client.meetings.update_meeting('Auto updated 1', meeting_id = meeting.id ,start_time=dt.now().isoformat(), duration_min=60,password='not-secure')\n\n# Adding registrants\nclient.meetings.add_meeting_registrant(meeting.id, first_name='John', last_name='Doe', email='john.doe@example.com')\n```\nYou can use `client.meetings.add_and_confirm_registrant` to also confirm auto added\nregistrants to a closed meeting.\n\n### Raw API methods\n\nYou can also use the library for making raw requests to the API:\n\n```python\nfrom pyzoom import ZoomClient\n\nclient = ZoomClient.from_environment()\n\n# Get self\nresponse = client.raw.get('/users/me')\n\n# Get all pages of meeting participants\nresult_dict = client.raw.get_all_pages('/past_meetings/{meetingUUID}/participants')\n```\n\n### Packaging notice\nThis project uses the excellent [poetry](https://python-poetry.org) for packaging. Please read about it and let's all start using\n`pyproject.toml` files as a standard. Read more:\n\n* [PEP 518 -- Specifying Minimum Build System Requirements for Python Projects](https://www.python.org/dev/peps/pep-0518/)\n\n* [What the heck is pyproject.toml?](https://snarky.ca/what-the-heck-is-pyproject-toml/)\n\n* [Clarifying PEP 518 (a.k.a. pyproject.toml)](https://snarky.ca/clarifying-pep-518/)\n\n\n### Support\n\n\u003ca href=\"https://www.buymeacoffee.com/licht1stein\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/default-orange.png\" alt=\"Buy Me A Coffee\" style=\"height: 30px !important;width: 130px !important;\" \u003e\u003c/a\u003e\n\n### Versioning\nThe project uses [break versioning](https://github.com/ptaoussanis/encore/blob/master/BREAK-VERSIONING.md), meaning that upgrading from 1.0.x to 1.0.y will always be safe, upgrade to 1.y.0 might break something small, and upgrade to y.0.0. will break almost everything. That was a versioning spec in one sentence, by the way.\n\n\n### Disclaimer\nThis library is not related to Zoom Video Communications, Inc. It's an open-source project that \naims to simplify working with this suddenly very popular service.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flicht1stein%2Fpyzoom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flicht1stein%2Fpyzoom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flicht1stein%2Fpyzoom/lists"}