Developers

The same API our apps run on.

Summely's web, iPhone and Android apps are API clients with no private endpoints. Anything the product can do, an integration can do — every capability, on one OpenAPI 3.1 schema.

The reference and schema are generated from the running service, so they cannot drift from it. These pages document the invariants; the reference documents every endpoint.

Request

curl https://app.summely.com/api/v1/invoices \
  -H "Authorization: Token smly_live_k3J9x2Qw…"

Response — abbreviated

{
  "next": null,
  "results": [
    {
      "number": "INV-1042",
      "customer_name": "Fern & Frond Landscaping",
      "status": "paid",
      "currency": "USD",
      "total": "4820.0000",
      "balance_due": "0.0000"
    }
  ]
}

The rules

Three promises the schema can't make.

Money is a string.

Every amount is a decimal string plus a currency code, never a JSON number. A float cannot represent 0.1, and this is an accounting system. Your totals survive the trip.

The ledger is immutable.

Posted entries are never edited and never deleted. Corrections post as new entries, so what your integration wrote stays written.

Retries are safe.

POSTs that create financial records honour an Idempotency-Key header for 24 hours. A timeout is a resend, not a duplicate invoice.

Access

Included in every plan.

Plans differ by seats, never by what the software is allowed to do, and the API is no exception. Keys are created in the app by an owner or admin, under More → API keys. A key carries its own role — never above accountant — is pinned to one organisation's books, and expires; there is no non-expiring key.

The key's effective authority is the lesser of its own role and its creator's current role, so demoting or removing the creator narrows or ends the key on its next request. Endpoints outside the published surface refuse API keys outright, with the error code not_part_of_public_api.

Candour

What the API doesn't do.

No webhooks.

Polling is the supported way to learn what changed, and GET /changes makes it one cursored request rather than a sweep of every collection.

No payroll.

Summely does not run payroll and has no Employee entity. Pay runs belong in the books as summary journal entries — the supported route takes one request.

No query language.

There is no /query endpoint, and none is planned for v1. List endpoints filter, search and paginate instead.

Rate limits exist and are per key; the numbers are deliberately not printed here yet. The contract page says why.

Where to go

Three destinations.

Getting started

A key, the auth header, a first read and a first write — five minutes, start to finish.

Full API reference

Every endpoint, every field, every enum — generated from the running service on every deploy.

Changelog

Dated and hand-written, so you can trust that a breaking change would have been announced.

Start with one call.

A free trial organisation, a key from the app, and the worked flow — from a new customer to a balanced ledger entry in six requests.