Core concepts
Pagination
List endpoints page with a keyset cursor rather than page numbers, and cap each response at 100 items. Results are ordered newest-first by update time.
Keyset cursors
List endpoints use a keyset cursor rather than page numbers, and are capped at 100 items per response (server-enforced; there is no limit parameter).
To fetch the next page, pass the since and after values taken from the last item of the previous page:
since— an ISO 8601 local date-time, e.g.2026-01-15T10:30:00. Do not include aZsuffix or a numeric UTC offset; both are rejected with400.after— the id of the last item from the previous page.
Results are ordered newest-first by update time.
No limit parameter
Cursor parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
since | query | string | Optional | Keyset cursor — ISO 8601 local date-time of the last item from the previous page. No Z suffix and no numeric offset; both are rejected with 400.Example: 2026-01-15T10:30:00 |
after | query | string | Optional | Keyset cursor — envelope id of the last item from the previous page. Pair with since.Example: env_xyz789 |
Take both values from the last item of the page you just read, then request again:
curl "https://api-uat.softsages.com/core/api/v1/inkfree/envelopes?since=2026-01-15T10:30:00&after=env_xyz789" \
-H "X-API-Key: sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Reformat the timestamp before using it as a cursor
The cursor you send and the timestamp you received are not in the same format. since takes 2026-01-15T10:30:00, but an envelope's updatedOn comes back as 01/15/2026 10:30:00, and event_time comes back as 2026-01-15T10:30:00Z.
Convert MM/dd/yyyy HH:mm:ss to yyyy-MM-ddTHH:mm:ss, or strip the trailing Z, before sending it back. Passing either value through unchanged returns 400. See Dates.
Dates and time zones
Request parameters use ISO 8601 local date-times (2026-01-15T10:30:00). The since cursor is parsed strictly in this form — a Z suffix or a numeric offset is rejected with 400.
Response bodies are not uniform. Parse per field rather than assuming one format:
| Field | Format | Example |
|---|---|---|
createdOn, updatedOn, scheduleTime on an envelope or template | MM/dd/yyyy HH:mm:ss | 03/15/2026 09:00:00 |
expires_on from GET /api/v1/inkfree/me | MM/dd/yyyy HH:mm:ss | 01/01/2027 00:00:00 |
nextAttemptAt, lastAttemptAt on a webhook delivery | MM/dd/yyyy HH:mm:ss | 03/15/2026 14:30:00 |
event_time on the envelope event feed | ISO 8601 UTC offset | 2026-03-15T14:30:00Z |
The request and response forms deliberately differ, which matters when paging: you cannot feed an envelope's updatedOn straight back as a since cursor. Convert MM/dd/yyyy HH:mm:ss to yyyy-MM-ddTHH:mm:ss first. Likewise, strip the Z from event_time before using it as a cursor.
No Z suffix, no offset
since takes an ISO 8601 local date-time — 2026-01-15T10:30:00. A trailing Z or a numeric UTC offset is rejected with 400.
Most date libraries serialize to the offset form by default. If you are passing a value straight from one, trim it before sending.
Endpoints that paginate
3 list endpoints accept cursors. All return results newest-first by update time.