Namely · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the Namely API

9 actions 9 updates documentation extends ../openapi/namely-api-openapi.json
Generated by API Evangelist Written by API Evangelist tooling for Namely's API. It is a proposal applied on top of the contract, not a document Namely publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

hostbasePathx-server-variablesinfosecuritydescriptionx-token-typesx-oauth2-authorization-url

Targets 3

$
$.securityDefinitions.Authorization
$.paths['/profiles'].get

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the Namely API
  version: 1.0.0
  x-generated: '2026-08-26'
  x-method: generated
  x-source: >-
    Derived from developers.namely.com prose documentation that the published contract omits.
    Every action below writes back a fact Namely states somewhere in its own docs but did not put
    in the machine-readable document.
extends: ../openapi/namely-api-openapi.json
x-target-format: Swagger 2.0
x-note: >-
  The target is a Swagger 2.0 document, so these actions use Swagger 2.0 keywords (host,
  basePath, securityDefinitions) rather than OpenAPI 3.x ones. NOTHING here is invented: the base
  URL, the auth requirement, the rate limit and the two documented error codes are all quoted
  from Namely's own developer portal. The original contract in openapi/ is never mutated.
actions:
  - target: $
    description: >-
      Add the tenant-templated host and base path. Namely's Introduction states "The base URL for
      all requests to the Namely API is https://{company}.namely.com/api/v1" but the published
      document declares neither host nor basePath, so a generated client has no server to call.
    update:
      host: '{company}.namely.com'
      basePath: /api/v1
      x-server-variables:
        company:
          description: >-
            The customer's Namely subdomain. Namely is multi-tenant; there is no shared API host.
          example: acme
  - target: $
    description: >-
      Populate info.version. The contract ships info.version as an empty string; the Stoplight
      branch and the documented base path both say v1.
    update:
      info:
        version: v1
        x-version-source: >-
          Stoplight branch name `v1` and the documented /api/v1 base path. Namely does not state a
          version inside the document.
  - target: $
    description: >-
      Apply the Authorization scheme globally. The contract DEFINES securityDefinitions.Authorization
      but applies no `security` requirement to any of its 54 operations, so generated clients omit
      the header. Namely's Authentication article states "API requests without valid authentication
      will also be refused."
    update:
      security:
        - Authorization: []
  - target: $.securityDefinitions.Authorization
    description: >-
      Describe the credential the Authorization header actually carries, per Namely's
      Authentication article.
    update:
      description: >-
        Either an OAuth 2.0 access token (authorization code grant, 15-minute lifetime) or a
        Personal Access Token (2-year lifetime), sent as `Bearer <token>`. Minted inside the
        customer's own Namely HRIS tenant under the API menu.
      x-token-types:
        - oauth2-access-token
        - personal-access-token
      x-oauth2-authorization-url: https://{company}.namely.com/api/v1/oauth2/authorize
      x-oauth2-token-url: https://{company}.namely.com/api/v1/oauth2/token
      x-docs: https://developers.namely.com/docs/getting-started/authentication.md
  - target: $.paths['/profiles'].get
    description: >-
      Record the one rate limit Namely publishes, and its non-standard exhaustion status. The
      contract declares no 4xx responses at all.
    update:
      x-rate-limit:
        limit: 100
        window: 1 minute
        scope: per-endpoint
        status_on_exhaustion: 406
        retry_after_header: false
        source: https://developers.namely.com/docs/getting-started/introduction.md
      x-pagination-required: true
      x-pagination-note: >-
        Since 2017-09-20 Namely no longer permits unlimited profile retrieval in one call.
      responses:
        '406':
          description: >-
            Not Acceptable - rate limit exceeded. Namely returns 406 (not 429) when GET /profiles
            receives more than 100 requests per minute. No Retry-After header is sent.
  - target: $
    description: >-
      Record the documented 403 failure mode for Personal Access Tokens whose owning profile has
      been deactivated. This is a people event that silently breaks integrations and appears
      nowhere in the contract.
    update:
      x-documented-failure-modes:
        - status: 403
          condition: >-
            The Namely profile that created the Personal Access Token became inactive or was
            deleted.
          remediation: >-
            Mint integration PATs under a dedicated administrator "Integrations User" profile.
          source: https://developers.namely.com/docs/getting-started/authentication.md
        - status: 406
          condition: More than 100 requests per minute to GET /profiles.
          source: https://developers.namely.com/docs/getting-started/introduction.md
  - target: $
    description: >-
      Record the JSON API linked-object response envelope, which every list operation returns and
      which the contract's response schemas describe only partially.
    update:
      x-response-envelope:
        style: json-api-linked
        root: pluralised resource key, always an array
        type_map_key: links
        sideload_key: linked
        write_limitation: >-
          Relationships are read-only; a POST or PUT cannot link objects together.
        source: https://developers.namely.com/docs/getting-started/linked-objects.md
  - target: $
    description: >-
      Record the field-key stability guarantee, which is a real backwards-compatibility commitment
      an integrator can rely on but which appears nowhere in the contract.
    update:
      x-field-key-stability: >-
        Profile field API keys are frozen at creation. Renaming a field in the Namely UI does not
        change its API key, deliberately, to preserve backwards compatibility for live
        integrations.
      x-field-key-stability-source: https://developers.namely.com/docs/getting-started/introduction.md
  - target: $
    description: >-
      Record the adjacent SCIM 2.0 provisioning surface, which is on the same tenant host but
      outside this contract entirely.
    update:
      x-adjacent-surfaces:
        - name: SCIM 2.0 user provisioning
          endpoint: https://{company}.namely.com/api/scim/v2/Users.json
          standard: SCIM 2.0
          extension_urn: 'urn:ietf:params:scim:schemas:extension:custom:2.0:User'
          described_by_this_contract: false
          source: https://developers.namely.com/docs/okta/syncing-custom-fields.md