ExpensesGet a project expense

Get a project expense

Returns one project expense — cost, sales price, profit ratio, supplier data and short-lived PDF download URLs.

Reads a project expense (a company cost booked on a project: supplier invoice, purchase, subcontractor) by its integer ID. Costs and sales prices are net of VAT and come in three currencies (purchase, project, system); see ProjectExpenseRead for each amount's currency. Attached PDFs are returned as download URLs valid for about 15 minutes; attached images are not listed. Do not rely on IsApproved.

Use it to:

  • BPP / purchase-invoice integration (e.g. a document-capture add-on that books supplier invoices on projects) confirming a cost it created and fetching the attached invoice PDF
  • ERP integration reconciling a supplier invoice line with the project cost and the price re-invoiced to the customer

Not for:

  • Employee out-of-pocket expenses — GET /v1/employee-expense/{employeeExpenseID} (a project-expense ID is not valid there, and vice versa)
  • Listing a project's costs — GET /v1/project-expense

Behaviour:

  • Idempotent.
  • Safe to retry.
  • Changes are visible to the next read immediately.

Call first: GET /v1/project-expense, POST /v1/project-expense

See also: GET /v1/employee-expense/{employeeExpenseID}

Not yet documented: examples.

curl -X GET "https://app3.timelog.com/your-account/api/v1/project-expense/123" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
{
  "Properties": {
    "ProjectExpenseID": 123,
    "ExpenseNo": "example_string",
    "ProjectID": 123,
    "EmployeeID": 123,
    "PurchaseDate": "2024-12-25T10:00:00Z",
    "InvoiceNo": "example_string",
    "CustomerID": 123,
    "ExpenseCurrencyISO": "example_string",
    "AmountExpenseCurrency": 3.14,
    "VatExpenseCurrency": 3.14,
    "ExpenseDirectProjectExchangeRate": 3.14,
    "ProjectCurrencyISO": "example_string",
    "ExpenseCostProjectCurrency": 3.14,
    "ExpenseCostSystemCurrency": 3.14,
    "ProfitRatio": 3.14,
    "SalesPriceProjectCurrency": 29.99,
    "SalesPriceSystemCurrency": 29.99,
    "SalesPriceProjectExchangeRate": 29.99,
    "InvoicedAmountSystemCurrency": 3.14,
    "InvoicedAmountProjectCurrency": 3.14,
    "Comment": "example_string",
    "PaymentMethodID": 123,
    "ExpenseTypeID": 123,
    "IsBillable": true,
    "IsApproved": true,
    "ApprovedBy": 42,
    "InvoiceLineID": 123,
    "UnitType": 42,
    "ProductNo": "example_string",
    "DisbursementGuid": "123e4567-e89b-12d3-a456-426614174000",
    "ExternalID": "example_string",
    "ProjectSubContractID": 123,
    "InstallmentID": 123,
    "LegalEntityID": 123,
    "FileUrls": [
      "null"
    ],
    "IsFileUrlLoaded": true,
    "HasReceiptPictures": true
  },
  "Links": [
    {
      "Href": "example_string",
      "Rel": "example_string"
    }
  ],
  "Actions": [
    {}
  ]
}
GET
/v1/project-expense/{expenseID}
GET
Base URLstring

Target server for requests. Edit to use your own host.

Bearer Token
Bearer Tokenstring
Required

OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp). The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user. > Not yet documented: how to obtain a token. > Not yet documented: token lifetime.

OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp). The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user. > Not yet documented: how to obtain a token. > Not yet documented: token lifetime.
path
expenseIDinteger
Required

The project expense's integer ID.

Format: int32
Request Preview
Response

Response will appear here after sending the request

Authentication

header
Authorizationstring
Required

Bearer token. OAuth 2.0 bearer token, sent as Authorization: Bearer <token>. JWT and reference tokens are both accepted. The token must carry the required scope (default tlp).

The token's sub claim is the acting user. A token WITHOUT sub (client-credentials) acts as the system service user. If the sub user cannot log in (inactive, locked, deleted), the request is rejected with 401 — it is no longer let through without a user.

Not yet documented: how to obtain a token.

Not yet documented: token lifetime.

Path Parameters

expenseIDinteger
Required

The project expense's integer ID.

Responses

Propertiesobject

A cost the company incurred on a project (supplier invoice, purchase, subcontractor), with its cost in three currencies, its sales price to the customer, the profit ratio between them, approval and invoicing state, and — on GET by ID only — short-lived download URLs for attached PDFs. Costs and sales prices are NET of VAT; only AmountExpenseCurrency includes VAT. The TAF self link points to GET /v1/project-expense/{ProjectExpenseID}.

Linksarray
Actionsobject[]