Skip to main content

frappectl

CI PyPI Version MIT License

A command-line REST API v2 client for Frappe v16+ — built for humans and AI agents.

Using an agent? Start with frappectl guide. It fits site selection, core verbs, filtering and the raw-API escape hatch on one screen.

frappectl auth login https://erp.example.com         # key/secret → OS keyring
frappectl -s raven doc list "Raven Channel" --json    # -s/--site selects a profile

frappectl doc list "Sales Invoice" -f status=Overdue -f 'grand_total>1000' \
  --fields name,customer,grand_total --all --json
frappectl doc get "Sales Invoice" SINV-0001
frappectl doc create ToDo --set description="Follow up" --set priority=High
cat invoice.json | frappectl doc create "Sales Invoice"
frappectl doc submit "Sales Invoice" SINV-0001
frappectl doc delete ToDo abc123

frappectl doctype show "Sales Invoice" --json         # discover the schema first
frappectl report run "Accounts Receivable" -f company="Frappe" --json
frappectl -s raven query 'select count(*) as users from tabUser'
frappectl file upload ./contract.pdf --doctype "Sales Invoice" --name SINV-0001 --private
frappectl api method/frappe.client.get_count -F doctype=User
frappectl api method/gameplan.api.get_unread_count    # raw API, when verbs aren't enough

Install

uv tool install frappectl
# or: pip install frappectl
# development version: uv tool install git+https://github.com/frappe/frappectl

This installs two commands: frappectl and its short alias fr.

Authentication

frappectl supports 3 authentication paths.

Environment variables

Environment variables always win and never touch the keyring.

export FRAPPE_SITE=https://erp.example.com
export FRAPPE_API_KEY=xxxxxxxx
export FRAPPE_API_SECRET=yyyyyyyy

Stored profiles

Generate an API key + secret from User → Settings → API Access, then log in:

frappectl auth login https://erp.example.com
frappectl auth login https://raven.example.com --name raven
frappectl auth login https://raven.example.com --name raven --default
frappectl auth list
frappectl auth default raven                          # change the default
frappectl -s raven doc list "Raven Channel"           # select per command
frappectl auth whoami

The site URL lives in ~/.config/frappe/config.json; the secret lives in the OS keyring. There is no plaintext fallback. If the machine has no keyring, use environment variables.

OAuth

Interactive login selects OAuth by default. It stores no secret; short-lived access tokens refresh automatically.

frappectl auth login https://erp.example.com
frappectl auth login https://erp.example.com --client-id <public-client-id>

Sites with dynamic client registration create the client automatically. Frappe v15+ supports this by default; other sites need a pre-registered public --client-id.

OAuth needs a terminal and local browser, so it isn't the headless path. Use --oauth to skip the authentication-method prompt.

Read-only profiles

A new profile is read-only by default and refuses every unsafe HTTP method before the request leaves your machine. This removes the obvious production footgun: an exploratory command can't accidentally mutate the site. Choose --writable during login to opt out.

frappectl auth login https://prod.example.com --name prod
frappectl auth login https://dev.example.com --name dev --writable
frappectl auth configure prod --read-only             # lock an existing profile
frappectl auth configure prod --writable              # allow writes again

This blocks doc create/update/delete/submit, file upload, and method calls through api/method. Reads such as doc list/get, doctype show, and report run keep working.

For environment-variable auth, set FRAPPE_READ_ONLY=1. To invoke a whitelisted read method, make the safe verb explicit: frappectl api method/… -X GET.

Output and scripting

  • TTY → rich tables and colours.
  • Pipe or --json → clean JSON on stdout. Logs and errors stay on stderr, so piping to jq is safe.
  • Mutations → run immediately, no confirmation prompt. It's assumed you know what you're doing.
  • Exit codes → 0 success, 1 failure, 2 usage error.
  • --debug → traces method, URL and headers to stderr. Credentials are redacted. For endpoints that expose it, such as doc list, it also prints server-side SQL.

Server error detail is plain text; HTML is stripped. --debug never touches stdout, so it won't corrupt --json output.

Commands

Command What it does
frappectl doc list <DocType> List documents. Supports -f, --fields, --limit and --all.
frappectl doc get <DocType> <name> Fetch one document.
frappectl doc create <DocType> Create from --set scalars and/or piped/--input JSON.
frappectl doc update <DocType> <name> Update optimistically; use --force to override.
frappectl doc delete <DocType> <name> Delete a document.
frappectl doc submit|cancel|amend Run document lifecycle actions.
frappectl doctype list / frappectl doctype show <name> Discover doctypes and schema.
frappectl report run <name> Run a report with the same filter syntax as doc list.
frappectl query <sql> Run read-only SQL through System Console and print a table. Requires System Manager or Administrator.
frappectl method search|list|show Discover whitelisted methods (RPC paths and doctype methods).
frappectl method call <path> Invoke an RPC method; add --doctype/--name to call a doctype method.
frappectl file upload|download Transfer files; upload supports --doctype/--name and --private.
frappectl api <path> Call raw v2 APIs: frappectl api method/<path> -F key=value.
frappectl guide Print the agent primer; no site or authentication needed.
frappectl assistant [pi|claude|codex] Launch a coding agent configured as a Frappe assistant.
frappectl update Self-upgrade via uv tool upgrade.

Filtering

Simple filters use -f. Repeat the flag to combine them:

frappectl doc list ToDo -f status=Open -f priority=High
frappectl doc list "Sales Invoice" -f 'grand_total>1000' -f 'customer like %Inc%'

For in, between, child-table filters or anything else that doesn't fit cleanly in a shell argument, pass full Frappe filter JSON:

frappectl doc list "Sales Invoice" --filters-json '[["status","in",["Paid","Overdue"]]]'

License

MIT

Metadata

Release files for frappectl 0.17.0

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

Source distribution (sdist)

Source distribution for frappectl 0.17.0
File Size Uploaded
frappectl-0.17.0.tar.gz 117.9 kB Details

Built distribution (wheel)

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

Total release size: 181.6 kB

Release files / frappectl-0.17.0.tar.gz

Download URL frappectl-0.17.0.tar.gz
Size 117.9 kB
Tags Source
SHA-256 checksum
How to use checksums
2bfe7a24b5464c1cf7064fd8a0c76c9b175ec57f204534e7464b9d7d44fe55b6
BLAKE2b-256 checksum
How to use checksums
4fbe7be70a54415f0e808f36167033cb2f42c06c4acd800ea6d72a6659a8b549
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / frappectl-0.17.0-py3-none-any.whl

Download URL frappectl-0.17.0-py3-none-any.whl
Size 63.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9e40cf04da8574a5eae0f124bb6ca4c3b8080ef1ae46b406455e655fc7989dab
BLAKE2b-256 checksum
How to use checksums
24bb8b85a22ad3ac2acb4de01fa75644e560d74f8f715067de0737432b214fe6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.19.0

2 release files

0.18.1

2 release files

0.18.0

2 release files

This release

0.17.0 This release

2 release files

0.16.1

2 release files

0.16.0

2 release files

0.15.2

2 release files

0.15.1

2 release files

0.15.0

2 release files

0.14.0

2 release files

0.13.4

2 release files

0.13.3

2 release files

0.13.2

2 release files

0.13.1

2 release files

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