The Co-operative Bank Users API

User account management and administration

Operations 13

GET /api/user/getloggedinuser/{params} Get logged in user (deprecated) #
PATCH /api/v1/users/activate/{userId} Active an existing user #
PUT /api/v1/users Update an existing user #
POST /api/v1/users Create user #
PATCH /api/v1/users/deactivate/{userId} Deactivate an existing user #
GET /api/v1/users/{userId} Find an user #
DELETE /api/v1/users/{userId} Deletes an existing user #
GET /api/v1/users/filter Filter users #
POST /api/v1/users/loginas Login as user #
GET /api/v1/users/loginAsData Get login as data #
PUT /api/v1/users/logoutas Logout as user #
GET /api/v1/users/current Get current user #
PUT /api/v1/users/current Update current user #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/co-operative-bank:co-operative-bank-users-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

co-operative-bank-users-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: dotCMS REST Users API
  version: '3'
  description: User account management and administration
servers:
- url: /
  description: dotCMS Server
tags:
- name: Users
  description: User account management and administration
paths:
  /api/user/getloggedinuser/{params}:
    get:
      tags:
      - Users
      summary: Get logged in user (deprecated)
      description: Returns a JSON representation of the currently logged in user including userId, emailAddress, firstName, lastName, and roleId. This endpoint is deprecated - use v1 UserResource instead.
      operationId: getLoggedInUserLegacy
      parameters:
      - name: params
        in: path
        description: URL parameters for the request
        required: true
        schema:
          pattern: .*
          type: string
      responses:
        '200':
          description: User information retrieved successfully
          content:
            application/json:
              schema:
                type: object
                description: User information containing userId, emailAddress, firstName, lastName, and roleId
        '401':
          description: Unauthorized - backend user authentication required
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
      deprecated: true
  /api/v1/users/activate/{userId}:
    patch:
      tags:
      - Users
      summary: Active an existing user
      operationId: activateUser
      parameters:
      - name: userId
        in: path
        description: 'Identifier of an user.


          Example value: `b9d89c80-3d88-4311-8365-187323c96436` '
        required: true
        schema:
          type: string
      responses:
        '200':
          description: If success returns a map with the user + user id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '403':
          description: If the user is not an admin or access to the role + user layouts or does have permission, it will return a 403.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '404':
          description: If the user to update does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '400':
          description: If the user information is not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
  /api/v1/users:
    put:
      tags:
      - Users
      summary: Update an existing user
      description: 'Updates an existing user''s information including personal details, roles, and account settings. Only admin users or users with appropriate portlet access can perform this operation. The optional roles list carries role KEYS and is the user''s complete desired set of user-assignable roles (editUsers=true): omit the field to leave roles untouched, send a non-empty list to replace the user-assignable role set, or send an empty list to remove all of the user''s user-assignable roles. System-managed memberships (e.g. the user''s individual role) are never modified, keys that resolve to no role are ignored, and null or blank entries are rejected with 400. Note that roles without a key cannot be expressed in this list — manage those through the role-centric /v1/roles/{roleId}/users endpoints instead.'
      operationId: updateUser
      requestBody:
        description: 'User update data including personal information, roles, and account settings. The roles list (role keys) is the complete desired set of user-assignable roles: absent = untouched, empty = remove all user-assignable roles, non-empty = replace.'
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserForm'
        required: true
      responses:
        '200':
          description: If success returns a map with the user + user id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityUserUpdateView'
        '403':
          description: If the user is not an admin or access to the role + user layouts or does have permission, it will return a 403.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseSiteVariablesEntityView'
        '404':
          description: If the user to update does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseSiteVariablesEntityView'
        '400':
          description: If the user information is not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseSiteVariablesEntityView'
    post:
      tags:
      - Users
      summary: Create user
      description: Creates a new user. Requires admin privileges or access to Users and Roles portlets. FirstName, LastName, Email and Password are required
      operationId: createUser
      requestBody:
        description: User creation data
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserForm'
        required: true
      responses:
        '200':
          description: User created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityUserUpdateView'
        '400':
          description: Bad request - missing required fields or invalid data
          content:
            application/json: {}
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions to create users
          content:
            application/json: {}
        '409':
          description: Conflict - user already exists
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
  /api/v1/users/deactivate/{userId}:
    patch:
      tags:
      - Users
      summary: Deactivate an existing user
      operationId: deactivateUser
      parameters:
      - name: userId
        in: path
        description: 'Identifier of an user.


          Example value: `b9d89c80-3d88-4311-8365-187323c96436` '
        required: true
        schema:
          type: string
      responses:
        '200':
          description: If success returns a map with the user + user id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '403':
          description: If the user is not an admin or access to the role + user layouts or does have permission, it will return a 403.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '404':
          description: If the user to update does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '400':
          description: If the user information is not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
  /api/v1/users/{userId}:
    get:
      tags:
      - Users
      summary: Find an user
      description: Returns an user
      operationId: findUser
      parameters:
      - name: userId
        in: path
        description: Identifier of user to retrieve
        required: true
        schema:
          type: string
      responses:
        '200':
          description: User retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserMapEntityView'
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
    delete:
      tags:
      - Users
      summary: Deletes an existing user
      description: Deletes a user account and reassigns all associated content and permissions to a replacement user. Only admin users or users with appropriate portlet access can perform this operation.
      operationId: deleteUser
      parameters:
      - name: userId
        in: path
        description: 'Identifier of an user.


          Example value: `b9d89c80-3d88-4311-8365-187323c96436` '
        required: true
        schema:
          type: string
      - name: replacementUserId
        in: query
        description: 'Identifier of an user.


          Example value: `b9d89c80-3d88-4311-8365-187323c96436` '
        required: true
        schema:
          type: string
      responses:
        '200':
          description: If success returns a map with the user + user id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserDeletedEntityView'
        '403':
          description: If the user is not an admin or access to the role + user layouts or does have permission, it will return a 403.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserDeletedEntityView'
        '404':
          description: If the user to update does not exist
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserDeletedEntityView'
        '400':
          description: If the user information is not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseUserDeletedEntityView'
  /api/v1/users/filter:
    get:
      tags:
      - Users
      summary: Filter users
      description: Returns a list of dotCMS users based on specified search criteria with pagination support. Each item is the user's data map. When `includeRoles=true` is passed, each item additionally carries a `roles` array listing the user's directly assigned roles as `{id, name, roleKey}` objects (`roleKey` may be null for roles created without a key); roles held through the role hierarchy and the user's personal role are not included. Requesting roles requires being a CMS Administrator or having access to both the Roles and Users portlets (403 otherwise). Without the flag the payload is unchanged.
      operationId: filterUsers
      parameters:
      - name: query
        in: query
        description: Filter users by user ID, first name, last name, email address, or full name -- or parts of any of them
        schema:
          type: string
      - name: page
        in: query
        description: Page number for pagination
        schema:
          type: integer
          format: int32
          default: 0
      - name: per_page
        in: query
        description: Number of items per page
        schema:
          type: integer
          format: int32
          default: 40
      - name: orderby
        in: query
        description: 'Field to sort by. Supported: `firstName` (ties broken by last name), `emailAddress`, `lastLoginDate` (users without a recorded login sort last). Unsupported values fall back to the default order (full name ascending)'
        schema:
          type: string
      - name: direction
        in: query
        description: 'Sorting direction: ASC or DESC'
        schema:
          type: string
          default: ASC
      - name: includeanonymous
        in: query
        description: Include anonymous user in results
        schema:
          type: boolean
      - name: includedefault
        in: query
        description: Include default user in results
        schema:
          type: boolean
      - name: assetinode
        in: query
        description: Asset inode for permission-based filtering
        schema:
          type: string
      - name: permission
        in: query
        description: Permission type for asset-based filtering
        schema:
          type: integer
          format: int32
      - name: roleKey
        in: query
        description: Role key(s) to restrict results to users holding any of them; repeatable and/or comma-separated, e.g. roleKey=DOTCMS_BACK_END_USER
        schema:
          type: array
          items:
            type: string
      - name: includeRoles
        in: query
        description: When true, each user carries a `roles` array of its directly assigned roles as {id, name, roleKey}; inherited roles and the user's personal role are excluded. Requires CMS Administrator or Roles+Users portlet access (403 otherwise). Defaults to false (payload unchanged)
        schema:
          type: boolean
          default: false
      responses:
        '200':
          description: Users retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityListUserView'
        '400':
          description: Bad request - a provided roleKey does not match any existing Role
          content:
            application/json: {}
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions, or includeRoles=true requested without CMS Administrator / Roles+Users portlet access
          content:
            application/json: {}
  /api/v1/users/loginas:
    post:
      tags:
      - Users
      summary: Login as user
      description: Performs user impersonation via the 'Login As' feature, allowing administrators to simulate another user's session
      operationId: loginAsUser
      requestBody:
        description: Login as credentials
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LoginAsForm'
        required: true
      responses:
        '200':
          description: Login as operation successful
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityLoginAsView'
        '400':
          description: Bad request - invalid user credentials
          content:
            application/json: {}
        '401':
          description: Unauthorized - authentication failed
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions or missing Login As role
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
  /api/v1/users/loginAsData:
    get:
      tags:
      - Users
      summary: Get login as data
      description: Returns a paginated list of users that can be impersonated (excludes anonymous and default users)
      operationId: getLoginAsData
      parameters:
      - name: filter
        in: query
        description: Filter for user search
        schema:
          type: string
      - name: page
        in: query
        description: Page number for pagination
        schema:
          type: integer
          format: int32
      - name: per_page
        in: query
        description: Number of items per page
        schema:
          type: integer
          format: int32
      responses:
        '200':
          description: User list retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityListUserView'
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
  /api/v1/users/logoutas:
    put:
      tags:
      - Users
      summary: Logout as user
      description: Ends user impersonation session and reverts back to the original administrator user
      operationId: logoutAsUser
      responses:
        '200':
          description: Logout as operation successful
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityLoginAsView'
        '400':
          description: Bad request - invalid session state
          content:
            application/json: {}
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
  /api/v1/users/current:
    get:
      tags:
      - Users
      summary: Get current user
      description: Returns information about the currently authenticated user
      operationId: getCurrentUser
      responses:
        '200':
          description: Current user information retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RestUser'
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '400':
          description: Bad request - could not provide current user
          content:
            application/json: {}
    put:
      tags:
      - Users
      summary: Update current user
      description: Updates information for the currently authenticated user. May require reauthentication if critical fields are changed.
      operationId: updateCurrentUser
      requestBody:
        description: Current user update data including personal information and password changes
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCurrentUserForm'
        required: true
      responses:
        '200':
          description: User information updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResponseEntityUserUpdateView'
        '400':
          description: Bad request - invalid user data or password requirements
          content:
            application/json: {}
        '401':
          description: Unauthorized - authentication required
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
components:
  schemas:
    ErrorEntity:
      type: object
      properties:
        errorCode:
          type: string
        message:
          type: string
        fieldName:
          type: string
    Pagination:
      type: object
      properties:
        currentPage:
          type: integer
          format: int32
        perPage:
          type: integer
          format: int32
        totalEntries:
          type: integer
          format: int64
    ResponseEntityListUserView:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEntity'
        entity:
          type: array
          items:
            $ref: '#/components/schemas/User'
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageEntity'
        i18nMessagesMap:
          type: object
          additionalProperties:
            type: string
        permissions:
          type: array
          items:
            type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    RestUser:
      type: object
      properties:
        userId:
          type: string
        givenName:
          type: string
        email:
          type: string
        surname:
          type: string
        roleId:
          type: string
        loginAs:
          type: boolean
        admin:
          type: boolean
    ResponseEntityUserUpdateView:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEntity'
        entity:
          type: object
          additionalProperties:
            type: object
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageEntity'
        i18nMessagesMap:
          type: object
          additionalProperties:
            type: string
        permissions:
          type: array
          items:
            type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    User:
      type: object
      properties:
        modificationDate:
          type: string
          format: date-time
        companyId:
          type: string
        resolution:
          type: string
        refreshRate:
          type: string
        defaultUser:
          type: boolean
        recipientName:
          type: string
        actualCompanyId:
          type: string
        female:
          type: boolean
        passwordExpired:
          type: boolean
        recipientId:
          type: string
        userRole:
          $ref: '#/components/schemas/Role'
        languageId:
          type: string
        timeZoneId:
          type: string
        anonymousUser:
          type: boolean
        recipientInternetAddress:
          type: string
        multipleRecipients:
          type: boolean
        timeZone:
          type: object
          properties:
            id:
              type: string
            rawOffset:
              type: integer
              format: int32
            dstsavings:
              type: integer
              format: int32
            displayName:
              type: string
        locale:
          type: object
          properties:
            script:
              type: string
            variant:
              type: string
            unicodeLocaleAttributes:
              uniqueItems: true
              type: array
              items:
                type: string
            unicodeLocaleKeys:
              uniqueItems: true
              type: array
              items:
                type: string
            displayLanguage:
              type: string
            displayScript:
              type: string
            displayCountry:
              type: string
            displayVariant:
              type: string
            displayName:
              type: string
            country:
              type: string
            extensionKeys:
              uniqueItems: true
              type: array
              items:
                type: string
            iso3Language:
              type: string
            iso3Country:
              type: string
            language:
              type: string
        fullName:
          type: string
        recipientAddress:
          type: string
        male:
          type: boolean
        skinId:
          type: string
        loginDate:
          type: string
          format: date-time
        loginIP:
          type: string
        lastLoginDate:
          type: string
          format: date-time
        lastLoginIP:
          type: string
        createDate:
          type: string
          format: date-time
        deleteDate:
          type: string
          format: date-time
        passwordReset:
          type: boolean
        smsId:
          type: string
        aimId:
          type: string
        icqId:
          type: string
        msnId:
          type: string
        ymId:
          type: string
        favoriteFood:
          type: string
        favoriteMovie:
          type: string
        favoriteMusic:
          type: string
        dottedSkins:
          type: boolean
        roundedSkins:
          type: boolean
        greeting:
          type: string
        layoutIds:
          type: string
        comments:
          type: string
        deleteInProgress:
          type: boolean
        userId:
          type: string
        emailAddress:
          type: string
        firstName:
          type: string
        lastName:
          type: string
        active:
          type: boolean
        middleName:
          type: string
        nickName:
          type: string
        birthday:
          type: string
          format: date-time
        additionalInfo:
          type: object
          additionalProperties:
            type: object
        passwordExpirationDate:
          type: string
          format: date-time
        failedLoginAttempts:
          type: integer
          format: int32
        agreedToTermsOfUse:
          type: boolean
        passwordEncrypted:
          type: boolean
        favoriteActivity:
          type: string
        favoriteBibleVerse:
          type: string
        password:
          type: string
        modified:
          type: boolean
        new:
          type: boolean
    ResponseUserMapEntityView:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEntity'
        entity:
          type: object
          additionalProperties:
            type: object
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageEntity'
        i18nMessagesMap:
          type: object
          additionalProperties:
            type: string
        permissions:
          type: array
          items:
            type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    SiteVariableView:
      type: object
      properties:
        id:
          type: string
        hostId:
          type: string
        name:
          type: string
        key:
          type: string
        value:
          type: string
        lastModifierId:
          type: string
        lastModDate:
          type: string
          format: date-time
        lastModifierFullName:
          type: string
    ResponseEntityLoginAsView:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEntity'
        entity:
          type: object
          additionalProperties:
            type: object
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageEntity'
        i18nMessagesMap:
          type: object
          additionalProperties:
            type: string
        permissions:
          type: array
          items:
            type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    UserForm:
      required:
      - email
      - firstName
      - lastName
      type: object
      properties:
        userId:
          type: string
        active:
          type: boolean
        firstName:
          type: string
        middleName:
          type: string
        lastName:
          type: string
        nickName:
          type: string
        email:
          type: string
        male:
          type: boolean
        birthday:
          type: string
        languageId:
          type: string
        timeZoneId:
          type: string
        password:
          type: array
          items:
            type: string
        additionalInfo:
          type: object
          additionalProperties:
            type: object
        roles:
          type: array
          description: 'Role keys or role IDs (roles created without a key can only be referenced by ID). On update: field absent = roles untouched; [] = remove all user-assignable roles; otherwise the complete user-assignable role set. On create: absent or empty = default Front-end User role. Unknown entries are ignored.'
          example:
          - DOTCMS_BACK_END_USER
          - 48190c8c-42c4-46af-8d1a-0cd5db894797
          items:
            type: string
            description: 'Role keys or role IDs (roles created without a key can only be referenced by ID). On update: field absent = roles untouched; [] = remove all user-assignable roles; otherwise the complete user-assignable role set. On create: absent or empty = default Front-end User role. Unknown entries are ignored.'
            example: '["DOTCMS_BACK_END_USER","48190c8c-42c4-46af-8d1a-0cd5db894797"]'
    UpdateCurrentUserForm:
      type: object
      properties:
        userId:
          type: string
        givenName:
          type: string
        email:
          type: string
        surname:
          type: string
        currentPassword:
          type: string
        newPassword:
          type: string
    MessageEntity:
      type: object
      properties:
        message:
          type: string
    LoginAsForm:
      required:
      - password
      - userId
      type: object
      properties:
        userId:
          type: string
        password:
          type: string
    Role:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        description:
          type: string
        roleKey:
          type: string
        parent:
          type: string
        editPermissions:
          type: boolean
        editUsers:
          type: boolean
        editLayouts:
          type: boolean
        locked:
          type: boolean
        system:
          type: boolean
        roleChildren:
          type: array
          items:
            type: string
        fqn:
          type: string
        dbfqn:
          type: string
        user:
          type: boolean
    ResponseUserDeletedEntityView:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEntity'
        entity:
          $ref: '#/components/schemas/UserDeletedView'
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageEntity'
        i18nMessagesMap:
          type: object
          additionalProperties:
            type: string
        permissions:
          type: array
          items:
            type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
    UserDeletedView:
      type: object
      properties:
        status:
          type: string
        deletedUser:
          type: string
        reassignedTo:
          type: string
    ResponseSiteVariablesEntityView:
      type: object
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ErrorEntity'
        entity:
          type: array
          items:
            $ref: '#/components/schemas/SiteVariableView'
        messages:
          type: array
          items:
            $ref: '#/components/schemas/MessageEntity'
        i18nMessagesMap:
          type: object
          additionalProperties:
            type: string
        permissions:
          type: array
          items:
            type: string
        pagination:
          $ref: '#/components/schemas/Pagination'
x-provenance:
  method: harvested
  publisher: The Co-operative Bank
  source: https://www.developer.co-operativebank.co.uk/api/openapi.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)