{"library":"pyxero","title":"PyXero","description":"PyXero is a community-maintained Python library for accessing the Xero accounting software's REST API. It provides a convenient object-oriented interface to interact with various Xero entities like contacts, invoices, and accounts. The library is actively maintained with irregular but consistent releases, primarily focusing on supporting Xero's evolving API and compatible Python versions.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install pyxero"],"cli":null},"imports":["from xero import Xero","from xero.oauth2 import XeroOAuth2"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nfrom xero import Xero\n\n# Set these environment variables with your Xero OAuth2 credentials:\n# XERO_ACCESS_TOKEN: Your active Xero OAuth2 access token.\n# XERO_TENANT_ID: The Xero organization (tenant) ID you want to connect to.\n# To obtain these, you must first complete the Xero OAuth2 authorization flow\n# (involving redirecting a user to Xero for consent and obtaining tokens).\naccess_token = os.environ.get('XERO_ACCESS_TOKEN', '')\ntenant_id = os.environ.get('XERO_TENANT_ID', '')\n\nif not access_token:\n    print(\"Error: Please set the XERO_ACCESS_TOKEN environment variable.\")\n    print(\"Refer to pyxero documentation for OAuth2 authorization flow details.\")\n    exit(1)\nif not tenant_id:\n    print(\"Error: Please set the XERO_TENANT_ID environment variable.\")\n    print(\"You can find the tenant ID after completing the OAuth2 authorization.\")\n    exit(1)\n\ntry:\n    xero = Xero(tenant_id, access_token)\n\n    # Example: Fetch the first 5 contacts\n    contacts = xero.contacts.all()\n    print(f\"Successfully fetched {len(contacts)} contacts. Displaying first 5:\")\n    for i, contact in enumerate(contacts):\n        if i >= 5:\n            break\n        print(f\"- {contact.Name} (ID: {contact.ContactID})\")\n\nexcept Exception as e:\n    print(f\"An error occurred: {e}\")\n    print(\"Please ensure your XERO_ACCESS_TOKEN and XERO_TENANT_ID are valid and have the necessary permissions.\")\n","lang":"python","description":"This quickstart demonstrates how to initialize the PyXero client and fetch data using a pre-obtained OAuth2 access token and tenant ID. For initial authentication and token management (obtaining the access token and handling refreshes), refer to the official PyXero GitHub documentation on OAuth2 setup, which typically involves a web application flow to get the initial tokens.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"0.9.5","pypi_latest":"0.9.5","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.3,"avg_import_s":0.84,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.85,"mem_mb":16.6,"disk_size":"40.7M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.5,"import_time_s":0.61,"mem_mb":16.6,"disk_size":"41M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1,"mem_mb":18.2,"disk_size":"43.4M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.88,"mem_mb":18.2,"disk_size":"44M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":1.01,"mem_mb":18.1,"disk_size":"35.0M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.8,"import_time_s":0.89,"mem_mb":18.1,"disk_size":"35M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.91,"mem_mb":18.9,"disk_size":"34.7M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":2.8,"import_time_s":0.89,"mem_mb":18.9,"disk_size":"35M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.74,"mem_mb":16.2,"disk_size":"40.7M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"pyxero","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4,"import_time_s":0.66,"mem_mb":16.2,"disk_size":"41M"}]}}