From 2f56f67389ad4ef66a5e04268bcd4cfbd562aea5 Mon Sep 17 00:00:00 2001 From: Nick Barraclough Date: Wed, 6 May 2026 14:46:21 -0600 Subject: [PATCH] Refresh README to match nylas-nodejs style Bring the Python SDK README in line with the Nylas multi-SDK convention (centered logo header, badge row, dot-separated quick links, emoji sections) and route users to developer.nylas.com instead of duplicating docs in-repo. Drops stale v3-beta links and the dashboard.nylas.com host. Keeps Python-specific content the Node README doesn't need: dataclasses-json note, CRUD pattern overview, and a requests-logging debugging snippet. Co-Authored-By: Claude Opus 4.7 (1M context) --- README.md | 207 ++++++++++++++++++++++++++-------------- diagrams/nylas-logo.png | Bin 0 -> 24968 bytes 2 files changed, 137 insertions(+), 70 deletions(-) create mode 100644 diagrams/nylas-logo.png diff --git a/README.md b/README.md index f9d33072..f923483d 100644 --- a/README.md +++ b/README.md @@ -1,123 +1,190 @@ - - Aimeos logo - +
+ + Nylas + -# Nylas Python SDK +

Nylas Python SDK

-[![PyPI - Version](https://img.shields.io/pypi/v/nylas)](https://pypi.org/project/nylas/) -[![codecov](https://codecov.io/gh/nylas/nylas-python/branch/main/graph/badge.svg?token=HyxGAn5bJR)](https://codecov.io/gh/nylas/nylas-python) +

+ The official Python SDK for Nylas โ€” the infrastructure that powers communications +

-This is the GitHub repository for the Nylas Python SDK. The repo is primarily for anyone who wants to install the SDK from source or make contributions to it. +

+ version + code coverage + downloads + license +

-If you're looking to use Python to access the Nylas Email, Calendar, or Contacts APIs, see our [Python SDK Quickstart guide](https://docs.nylas.com/docs/quickstart-python). +

+ ๐Ÿ“– SDK Guide ยท + ๐Ÿ“š API Reference ยท + ๐Ÿš€ Sign up ยท + ๐Ÿ’ก Samples ยท + ๐Ÿ’ฌ Forum +

+
-The Nylas platform provides REST APIs for [Email](https://docs.nylas.com/docs/quickstart-email), [Calendar](https://docs.nylas.com/docs/quickstart-calendar), and [Contacts](https://docs.nylas.com/docs/quickstart-contacts), and the Python SDK is the quickest way to build your integration using Python. +
-Here are some resources to help you get started: +The official Python SDK for [Nylas](https://developer.nylas.com/docs/v3/) โ€” the infrastructure that powers communications. Integrate with Gmail, Microsoft, IMAP, Zoom, and 250+ email, calendar, and meeting providers in 5 minutes. Covers [Email](https://developer.nylas.com/docs/v3/email/), [Calendar](https://developer.nylas.com/docs/v3/calendar/), [Contacts](https://developer.nylas.com/docs/v3/email/contacts/), [Scheduler](https://developer.nylas.com/docs/v3/scheduler/), [Notetaker](https://developer.nylas.com/docs/v3/notetaker/), and [Agent Accounts](https://developer.nylas.com/docs/v3/agent-accounts/). -- [Sign up for a free Nylas account](https://dashboard.nylas.com/register). -- Follow the [Nylas API v3 Quickstart guide](https://developer.nylas.com/docs/v3-beta/v3-quickstart/). -- Browse the [Nylas SDK reference docs](https://nylas-python-sdk-reference.pages.dev/). -- Browse the [Nylas API reference docs](https://developer.nylas.com/docs/api/). -- See our code samples in the [Nylas Samples repo](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=python). +This repository is for contributors and anyone installing the SDK from source. If you just want to use the SDK in your app, head straight to the [**Python SDK guide**](https://developer.nylas.com/docs/v3/sdks/python/) on developer.nylas.com. -If you have any questions about the Nylas platform, please reach out to support@nylas.com. +## Get started -## โš™๏ธ Install +1. [Sign up for a free Nylas account](https://dashboard-v3.nylas.com/register) and grab your API key from the [Nylas Dashboard](https://dashboard-v3.nylas.com/). +2. Read the [Getting started guide](https://developer.nylas.com/docs/v3/getting-started/) for the core concepts (applications, grants, API keys). +3. Install the SDK and make your first request โ€” see below. -The Nylas Python SDK is available via pip: +You can also bootstrap from the terminal: ```bash -pip install nylas --pre +brew install nylas/nylas-cli/nylas +nylas init ``` -To install the SDK from source, clone this repo and run the install script: +More options in the [CLI getting-started guide](https://cli.nylas.com/guides/getting-started). + +## โš™๏ธ Install + +> **Requirements:** Python 3.8 or later. ```bash -git clone https://github.com/nylas/nylas-python.git && cd nylas-python -python setup.py install +pip install nylas ``` -## โšก๏ธ Usage +To install from source: -Before you use the Nylas Python SDK, you must first [create a Nylas account](https://dashboard.nylas.com/register). Then, follow our [API v3 Quickstart guide](https://developer.nylas.com/docs/v3-beta/v3-quickstart/) to set up your first app and get your API keys. +```bash +git clone https://github.com/nylas/nylas-python.git +cd nylas-python +pip install -e . +``` -For code samples and example applications, take a look at our [Python repos in the Nylas Samples collection](https://github.com/orgs/nylas-samples/repositories?q=&type=all&language=python). +### Runtime support -### ๐Ÿš€ Make your first request +Tested on CPython 3.8+. Runs on standard servers as well as serverless platforms like AWS Lambda, Google Cloud Functions, and Vercel โ€” install `nylas` like any other dependency in your deployment package. -After you've installed and set up the Nylas Python SDK, you can make your first API request. To do so, use the `Client` class from the `nylas` package. +## โšก๏ธ Usage -The SDK is organized into different resources, each of which has methods to make requests to the Nylas API. Each resource is available through the `Client` object that you configured with your API key. For example, you can use this code to get a list of Calendars: +You access Nylas resources (messages, calendars, events, contacts, โ€ฆ) through an instance of `Client`. Initialize it with your API key โ€” and optionally an `api_uri` matching your [data residency](https://developer.nylas.com/docs/dev-guide/platform/data-residency/). ```python +import os from nylas import Client nylas = Client( - api_key="API_KEY", + api_key=os.environ["NYLAS_API_KEY"], + api_uri=os.environ.get("NYLAS_API_URI", "https://api.us.nylas.com"), + timeout=30, # optional, in seconds ) +``` -calendars, request_id, next_cursor = nylas.calendars.list("GRANT_ID") - -event, request_id = nylas.events.create( - identifier="GRANT_ID", - request_body={ - "title": "test title", - "description": "test description", - "when": { - "start_time": start_unix_timestamp, - "end_time": end_unix_timestamp, - } - }, - query_params={"calendar_id": "primary", "notify_participants": True}, - ) -) +Once initialized, use it to make requests against a [grant](https://developer.nylas.com/docs/v3/auth/) (an authenticated end-user account): -event, request_id = nylas.events.find( - identifier="GRANT_ID", - event_id=event.id, - query_params={ - "calendar_id": "primary", - }, +```python +calendars, request_id, next_cursor = nylas.calendars.list( + identifier=os.environ["NYLAS_GRANT_ID"], ) +print(calendars) +``` + +Resources expose a consistent CRUD surface โ€” `create()`, `find()`, `list()`, `update()`, `destroy()` โ€” plus resource-specific methods (e.g. `messages.send()`, `events.send_rsvp()`). Request and response models are [`dataclasses-json`](https://github.com/lidatong/dataclasses-json) dataclasses, so every payload is fully type-hinted and supports `to_dict()` / `from_dict()`. -nylas.events.destroy("GRANT_ID", event.id, {"calendar_id": "primary"}) +### Error handling +The SDK raises typed exceptions you can catch and inspect. Every API error carries a `request_id` and `status_code` โ€” include both when filing a support ticket so we can trace the request end-to-end. + +```python +from nylas import Client +from nylas.models.errors import ( + NylasApiError, + NylasOAuthError, + NylasSdkTimeoutError, +) + +try: + nylas.calendars.list(identifier=grant_id) +except NylasApiError as err: + print(err.status_code, err.type, str(err), err.request_id) +except NylasOAuthError as err: + print(err.error, err.error_code, err.error_description) +except NylasSdkTimeoutError as err: + print("Timed out:", err.url, err.timeout) ``` -## ๐Ÿ“š Documentation +Step-by-step walkthroughs in the SDK guide: -This SDK makes heavy use of [Python 3 dataclasses](https://realpython.com/python-data-classes/) to define the REST resources and request/response schemas of the Nylas APIs. The Client object is a wrapper around all of these resources and is used to interact with the corresponding APIs. Basic CRUD operations are handled by the `create()`, `find()`, `list()`, `update()`, and `destroy()` methods on each resource. Resources may also have other methods which are all detailed in the [reference guide for the Python SDK](https://nylas-python-sdk-reference.pages.dev/). In the code reference, start at `client`, and then `resources` will give more info on available API call methods. `models` is the place to find schemas for requests, responses, and all Nylas object types. +- [Send messages](https://developer.nylas.com/docs/v3/sdks/python/send-email/) +- [Read messages and threads](https://developer.nylas.com/docs/v3/sdks/python/read-messages-threads/) +- [Manage events on a calendar](https://developer.nylas.com/docs/v3/sdks/python/manage-events/) +- [Manage contacts](https://developer.nylas.com/docs/v3/sdks/python/manage-contacts/) +- [Manage folders and labels](https://developer.nylas.com/docs/v3/sdks/python/manage-folders-labels/) -While most resources are accessed via the top-level Client object, note that `auth` contains the sub-resource `grants` as well as a collection of other auth-related API calls. +### Debugging -You'll want to catch `nylas.models.errors.NylasAPIError` to handle errors. +To inspect the raw HTTP traffic the SDK sends, turn on `requests`-level logging: -Have fun!! +```python +import logging -## โœจ Upgrade from v5.x +logging.basicConfig(level=logging.DEBUG) +logging.getLogger("urllib3").setLevel(logging.DEBUG) +``` -See [UPGRADE.md](UPGRADE.md) for instructions on upgrading from v5.x to v6.x. +## ๐Ÿ’ก Examples -## ๐Ÿ’™ Contribute +Runnable examples live in [`examples/`](examples/) โ€” including [send email](examples/send_email_demo/), [inline attachments](examples/inline_attachment_demo/), [folders](examples/folders_demo/), [import events](examples/import_events_demo/), [Notetaker API](examples/notetaker_api_demo/), [Notetaker calendar](examples/notetaker_calendar_demo/), [message fields](examples/message_fields_demo/), [metadata fields](examples/metadata_field_demo/), [provider errors](examples/provider_error_demo/), [response headers](examples/response_headers_demo/), [`select` parameter](examples/select_param_demo/), [special characters](examples/special_characters_demo/), [hidden folders](examples/include_hidden_folders_demo/), and [plain text](examples/is_plaintext_demo/). -Please refer to [Contributing](Contributing.md) for information about how to make contributions to this project. We welcome questions, bug reports, and pull requests. +For full sample apps and product quickstarts, browse [**nylas-samples** on GitHub](https://github.com/orgs/nylas-samples/repositories?q=python) โ€” every official SDK has Email, Calendar, Contacts, Scheduler, and Webhooks quickstarts. -## ๐Ÿ› ๏ธ Debugging +## ๐Ÿค– AI agents -It can sometimes be helpful to turn on request logging during development. Adding the following snippet to your code that calls the SDK should get you sorted: +[nylas/skills](https://github.com/nylas/skills) drops Nylas into Claude Code, Cursor, Codex, and other agents that support the skills format: +```bash +npx skills add nylas/skills +/plugin marketplace add nylas/skills # Claude Code ``` -import logging -import requests -# Set up logging to print out HTTP request information -logging.basicConfig(level=logging.DEBUG) -requests_log = logging.getLogger("requests.packages.urllib3") -requests_log.setLevel(logging.DEBUG) -requests_log.propagate = True +The CLI also installs an MCP server for Claude Desktop, Claude Code, Cursor, Windsurf, or VS Code: + +```bash +brew install nylas/nylas-cli/nylas +nylas mcp install ``` +Walkthrough: [give AI agents email access via MCP](https://cli.nylas.com/guides/give-ai-agents-email-access-via-mcp). + +## ๐Ÿ“š Reference + +- **SDK guide:** [developer.nylas.com/docs/v3/sdks/python](https://developer.nylas.com/docs/v3/sdks/python/) +- **API reference:** [developer.nylas.com/docs/api/v3](https://developer.nylas.com/docs/api/v3/) +- **Python SDK reference:** [nylas-python-sdk-reference.pages.dev](https://nylas-python-sdk-reference.pages.dev/) โ€” generated method/class docs for this SDK +- **Webhooks (notifications):** [developer.nylas.com/docs/v3/notifications](https://developer.nylas.com/docs/v3/notifications/) +- **Auth flows:** [developer.nylas.com/docs/v3/auth](https://developer.nylas.com/docs/v3/auth/) +- **Dev guide & best practices:** [developer.nylas.com/docs/dev-guide](https://developer.nylas.com/docs/dev-guide/) +- **Changelog:** [CHANGELOG.md](CHANGELOG.md) + +## โœจ Upgrading + +See [`CHANGELOG.md`](CHANGELOG.md) for per-release notes. Older upgrade guidance (v5.x โ†’ v6.x) lives in [`UPGRADE.md`](UPGRADE.md). + +## ๐Ÿ’™ Contributing + +Issues, ideas, and pull requests welcome โ€” see [Contributing.md](Contributing.md). Before opening a large change, please open an issue or post in the [forum](https://forums.nylas.com) so we can sanity-check the direction. + +## ๐Ÿ”’ Security + +Found a vulnerability? Please **don't** open a public issue. Report it through our [Vulnerability Disclosure Policy](https://www.nylas.com/security/vulnerability-disclosure-policy/). + +## ๐Ÿ”— Other Nylas SDKs + +- [nylas-nodejs](https://github.com/nylas/nylas-nodejs) ยท `npm install nylas` +- [nylas-ruby](https://github.com/nylas/nylas-ruby) ยท `gem install nylas` +- [nylas-java](https://github.com/nylas/nylas-java) ยท Maven / Gradle (Kotlin too) + ## ๐Ÿ“ License -This project is licensed under the terms of the MIT license. Please refer to [LICENSE](LICENSE) for the full terms. +MIT โ€” see [LICENSE](LICENSE). diff --git a/diagrams/nylas-logo.png b/diagrams/nylas-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..87ad1f17660a56f91345697b5296a52f84033bf6 GIT binary patch literal 24968 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