pydcapi: Unofficial Python library for Adobe Document Cloud
pydcapi is a typed client for the private API behind Acrobat web
(dc-api-v2.adobe.io): folders, assets, uploads, PDF operations, jobs, user info.
It is generated from Adobe's own discovery document and JSON schemas, so every
operation returns a pydantic model.
It is unofficial. It uses the same session mechanism as the web app, so it can break without notice and it is your responsibility to stay within Adobe's terms.
Install
pip install pydcapi
Python 3.10+. Dependencies: httpx2, pydantic>=2, uritemplate.
Quickstart
import pydcapi
from pydcapi import credentials
client = pydcapi.Client(credentials.JSONFileCredentialsProvider("credentials.json"))
me = client.users.get_user(fields="identity")
print(me.identity.email)
root = client.folders.get_system_folders().roots.document_cloud.root_uri
listing = client.folders.list(folder_uri=str(root), order_by="name", sort_order="ascending")
for member in listing.members:
print(member.name)
Authentication
There is no public OAuth client for this API. Authentication piggybacks on the browser session of a logged-in Acrobat web user:
| Credential | Lifetime | Where it comes from |
|---|---|---|
ims_sid |
long-lived session cookie | your browser, after logging in to acrobat.adobe.com |
aux_sid |
long-lived session cookie | same; optional, ims_sid alone is enough |
token |
24 hours | minted automatically from ims_sid via Adobe IMS |
expiry |
hours | schema expiry timestamp, fetched automatically |
You only ever need to supply ims_sid. The client obtains and renews the
access token on its own, and hands renewed values back to your
CredentialsProvider, so a provider that persists (JSONFileCredentialsProvider)
keeps itself up to date.
Treat ims_sid like a password: it is a full login to your Adobe account.
Getting ims_sid from the browser
- Open https://acrobat.adobe.com/link/home/ in Chrome and sign in.
- Open DevTools (Cmd+Opt+I), go to Application > Storage > Cookies.
- Select
https://acrobat.adobe.com, find the cookie namedims_sid(domain.services.adobe.com). It is a ~770 character opaque string. - Copy its value. Optionally also copy
aux_sid(domain.adobe.com).
Put it in a credentials file:
{ "ims_sid": "AUU3RIS...", "aux_sid": "" }
or in the environment as IMS_SID and use EnvCredentialsProvider().
Scripted alternative with agent-browser:
agent-browser --session adobe --profile ~/.config/pydcapi/browser --headed open https://acrobat.adobe.com/link/home/
# sign in in the window that opens, then:
agent-browser --session adobe cookies get --json | jq -r '.data.cookies[] | select(.name=="ims_sid") | .value'
How long does it last?
The cookie itself is issued with a one-year expiry, and every token refresh
rotates it (old values stay valid). What ends a session server-side is
signing out in the browser, changing the password, revoking sessions in the
Adobe account settings, or Adobe's own inactivity limit, which is not
documented. If your session stops working the client raises
pydcapi.AuthenticationError; log in again and copy a fresh ims_sid.
Credential providers
StaticCredentialsProvider(dict)for in-memory use.EnvCredentialsProvider(prefix="")readsIMS_SID,AUX_SID,TOKEN,EXPIRY.JSONFileCredentialsProvider(path)reads and writes a JSON file, including the renewed token.~is expanded, the file is created on first write with mode0600.- Anything with
get() -> Credentialsandset(Credentials) -> None.
Development
uv sync
cp .env.example .env # then paste your IMS_SID
uv run pytest
uv run ruff check && uv run ruff format --check && uv run mypy
tests/test_client.py holds live integration tests against your account; they
are skipped without credentials. The rest runs offline. CI runs the same
commands on the oldest and newest supported Python.
src/pydcapi/models and src/pydcapi/resources are generated; do not edit by hand.
Release files for pydcapi 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pydcapi-0.3.0.tar.gz | 52.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pydcapi-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 149.9 kB
Release files / pydcapi-0.3.0.tar.gz
| Download URL | pydcapi-0.3.0.tar.gz |
|---|---|
| Size | 52.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1b3a5f75b97e63442dcbbda79c83f49780f52985d49b630eab310074ee20387d
|
|
BLAKE2b-256 checksum How to use checksums |
bd04d6cab2a383c858207b981d3033ce500e4ab2e4c6215d6c1b6c0d85b79d1b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 12, 2026.
Transparency logRelease files / pydcapi-0.3.0-py3-none-any.whl
| Download URL | pydcapi-0.3.0-py3-none-any.whl |
|---|---|
| Size | 97.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ba331a99698dcf7eeed6a7fa4b54f7feb60f5a6cf8874f2cb6ec46c741ddc2d0
|
|
BLAKE2b-256 checksum How to use checksums |
20e6310fa98a27c4413323e5120a9d65ff4d960de0ea5133f73649f1f2f465d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Sep 12, 2026.
Transparency log