Deltek Ajera Python API Client
Project description
Deltek Ajera Python client
A typed Python client and command-line interface for the Deltek Ajera API.
Ajera exposes a single JSON-RPC style endpoint; this package wraps it in an ergonomic, fully type-hinted client built on Pydantic models, plus an ajera CLI for quick access from the terminal. Responses are validated and normalized into predictable Python objects so you can work with employees, projects, vendors, invoices, and general-ledger data without hand-rolling request payloads.
Features
- Typed models - every response is parsed into Pydantic models with descriptive fields.
- Python client and CLI - use it as a library or straight from the shell via
ajera. - Sensible defaults - handles session tokens and per-method API versions for you.
- Read and write - list, get, update, and create across the supported APIs.
Installation
pip install ajera
# or, with uv:
uv add ajera
Requires Python 3.12+.
Configuration
Credentials are read from environment variables (or can be passed directly to AjeraClient):
| Variable | Description |
|---|---|
AJERA_API_URL |
The Ajera API endpoint URL for your tenant. |
AJERA_API_USERNAME |
API username. |
AJERA_API_PASSWORD |
API password. |
export AJERA_API_URL="https://ajera.com/V0000000/AjeraAPI.ashx?..."
export AJERA_API_USERNAME="your-username"
export AJERA_API_PASSWORD="your-password"
For setting up an API user and generating credentials, see the Deltek Ajera Learning Hub API docs.
Timeouts and retries
Every request carries a timeout (default (5, 30) seconds for connect and read)
so a stalled connection can't hang the caller forever. Pass timeout= to
override it — a single float, a (connect, read) tuple, or None to disable —
and retries= to retry connection-establishment failures:
# Wait longer, and retry a dropped/stale connection up to 3 times.
client = AjeraClient(timeout=60, retries=3)
An int for retries retries only the connection stage (before any bytes reach
the server), which is safe for the non-idempotent writes this client performs —
a create whose response is merely lost is never resubmitted. For finer control,
pass a preconfigured urllib3 Retry instead. The CLI reads AJERA_API_TIMEOUT
(seconds) and AJERA_API_RETRIES (count) for the same behavior.
Quick start
Python
from ajera import AjeraClient
# Reads AJERA_API_URL / AJERA_API_USERNAME / AJERA_API_PASSWORD from the
# environment, or pass url=, username=, password= explicitly.
client = AjeraClient()
for employee in client.list_employees():
print(employee.employee_key, employee.first_name, employee.last_name)
CLI
$ ajera employees list
[
{
"employee_key": 42,
"first_name": "John",
"last_name": "Smith",
...
},
...
]
Note: List commands backed by an active/inactive status return only active records by default. Pass
--statusto override - e.g.--status Inactive, or--status Active --status Inactiveto include both.
Reference Documentation
This client adheres (to the extent possible) to the API documentation provided by Deltek Ajera, which can be found at:
https://help.deltek.com/product/Ajera/api/index.html
API reference
Each section below maps a CLI command group to the Ajera API(s) it is built on. The Python client
exposes the same operations as client.<method>() (e.g. client.list_employees(),
client.get_projects(...)).
Employees
Docs: Employees API · List Methods API
pays, payroll-taxes, and wage-tables come from the List Methods API; the rest come from the Employees API.
| Command | Description |
|---|---|
ajera employees list |
List employees. |
ajera employees get <key>... |
Get one or more employees by key. |
ajera employees update <key> [options] |
Update simple fields on one employee. |
ajera employees types |
List employee types. |
ajera employees deductions |
List deductions. |
ajera employees fringes |
List fringes. |
ajera employees pays |
List pay types. |
ajera employees payroll-taxes |
List payroll taxes. |
ajera employees wage-tables |
List wage tables. |
Clients
Docs: Clients API
| Command | Description |
|---|---|
ajera clients list |
List clients. |
ajera clients get <key>... |
Get one or more clients by key. |
ajera clients update <key> [options] |
Update simple fields on one client. |
ajera clients types |
List client types. |
Contacts
Docs: Contacts API
| Command | Description |
|---|---|
ajera contacts list |
List contacts. |
ajera contacts get <key>... |
Get one or more contacts by key. |
ajera contacts update <key> [options] |
Update simple fields on one contact. |
ajera contacts types |
List contact types. |
Vendors
Docs: Vendors API · Vendor Invoices API (v2)
The invoices subcommands come from the Vendor Invoices (v2) API; the rest come from the Vendors API.
| Command | Description |
|---|---|
ajera vendors list |
List vendors. |
ajera vendors get <key>... |
Get one or more vendors by key. |
ajera vendors update <key> [options] |
Update simple fields on one vendor. |
ajera vendors types |
List vendor types. |
ajera vendors invoices list |
List vendor invoices, optionally filtered. |
ajera vendors invoices get <key>... |
Get one or more vendor invoices, with their line items. |
ajera vendors invoices create [options] |
Create a vendor invoice with a single line item. |
Projects
Docs: Projects API (v2) · Projects API (v1) · List Methods API
list, get, update, and create use the v2 Projects API; totals, types, and templates
use the v1 Projects API; chargeable-phases comes from the List Methods API.
| Command | Description |
|---|---|
ajera projects list |
List projects, optionally filtered. |
ajera projects get <key>... |
Get one or more projects by key. |
ajera projects create <description> [options] |
Create a new project. |
ajera projects update <key> [options] |
Update simple fields on one project. |
ajera projects totals <key> |
Get a project's financial totals. |
ajera projects types |
List project types. |
ajera projects templates list |
List project templates, optionally filtered. |
ajera projects templates get <key>... |
Get one or more project templates by key. |
ajera projects chargeable-phases <project-key> |
List the chargeable phases of a project. |
General Ledger
Docs: GL Accounts API · List Methods API
account-groups comes from the List Methods API; list and get come from the GL Accounts API.
| Command | Description |
|---|---|
ajera ledger list |
List general ledger accounts. |
ajera ledger get [id]... |
Get general ledger account details, with calculated amounts. |
ajera ledger account-groups |
List general ledger account groups. |
Reference lists
Docs: List Methods API
Lightweight lookup lists. (Other List Methods endpoints are grouped with their domain - see
employees, ledger, and projects above.)
| Command | Description |
|---|---|
ajera activities |
List activities. |
ajera bank-accounts |
List bank accounts. |
ajera companies |
List companies. |
ajera departments |
List departments. |
ajera invoice-formats |
List invoice formats. |
ajera rate-tables |
List rate tables. |
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ajera-0.2.0.tar.gz.
File metadata
- Download URL: ajera-0.2.0.tar.gz
- Upload date:
- Size: 49.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d0f24e855668e0558c36cfed6ab3224865b44e82d9f2312ee3d6c83c8fca896
|
|
| MD5 |
9c6454a31e6cbac15a90d6f96e8b15f5
|
|
| BLAKE2b-256 |
8e07bf404a5b19af1cf9074bd94255e27dc507abb2f8e756234c9f3bd8991ef9
|
Provenance
The following attestation bundles were made for ajera-0.2.0.tar.gz:
Publisher:
publish.yaml on sbo-inc/ajera
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ajera-0.2.0.tar.gz -
Subject digest:
9d0f24e855668e0558c36cfed6ab3224865b44e82d9f2312ee3d6c83c8fca896 - Sigstore transparency entry: 2195594172
- Sigstore integration time:
-
Permalink:
sbo-inc/ajera@109f2b976de2d7fcb6ab1dc3f9db607c8c6e732c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/sbo-inc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@109f2b976de2d7fcb6ab1dc3f9db607c8c6e732c -
Trigger Event:
push
-
Statement type:
File details
Details for the file ajera-0.2.0-py3-none-any.whl.
File metadata
- Download URL: ajera-0.2.0-py3-none-any.whl
- Upload date:
- Size: 70.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
619c2056bd395c2019364755074fc6dffd4b4982820859eed55c36c60359e887
|
|
| MD5 |
f485272b8306ca66f67987dbff7576d9
|
|
| BLAKE2b-256 |
e17d7d1b0ab1dc6847dbdd304b627654084a74f58fbd6f38e59a1dd2eb688a25
|
Provenance
The following attestation bundles were made for ajera-0.2.0-py3-none-any.whl:
Publisher:
publish.yaml on sbo-inc/ajera
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ajera-0.2.0-py3-none-any.whl -
Subject digest:
619c2056bd395c2019364755074fc6dffd4b4982820859eed55c36c60359e887 - Sigstore transparency entry: 2195594182
- Sigstore integration time:
-
Permalink:
sbo-inc/ajera@109f2b976de2d7fcb6ab1dc3f9db607c8c6e732c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/sbo-inc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yaml@109f2b976de2d7fcb6ab1dc3f9db607c8c6e732c -
Trigger Event:
push
-
Statement type: