# Workday — Accounting API: gotchas

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

## GET /accounting/tax-rates

Workday returns transaction tax codes without rate values: `effective_tax_rate` and `total_tax_rate` are not populated, and each entry in `components` carries only the tax rate's `id` and `name`, without a `rate`. Reference the tax by `code`, or by a component `id`.

## GET /accounting/bills

Workday bills are backed by the SOAP `Get_Supplier_Invoices` operation, which does not
surface a last-modified timestamp through the unified API:

- `updated_at` and `created_at` are not populated — they return empty for Workday bills.
- `filter[updated_since]` is not supported — Workday exposes no last-modified filter for
  supplier invoices, so passing `updated_since` returns an `UnsupportedFiltersError`.
- Sorting is not supported: `sort[by]=updated_at` (or any `sort`) returns
  `UnsupportedSortFieldError`.

Date narrowing is supported via `filter[billed_since]` (invoice document date on or after)
and `filter[due_since]` (invoice due date on or after).

## POST /accounting/invoices

It is required to provide tracking_categories.id in the line items, which corresponds to the worktag/cost_center_id in Workday. It is required to provide the item.id in the line items.

## PATCH /accounting/invoices/{id}

It is required to provide tracking_categories.id in the line items, which corresponds to the worktag/cost_center_id in Workday. It is required to provide the item.id in the line items. Workday only supports `sales_item` and `service` types for line items and this is required.

## GET /accounting/invoice-items

It is required to provide `transaction_type` filter in the request parameters. If `transaction_type` is `purchase`, purchase-items will be returned. If `transaction_type` is `sale`, sales-items will be returned.

## POST /accounting/invoice-items

It is required to provide `sold` and `purchased` fields in the request body. If `sold` is true, sales-item will be created. If `purchased` is true, purchase-item will be created.

## GET /accounting/invoice-items/{id}

It is required to provide `transaction_type` filter in the request parameters. If `transaction_type` is `purchase`, purchase-item will be returned. If `transaction_type` is `sale`, sales-item will be returned.

## PATCH /accounting/invoice-items/{id}

It is required to provide `sold` and `purchased` fields in the request body. If `sold` is true, sales-item will be created. If `purchased` is true, purchase-item will be created.

## GET /accounting/bill-credit-notes

`total_amount` reflects the sum of the credit note's line items. Workday's header-level control total is optional and frequently left unset, so the header value is not relied on; when it is absent the connector reports the line-item total instead.

Only `filter[supplier_id]` and `filter[subsidiary_id]` narrow the list server-side. Other bill-credit-note filters are not offered because Workday's supplier invoice adjustment search has no equivalent server-side criterion — an unsupported filter is rejected rather than silently ignored. The `supplier_id` and `subsidiary_id` values must reference an existing supplier/company; an unknown id is rejected as an invalid reference rather than returning an empty list.

`status` is `authorised` once the credit note is approved, `draft` while unapproved, and `voided` when cancelled.

## POST /accounting/bill-credit-notes

A bill credit note is always issued as a supplier credit (it decreases the amount owed to the supplier). Send positive amounts; the credit direction is fixed and is not derived from the sign of the amount.

`date_issued` is stored as a calendar date — any time component is dropped. `line_items[].total_amount` is the line's extended amount (`unit_price × quantity`).

Create, update and delete require the connection's Workday integration user to be granted access to supplier invoice adjustments. Without that access Workday rejects the write as unauthorized even though read access to the same records succeeds.

Workday requires an adjustment reason on every credit note, and the unified model has no field for it. Send the Workday adjustment reason ID with `pass_through`, for example `[{"service_id": "workday", "extend_paths": [{"path": "$['soapenv:Envelope']['soapenv:Body']['wd:Submit_Supplier_Invoice_Adjustment_Request']['wd:Supplier_Invoice_Adjustment_Data']['wd:Adjustment_Reason_Reference']", "value": {"wd:ID": {"_attributes": {"wd:type": "Adjustment_Reason_ID"}, "_text": "Miscellaneous"}}}]}]`; without it Workday rejects the credit note.

Each line must reference an active Workday purchase item in `line_items[].item.id`; Workday rejects a line that has neither a purchase item nor a spend category, and a spend category cannot be set on a unified credit note line.

## GET /accounting/suppliers

