Skip to main content

pyadtpulse - Python interface for ADT Pulse

Python client interface to the ADT Pulse security system.

PyPi License Donate

UNSUPPORTED

This is an unsupported interface provided only as a basis for others to explore integrating their ADT system wtih their own tools. PLEASE FEEL FREE TO CONTRIBUTE CHANGES! Pull requests are accepted.

While two or three Python clients to ADT Pulse existed, they generally only provided arm/disarm support and none provided support for ADT Pulse when multiple sites existed under a single account. This attempts to provide APIs to both all the zones (motion sensors, door sensors, etc) as well as arming and disarming individual sites.

NOTE: Since this interacts with the unofficial ADT Pulse AJAX web service, the behavior is subject to change by ADT without notice.

Making Contributions

Want to contribute? See the Development documentation for setup instructions.

WARNING

Do not reauthenticate to the ADT service frequently as ADT's service is not designed for high volume requests. E.g. every 5 minutes, not seconds. Keep your authenticated session to avoid logging in repeatedly.

Installation

pip install pyadtpulse

Usage

Since ADT Pulse automatically logs out other sessions accessing the same account, a best practice is to create a new username/password combination for each client accessing ADT Pulse.

Additionally, since pyadtpulse currently does not support multiple sites (premises/locations), a simple approach is to create a separate username/password for each site and configured such that the username only has access to ONE site. This ensures that clients are always interacting with that one site (and not accidentally with another site location).

Notes

  • any changes to the name/count of sites are not automatically updated for existing site objects

Examples

adt = PyADTPulse(username, password, fingerprint)

for site in adt.sites:
    site.status
    site.zones

    site.disarm()
    site.arm_away()
    site.arm_away(force=True)

Async version (preferred for new integrations):

adt = PyADTPulse(username, password, fingerprint, do_login=false)

await adt.async_login()

for site in adt.sites:
    site.status
    site.zones

    await site.async_disarm()
    await site.async_arm_away()
    await site.async_arm_away(force=True)

The pyadtpulse object runs background tasks and refreshes its data automatically.

Certain parameters can be set to control how often certain actions are run.

Namely:

adt.poll_interval = 0.75  # check for updates every 0.75 seconds
adt.relogin_interval = 60 # relogin every 60 minutes
adt.keepalive_interval = 10 # run keepalive (prevent logout) every 10 minutes

See example-client.py for a working example.

Browser Fingerprinting

ADT Pulse requires 2 factor authentication to log into their site. When you perform the 2 factor authentication, you will see an option to save the browser to not have to re-authenticate through it.

Internally, ADT uses some Javascript code to create a browser fingerprint. This (very long) string is used to check that the browser has been saved upon subsequent logins. It is the "fingerprint" parameter required to be passed in to the PyADTPulse object constructor.

Notes:

The browser fingerprint will change with a browser/OS upgrade. While it is not strictly necessary to create a separate username/password for logging in through pyadtpulse, it is recommended to do so.

Warning: If another connection is made to the Pulse portal with the same fingerprint, the first connection will be logged out. For this reason it is recommended to use a browser/machine you would not normally use to log into the Pulse web site to generate the fingerprint.

There are 2 ways to determine this fingerprint:

  1. Visit this link using the same browser you used to authenticate with ADT Pulse. This should determine the correct browser fingerprint

  2. Follow the instructions here

See Also

Future Enhancements

Feature ideas:

  • 2 factor authenciation
  • Cameras (via Janus)

Feature ideas, but no plans to implement:

Release files for pyadtpulse 1.2.14

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pyadtpulse 1.2.14
File Size Uploaded
pyadtpulse-1.2.14.tar.gz 37.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pyadtpulse 1.2.14
File Interpreter ABI Platform
pyadtpulse-1.2.14-py3-none-any.whl Python 3 none any Details

Total release size: 84.8 kB

Release files / pyadtpulse-1.2.14.tar.gz

Download URL pyadtpulse-1.2.14.tar.gz
Size 37.8 kB
Tags Source
SHA-256 checksum
How to use checksums
234898973db89d3c5d2205c50a1f8f80ed94930fb1d4d4ba25204e3465c01ed1
BLAKE2b-256 checksum
How to use checksums
eef0e9d1ec89f3082cad4fa276aec7d58e5601be431e65ea5482ec7be91f2361
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 6, 2026.

Transparency log

Release files / pyadtpulse-1.2.14-py3-none-any.whl

Download URL pyadtpulse-1.2.14-py3-none-any.whl
Size 47.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ad54d986c20022d16eec1fddf70f73cd0ed9ef2dc1e574184685686fc2a10761
BLAKE2b-256 checksum
How to use checksums
2d9864e0cbb6dbbf338c7adf263af0d0b68de807cacd83969e246fa648bfaf50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Mar 6, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.2.14 This release

2 release files

1.2.12

2 release files

1.2.11

2 release files

1.2.9

2 release files

1.2.8

2 release files

1.2.7

2 release files

1.2.6

2 release files

1.2.5

2 release files

1.2.4

2 release files

1.2.3

2 release files

1.2.2

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.5

1 release file

1.1.4

1 release file

1.1.3

1 release file

1.1.2

1 release file

1.1.1

1 release file

1.1.0

2 release files

1.0.5

2 release files

1.0.4

1 release file

1.0.3

1 release file

1.0.2

1 release file

1.0.1

1 release file

1.0.0

1 release file

0.3.0

1 release file

0.2.11

1 release file

0.2.10

1 release file

0.2.9

1 release file

0.2.8

1 release file

0.2.7

1 release file

0.2.6

1 release file

0.2.5

1 release file

0.2.4

1 release file

0.2.3

1 release file

0.2.2

1 release file

0.2.1

1 release file

0.2.0

1 release file

0.1.6

1 release file

0.1.5

1 release file

0.1.4

1 release file

0.1.3

1 release file

0.1.2

1 release file

0.1.1

1 release file

0.1.0

1 release file

0.0.11

1 release file

0.0.10

1 release file

0.0.9

1 release file

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

0.0.1

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page