The Request Log API lets you read back the calls your company has made to the Everee Integration API, so you can find out for yourself why a request failed, what exactly was sent, and whether you're still using anything that's deprecated. Entries are kept for 30 days.
| Endpoint | What it does |
|---|---|
| List request log entries | Lists your recent calls, newest first, with filters |
| Get a request log entry | Returns everything stored about one call |
You authenticate the same way as every other endpoint: your API token and tenant ID. See Authentication & API tokens. The endpoints only ever return your own company's calls. For a worked example, see Diagnosing a failed request.
What's recorded
The log covers calls to the Integration API (paths beginning /integration/v1) that were authenticated with your company's API token. It doesn't include:
- Calls to anything outside
/integration/v1 - The Request Log API's own endpoints
- Embedded session endpoints
- Calls that couldn't be authenticated, since there's no company to attach them to
- Calls rejected because you exceeded a rate limit (
429), which are turned away before they reach the Integration API
Recording is best-effort. It never slows down or fails your requests, and in rare cases, such as a disruption on Everee's side, a call may not be recorded. Calls usually appear within a few seconds.
The log's endpoints are served at /integration/v1/api-calls.
Reading an entry
Every response carries a requestId, which is the X-Request-ID header that came back on the original response. It's the fastest way to find a particular call, and it's what to give Everee Support when you ask for help. See Requests & responses.
The list returns a summary of each call:
| Field | Meaning |
|---|---|
id | The entry's ID. Use it with Get a request log entry. |
requestId | The X-Request-ID of the call |
createdAt | When Everee received the call |
method, path, queryString | What was called. Sensitive query values are masked. |
handlerPattern | The route that handled it, such as /integration/v1/workers/{id} |
status | The HTTP status code returned |
durationMs | How long the call took, in milliseconds |
authType, apiKeyId | How the call authenticated, and which of your API tokens made it |
errorType, errorMessage | For failures, what went wrong. Present when the call failed. |
requestRedacted | true if any sensitive value in the request was masked |
usesDeprecated | true if the call used something deprecated |
Getting a single entry adds the stored detail:
| Field | Meaning |
|---|---|
requestHeaders, responseHeaders | The headers that are kept, see below |
userAgent, remoteIp | Who sent the call |
requestBody | The request body, with sensitive values masked. Absent if it wasn't stored. |
requestBodyStored, requestBodySize | Whether the body was kept, and its original size in bytes |
responseBody, responseBodyStored, responseRedacted | The error response, for calls that failed |
redactedFields | Where values were masked: in is body or query, and path is a JSON pointer (body) or parameter name (query) |
deprecatedUsages | What deprecated thing the call used, see below |
What's stored, and what's masked
Everee masks sensitive values before anything is stored, so the log never contains them. Instead you'll see a placeholder naming where the value was, for example <<REDACTED:/workers/0/ssn>>, and redactedFields lists every location.
- Request headers are an allowlist. Credentials such as
Authorizationare never stored. - Request bodies are stored only when they're JSON and 256 KB or smaller. Otherwise
requestBodyStoredisfalse, andrequestBodySizestill tells you how big it was. - Response bodies are stored only for failures. Calls that returned
400or above have their error response stored. Successful responses aren't. - Error messages are masked too. Because an error message can echo what you sent, dashed Social Security numbers and EINs, and any number of 8 or more digits, are replaced.
- Masking errs on the side of caution. If a body can't be reliably inspected, it isn't stored.
Treat the log as a diagnostic aid. A masked value means you can't see what was sent in that field, but you can tell it was present.
Filtering
All filters are optional and can be combined.
| Parameter | Filters to |
|---|---|
from, to | Calls in a time range, inclusive. ISO 8601 or Unix epoch seconds. |
status | Exact status codes, such as status=404&status=409 |
status-class | SUCCESS (2xx), REDIRECT (3xx), CLIENT_ERROR (4xx), SERVER_ERROR (5xx), or FAILED (4xx and 5xx together) |
method | HTTP methods, such as method=POST |
path | Paths beginning with this prefix, such as /integration/v1/workers |
handler-pattern | Exactly this route, such as /integration/v1/workers/{id} |
request-id | The call with this X-Request-ID |
api-key-id | Calls made with this API token |
id | Specific entry IDs |
uses-deprecated | true for calls that used something deprecated, false for those that didn't |
deprecated-usage | Calls that used one specific deprecated thing, see below |
Paging
The list is cursor-paged, newest first. It accepts:
size: the number of entries per page. Defaults to 20, maximum 200.after: thenextCursorfrom a response, to get the next, older page. Leave it out for the first page.before: thepreviousCursorfrom a response, to get the newer entries before it.sort:createdAt,desc(the default) orcreatedAt,ascfor oldest first. It's the only field you can sort by.
Responses contain items, pageSize, hasNextPage, hasPreviousPage, and the cursors. Treat cursors as opaque and pass them back as you received them. New calls arriving while you page don't cause entries to be skipped or repeated. Note that unlike most cursor-paged endpoints, this one uses size rather than limit, and also supports before. See Pagination.
Finding deprecated usage
When something in the API is deprecated, the log tells you which of your calls still use it, so you know what to change before it's removed. Each entry records, by name only and never by value, whether the call used:
kind | A deprecated... | target looks like |
|---|---|---|
ENDPOINT | endpoint | POST /integration/v1/... |
BODY_FIELD | field in the request body | /costCenters/*/dimensions, where * stands for any array index |
QUERY_PARAM | query parameter | the parameter name |
To find everything affected:
- List entries with
uses-deprecated=true. - Look at
deprecatedUsageson an entry (get it by ID to see them). Each has akey, such asBODY_FIELD:/dimensions, along withforRemovalandsincewhen known. - Pass a
keyasdeprecated-usageto list every call that used that same thing.
Detection has limits. It can't see calls that were rejected before they were routed to an endpoint, bodies over 256 KB or that aren't valid JSON, or deprecated alternative field names, so an empty result isn't a guarantee you're clear. Use it to find usage, not to prove there's none.
Troubleshooting: "my call isn't listed"
- The call was made to a path outside
/integration/v1. - The call wasn't authenticated, for example because the token was rejected, so it can't be attributed to a company.
- The call was rejected with a
429for exceeding a rate limit. - The call was made seconds ago. Entries usually appear within a few seconds.
- The call is older than 30 days.
- Your filters are too narrow. Remember that
pathmatches a prefix and thathandler-patternmust match exactly.