canonical: https://jentic.com/apis/keeper.app/keeper

# Keeper App Double API

The Double API (the public API for Keeper, the bookkeeping platform) gives bookkeepers and accounting firms programmatic access to clients, branches, files, contacts, assignments, end-of-period closes, and the activity log. The 69 endpoints cover reading and updating the client roster, navigating branch hierarchies, and pulling the audit trail used to track who did what across a practice. Authentication is OAuth2 client credentials - clients exchange a client_id and client_secret at the OAuth token endpoint for a 24-hour bearer token, then attach it to every request. Rate limits are 300 requests per OAuth client per 5-minute window.

## For AI agents

Manage clients, branches, files, contacts, and end-of-period closes inside the Keeper bookkeeping platform via 69 endpoints, authenticated with an OAuth2 client-credentials bearer token.

## Scope

Does not handle journal entries, ledger postings, payroll, or invoicing - use for Keeper practice-management data such as clients, branches, files, and activity logs only.

## Capabilities

- List and update the full client roster across a Keeper practice
- Navigate branch hierarchies to scope client lists to a specific office
- Read end-of-period close records and supporting files for a given client
- Query the activity log to audit who took what action across the practice
- Pull contact records associated with each client for outreach workflows
- Read assignment records that map staff to client engagements

## Use cases

### Accounting Firm Client Roster Sync

Pull the full Keeper client roster into a CRM, billing tool, or internal data warehouse on a schedule so client metadata stays consistent across systems. The /api/clients endpoints support count and detail reads, and /api/clients/summary/count gives a quick portfolio total. Most firms wire up a daily sync in a single afternoon because the OAuth client-credentials flow only needs to refresh once every 24 hours.

Example prompt: GET /api/clients with pagination to fetch the full roster, then POST each new client into the firm's CRM with the Keeper client ID stored on the CRM record

### Practice Activity Audit

Surface practice-wide activity for compliance and review by querying /api/activity-log with date filters and per-client scoping. The endpoint feeds into audit reports that show which staff member touched which client record and when, which is required by many accounting partners during peer review. Pair it with /api/activity-log/count to gauge volume before pulling full pages.

Example prompt: GET /api/activity-log/count for the last 30 days, then page through GET /api/activity-log to build a CSV of staff actions by client

### Client File and Close Document Retrieval

Fetch the files and end-of-period closes attached to a specific client so an automation can attach them to an email, archive them, or feed them into a downstream review tool. The /api/clients/{clientId}/files and /api/clients/{clientId}/end-closes endpoints return the file metadata needed to download and route documents.

Example prompt: GET /api/clients/{clientId}/end-closes for the last quarter, then GET /api/clients/{clientId}/files filtered to the matching close period to retrieve the supporting documents

### AI Agent Bookkeeping Assistant

An AI agent that helps bookkeepers manage their workload uses Jentic to discover and call Keeper operations - listing clients, reading recent activity, and pulling contacts - to answer questions like 'which clients haven't had activity in two weeks'. Jentic injects the bearer token per call so the agent never holds the OAuth client_secret. The agent composes multiple endpoints in one workflow without learning Keeper's REST surface manually.

Example prompt: Through Jentic, call GET /api/clients then GET /api/activity-log per client to surface clients with no activity in the last 14 days

## Key endpoints

| Method | Path | Description |
| --- | --- | --- |
| GET | /api/clients | List clients across the practice |
| POST | /api/clients | Create a new client record |
| GET | /api/clients/{clientId} | Read a single client by ID |
| GET | /api/clients/{clientId}/files | List files attached to a client |
| GET | /api/clients/{clientId}/end-closes | List end-of-period closes for a client |
| GET | /api/activity-log | Query the practice-wide activity log |
| GET | /api/branches | List branches in the practice |
| GET | /api/clients/{clientId}/assignments | List staff assignments for a client |

## Key resources

- **Clients** — List, count, and read individual client records with their assignments, contacts, files, and closes
- **Branches** — Read branch hierarchy used to scope client visibility within a practice
- **Activity Log** — Query and count audit-trail entries across the practice
- **Files and End-Closes** — Retrieve files and end-of-period close records attached to a client

## Why Jentic

- **Setup:** Wiring the Double API by hand means running its OAuth2 flow, minting and refreshing the bearer, and mapping client, file, and activity-log reads to their shapes against api.doublehq.com yourself. Through Jentic you install once, import the Double API from the API Directory, store the OAuth credential once, and your agent calls it.
- **Permission scoping:** The Double API puts the client id in the URL path (/api/clients/{clientId}/...), so a rule can pin your agent to one client: it can read that client's files, assignments, and end-closes and nothing else. You choose the operations it may call, so client creation is not included unless you add it.
- **Credential handling:** Your Keeper client_id and client_secret are stored once, encrypted, by your own Jentic One instance and injected at execution time. Jentic mints and refreshes the OAuth2 bearer, so the secret never enters the agent's prompt, logs, or context.
- **Discovery method:** Agents search Jentic by intent such as 'list clients in Keeper' or 'get a client's activity log', and Jentic returns the matching Double API operation with its input schema so the agent calls the right endpoint without reading the reference docs.

## Related APIs

- **Xero Accounting** — Xero is the underlying ledger that Keeper and the Double API sit on top of for many practices.
- **HubSpot** — HubSpot stores the firm-side CRM record that mirrors Keeper's client roster.
- **Asana** — Asana tracks the tasks tied to each client engagement that Keeper itself does not manage.

## FAQ

### What authentication does the Double API use?

OAuth 2.0 client credentials. POST your client_id and client_secret with grant_type=client_credentials to https://api.doublehq.com/oauth/token to get a bearer token, then attach the token in the Authorization header on every request. Tokens are valid for 24 hours. Through Jentic the client_secret stays in the encrypted vault and Jentic refreshes the bearer for you.

### Can I list every client in a Keeper practice with the Double API?

Yes. GET /api/clients returns the client roster with pagination, and GET /api/clients/summary/count gives a portfolio total without paging. Use GET /api/clients/{clientId} to drill into a single client.

### What are the rate limits for the Double API?

The API enforces 300 requests per 5-minute window per OAuth client on a rolling-window basis. If you exceed this you receive HTTP 429. For high-volume reads, batch by paginating /api/clients rather than calling /api/clients/{clientId} per record.

### How do I pull a client's activity log through Jentic?

Search Jentic for 'get keeper activity log' to find GET /api/activity-log, load its schema, and execute with date and clientId filters. The Jentic flow is pip install jentic, then client.search, client.load, and client.execute - Jentic injects the OAuth bearer at execution time.

### Does the Double API expose end-of-period close records?

Yes. GET /api/clients/{clientId}/end-closes returns the close records for one client, and the related GET /api/clients/{clientId}/files endpoint returns the supporting documents that were attached when the close was completed.

### Can I create new clients through the Double API?

Yes. POST /api/clients accepts the client payload and creates the record inside Keeper. Most practices use the existing onboarding flow in Keeper itself, so this endpoint is mostly used for bulk migrations from another bookkeeping system.

### Can I limit what my agent is allowed to do with the Double API?

Yes. Because you run Jentic One yourself, your own rules decide which Double API operations and credentials the agent may use. Since the client id sits in the URL path (/api/clients/{clientId}/...), you can pin the agent to a single client so it only reads that client's files, assignments, and end-closes and nothing else. You choose the operations it may call, so write actions like POST /api/clients stay off the table unless you explicitly add them.
