# Pennylane — Accounting API: gotchas

> Canonical URL: https://developers.apideck.com/apis/accounting/pennylane/gotchas

## GET /accounting/tax-rates

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/tax-rates

Pennylane has no dedicated tax rates API — VAT rates are a fixed, documented enum of 176 codes (e.g. `FR_200` for France's 20% rate) used directly on invoice/bill lines and ledger accounts, with no per-company variation and no listing endpoint. `taxRatesAll` and `taxRatesOne` return records from this fixed reference list rather than live per-company data; `add`, `update` and `delete` are not supported. A handful of codes (`FR_1_05`, `FR_1_75`, `FR_15_385`, Germany's extra-EU codes, and Spain's reverse-charge codes) encode a rate Pennylane does not document the meaning of, or have no numeric rate at all, and are returned with `effective_tax_rate: null` rather than a guessed value. Despite returning static data, each `taxRatesAll`/`taxRatesOne` call still makes one live request to Pennylane's `/me` endpoint as a required carrier call (its response is ignored) — a valid, connected Pennylane account is required, and the call still counts against Pennylane's rate limit.

## GET /accounting/bills

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/invoices

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/ledger-accounts

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/invoice-items

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/customers

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/suppliers

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/journal-entries

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/purchase-orders

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/attachments/{reference_type}/{reference_id}

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/bank-accounts

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/journals

`type` values beyond `purchase`, `sales`, `bank`, `cash` and `general` are not distinguished and are surfaced as `other`. `allow_vat` and `currency` are not exposed and are always absent.

## GET /accounting/fiscal-periods

Pennylane exposes fiscal years only, so every record has `type: year` and `period_number`, `is_adjustment` and `locked_through` are not available. `name` is derived from the dates (for example `2026`, or `2025-2026` for a fiscal year spanning two calendar years); `fiscal_year` is the calendar year the fiscal year ends in (`2026` for both). `status` maps Pennylane's `open` and `reopen` to `open` and `closed` to `closed`; `frozen` returns a null `status`, because Pennylane does not document whom a frozen year stops.

## GET /accounting/fiscal-periods/{id}

Pennylane has no endpoint for a single fiscal year, so this lists the company's fiscal years and returns the matching one.

## GET /accounting/trial-balance

Pennylane's trial balance is a movement report, not an as-of balance: Apideck requests the postings from the first day of the fiscal year that contains `end_date` (from Pennylane's fiscal years) up to `end_date`, which is today in UTC when left out, or the last day of the last fiscal year when today is after it. Income and expense accounts are therefore year-to-date. Balance sheet accounts are correct as of `end_date` only when earlier years' balances were carried forward into that fiscal year, as Pennylane does when a year is closed, so the request returns a `422` while an earlier fiscal year is still open or reopened. A company without fiscal years returns a `422`, and an explicit `filter[end_date]` outside every fiscal year returns a `400`. Customer and supplier sub-accounts are rolled up into their general account, and accounts with a zero balance are left out. `code` is the 9-digit account number and every line has `line_type` `account`; `account_id` is null because Pennylane's report carries no ledger account id, so match lines to ledger accounts on `code`. `currency` is null. Pennylane reports on the accrual basis: `filter[accounting_method]=accrual` is accepted and `cash` returns a `400`. All report pages are fetched before responding, so a large chart of accounts costs several Pennylane requests. A report whose debits and credits differ by half a cent or more returns a `502`.
## GET /accounting/tracking-categories

Pennylane is multi-plan native (`/analytic-plans` + `/analytic-accounts`). The unified
`tracking-categories` resource flattens to one default plan; ids are unique within that plan but
may collide across plans. Use `?raw=true` to retrieve the full multi-plan structure.

## GET /accounting/tracking-categories

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/bank-feed-statements

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/categories

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.

## GET /accounting/quotes

Pennylane does not expose a total record count in list responses. `meta.total_count` will not appear.


[API reference](https://developers.apideck.com/apis/accounting/reference.md) · [Coverage matrix](https://developers.apideck.com/apis/accounting/coverage)