Address lines on supplier reads: when Workday's address format for the country splits the street into components, `addresses[].line1` is built from them in this order: the street type when there is one (for example Spanish `Calle` or `Carrer`), then the street name, then the house number; so a Spanish address reads `Calle Montesa 16` and the house number is also returned as `street_number`. `line1` always places the house number after the street name, even where Workday's own formatted address in `string` puts it first, as for France and South Africa (`Rue Juliette Lamber 13`). When the format has a house number but no labelled street name, the lowest-numbered other component is used as the street name. The remaining typed components (building, unit, floor and similar) fill `line2` to `line5` in Workday's line order. For formats without a street-type or street-name component and without a house-number component (for example the US), `line1` is the lowest-numbered address line as Workday returns it, the others follow in `line2` to `line5`, and `street_number` is omitted.

## POST /accounting/suppliers

In Workday, the supplier_category, display_name, addresses, emails, company_id, currency, terms, and payment_method fields are required to create a supplier. display_name and company_id should be same.

## GET /accounting/suppliers/{id}

Address lines on supplier reads: when Workday's address format for the country splits the street into components, `addresses[].line1` is built from them in this order: the street type when there is one (for example Spanish `Calle` or `Carrer`), then the street name, then the house number; so a Spanish address reads `Calle Montesa 16` and the house number is also returned as `street_number`. `line1` always places the house number after the street name, even where Workday's own formatted address in `string` puts it first, as for France and South Africa (`Rue Juliette Lamber 13`). When the format has a house number but no labelled street name, the lowest-numbered other component is used as the street name. The remaining typed components (building, unit, floor and similar) fill `line2` to `line5` in Workday's line order. For formats without a street-type or street-name component and without a house-number component (for example the US), `line1` is the lowest-numbered address line as Workday returns it, the others follow in `line2` to `line5`, and `street_number` is omitted.

## POST /accounting/journal-entries

Status should be set to "draft" or "posted". Default status is "draft".
Only Journal Entries with `draft` status can be updated.
It is required to provide Cost_Center_Reference_ID as worktag in the line items, otherwise the status will automatically be set to "draft".
A journal entry saved as `draft` returns no `line_items` on Get Journal Entry or List Journal Entries: Workday does not
return the lines of a journal that has not been submitted. The lines are stored, and are returned once the journal is posted.
`source_type` is the Workday journal source; when it is not sent the journal is created with the `Manual_Journal` source.

## GET /accounting/journal-entries/{id}

A journal entry saved as `draft` returns no `line_items` on Get Journal Entry or List Journal Entries: Workday does not
return the lines of a journal that has not been submitted. The lines are stored, and are returned once the journal is posted.

## PATCH /accounting/journal-entries/{id}

Status should be set to "draft" or "posted". Default status is "draft".
Only Journal Entries with `draft` status can be updated.

## GET /accounting/purchase-orders

When using the `supplier_id` filter, the `updated_since` filter should also be included.

## POST /accounting/purchase-orders

It is required to provide supplier.id, issued_date, company_id. Required fields for line items: tracking_categories.id (maps to Workday worktag/cost_center_id), description, category_id, budget, total_amount and type (must be either `sales_item` or `service`). For `sales_item` type, it is required to provide quantity, unit_price and unit_of_measure.
To create a purchase order with a status `draft`, you need to provide the `status` field with a value `draft`. Default status is `open` (approved).

## PATCH /accounting/purchase-orders/{id}

It is required to provide supplier.id, issued_date, company_id. Required fields for line items: tracking_categories.id (maps to Workday worktag/cost_center_id), description, category_id, budget, total_amount and type (must be either `sales_item` or `service`). For `sales_item` type, it is required to provide quantity, unit_price and unit_of_measure.
Note: Only purchase orders with status `draft` can be updated.

## GET /accounting/departments

Departments resource is not supported in Workday.

## GET /accounting/categories

It is required to pass the filter[type] parameter to the request. For supplier categories, use the `supplier` value. For resource/spend categories, use the `expense` value. For revenue categories, use the `revenue` value.
## GET /accounting/categories/{id}

It is required to pass the filter[type] parameter to the request. For supplier categories, use the `supplier` value. For resource/spend categories, use the `expense` value. For revenue categories, use the `revenue` value.

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