How the API works
People, days and durations, pages, writing time, errors, and the limits every call shares.
What every endpoint has in common. Each endpoint's own parameters and answers are in the API reference.
Your key decides everything
- The key acts as you: what it writes shows you as the author, in LogQuill and in Jira.
- It reaches only the parts you ticked (its scopes), and never more than your role allows in LogQuill. Your role is checked on every call, so a change to it applies straight away.
- The site comes from the key: there's no site to name in the request.
People, days and durations
- People are named by their Jira account id (
accountId), the same everywhere in Jira. Where a list takesaccountId,memeans you, the key's owner. - Days are
YYYY-MM-DD. A worklog'sdateis the day it counts for in its author's time zone, as on their timesheet. Moments (startedAt,createdAt,updatedAt) are ISO 8601 in UTC. - Durations are in seconds:
timeSpentSeconds: 5400is 1h 30m. - Issues are named by id:
{ "id": 10232 }. When you log or plan time you can name one by its key instead:{ "key": "ABC-123" }. - To show issues and projects by name, pass their ids to
GET /v1/issues?ids=10232,10233(key and summary) andGET /v1/projects?ids=10000(key and name). Only those with time you may see; others come back underunknown.
Pages
Lists answer in pages:
{
"results": [ ... ],
"metadata": {
"count": 100,
"limit": 100,
"next": "https://api.logquill.com/v1/worklogs?from=2026-10-01&to=2026-10-31&cursor=..."
}
}Fetch next as it is until it's null. A page holds 100 results unless you ask for up to 1000 with
limit, and may hold fewer even when more follow: keep going while there's a next. Lists that
cover a period take from and to (both included), a year at most. A cursor that isn't one a
page gave answers 400 with data.reason invalidCursor: leave it out to start again.
To keep another system in step, ask only for what changed: GET /worklogs and GET /plans take
updatedFrom, a moment in UTC.
Writing time
Logging, changing and deleting time through the API follows your site's rules, exactly as in LogQuill:
- required fields and work types, daily hours limits, and locked timesheets;
- only your own worklogs and plans can be changed or deleted;
- time is logged in Jira too, as you, and moves the issue's remaining estimate as in LogQuill.
One call logs one day (POST /worklogs). A plan is also one day: POST /plans with a startDate
and an endDate makes one plan for each day.
Timesheets follow the same rules as in LogQuill: POST /timesheets/submit sends yours (or, as a team
leader, a member's) to one of the teams in its submitTo; approve and reject are for those who
review it, never its owner. The same emails go out as when it's done in LogQuill.
A timesheet covers a period (a week, or more, as your site sets it). You never need its first day:
any day in it stands for the whole period, and the answer says which period it was (periodStart,
periodEnd). A period that hasn't ended can't be submitted; the error then names the last one that
has, in data.previousPeriod, which is usually the one you meant.
Every change is in LogQuill's audit log, as made by you "through the public API", with the start of the key.
Errors
Errors answer with a status and a body like this:
{
"code": "FORBIDDEN",
"status": 403,
"message": "This key doesn't have the plans:read scope",
"data": { "reason": "missingScope", "scope": "plans:read" }
}| Status | When | What to do |
|---|---|---|
400 | The request isn't valid | message says what's wrong; for invalid fields, data.issues lists each with its path |
400 | Jira refused the write (no permission to log on the issue, time tracking off, a closed issue) | message says what Jira said; data.jiraStatus and data.jiraMessage too. Nothing was saved, and sending it again won't help |
401 | The key is missing, unknown, expired or revoked | Check the header; make a new key |
403 | The key or its owner may not do this | See data.reason below |
404 | Not found, or not yours to see | Check the id and your access |
405 | The address exists, but not with this method (absence types, for one, are read-only) | Allow lists the methods it takes |
429 | A limit was reached | Wait Retry-After seconds, then try again |
503 | LogQuill can't reach Jira for your site right now (jiraUnavailable), or hasn't heard from your site for days (siteUnreachable) | Try again in a few minutes; for siteUnreachable, open LogQuill in Jira |
data.reason on a 403:
missingScope: the key wasn't given this part. Make a key with it.readOnly: the site's subscription is inactive, so keys can read but not write.noTimeTracking: your role doesn't track time, so you can't log or plan any.apiDisabled: an administrator turned the API off for the site.ownerInactive: your Atlassian account is deactivated.ownerNotInJira: Jira won't act for you, usually because you lost access to Jira or to the app.
Writes can also be refused by your site's rules, with a message saying which (a locked timesheet,
a full day, a missing field).
Sending a create again
Creating a worklog or a plan is not repeat-safe: the same POST sent twice makes two, each its own
Jira worklog. After an error answer (4xx, 503), nothing was made, so sending again is safe. If a
create got no answer at all (a timeout, a dropped connection), list that day's worklogs or plans
first, and send it again only if it isn't there. Changing and deleting are safe to repeat: a second
delete answers 404. Submitting a timesheet twice is refused the second time, as it is already
submitted.
Limits
| Limit | |
|---|---|
| Requests per key | 60 a minute |
| Requests per site, all keys together | 600 a minute |
| Worklog and plan changes per site (logging, changing, deleting) | 300 an hour |
Worklog and plan changes have their own limit because they go to Jira, whose allowance every LogQuill customer shares. Reading, and submitting or reviewing timesheets, costs Jira nothing.
Every answer says where you stand:
X-RateLimit-Limit: the key's requests a minute;X-RateLimit-Remaining: how many are left this minute;X-RateLimit-Reset: seconds until the minute ends.
Past a limit, the answer is 429 with Retry-After: the seconds to wait. Jira itself may also ask
LogQuill to slow down; that comes back as a 429 too, with Jira's own wait.
The API's description
The whole API is described in OpenAPI at
/v1/openapi.json, for tools that generate
clients or import requests (Postman, Insomnia, Bruno).