Lev · OpenAPI Overlay 1.0.0
API Evangelist enhancements for the Lev API
8 actions
8 updates
documentation
extends
openapi/lev-openapi-original.json
Generated by API Evangelist
Written by API Evangelist tooling for Lev's API. It is a proposal applied on top of the contract, not a document Lev publishes.
What the actions change
securityx-apievangelist-slugx-apievangelist-enrichedx-apievangelist-artifactsx-apievangelist-docsx-apievangelist-spec-sourcetagsdescription
Targets 4
$.info
$
$.components.securitySchemes.bearerAuth
$.paths['/api/external/v2/health'].get
OpenAPI Overlay
overlay: 1.0.0
info:
title: API Evangelist enhancements for the Lev API
version: 1.0.0
extends: openapi/lev-openapi-original.json
x-generated: '2026-07-19'
x-method: generated
x-source: >-
Derived from the harvested Lev OpenAPI 3.1 document plus the Lev developer
documentation (api-overview, authentication, pagination, errors, rate-limits).
Captures API Evangelist enrichment only — the original specification is never
mutated.
actions:
- target: $.info
description: Attach API Evangelist provenance and enrichment pointers.
update:
x-apievangelist-slug: lev
x-apievangelist-enriched: '2026-07-19'
x-apievangelist-artifacts:
conventions: conventions/lev-conventions.yml
errors: errors/lev-problem-types.yml
authentication: authentication/lev-authentication.yml
scopes: scopes/lev-scopes.yml
rate-limits: rate-limits/lev-rate-limits.yml
lifecycle: lifecycle/lev-lifecycle.yml
data-model: data-model/lev-data-model.yml
mcp: mcp/lev-mcp.yml
skills: skills/_index.yml
agentic-access: agentic-access/lev-agentic-access.yml
- target: $.info
description: >-
Record the documentation host, which differs from the API server host. The
OpenAPI is served from www.lev.com while the API itself is api.lev.com.
update:
x-apievangelist-docs: https://www.lev.com/docs/build/api-overview
x-apievangelist-spec-source: https://www.lev.com/docs/openapi.json
- target: $
description: >-
Declare the tag set that the operations already reference. The source document
uses 16 distinct tags on its operations but ships an empty top-level tags array,
so tooling that renders navigation from tags[] gets nothing. This supplies
descriptions without altering any operation.
update:
tags:
- name: Deals
description: Deals and their sub-resources — financials, properties, team,
documents, vaults, checklists, memos, notes, and source-backed indexed facts.
- name: Contacts
description: CRM contacts, contact notes, and AI lender-contact unlock.
- name: Companies
description: CRM companies and company notes.
- name: Placements
description: Placements of a deal with capital sources, and placement notes.
- name: Term Sheets
description: Term sheets issued against a placement on a deal.
- name: Lender Directory
description: Browse lenders and their lending programs.
- name: Pipelines
description: Pipelines, their statuses, and moving a deal between stages.
- name: Market Data
description: Current base rates (SOFR, CMT, Prime) and asset-type definitions.
- name: Account & Team
description: Authenticated user profile, account memberships, and team roster.
- name: API Keys
description: Create, list, and revoke scoped API keys.
- name: Billing
description: Credit balance and subscription summary for the active account.
- name: Deal Financials
description: Financial detail for a single deal.
- name: Deal Properties
description: Properties associated with a deal.
- name: Deal Team
description: Team members assigned to a deal.
- name: Quickstart
description: API-key validation used to confirm credentials and read scopes.
- name: Lev API Documentation
description: Public liveness endpoint.
- target: $
description: >-
Declare the security scheme globally. Every operation in the source document
already carries `security: [{bearerAuth: []}]` individually, but the document
sets no root-level `security`, so a reader cannot tell the API is authenticated
by default. getHealth is documented as the only unauthenticated operation.
update:
security:
- bearerAuth: []
- target: $.components.securitySchemes.bearerAuth
description: >-
Expand the bearer scheme with the two credential kinds the documentation
describes and the API-key prefix, which the source bearerFormat only hints at.
update:
description: >-
Two credential kinds share this header. API keys carry the `lev_sk_` prefix,
are long-lived, are bound to one account at creation, and are intended for
server-to-server use; validate one with postAuthValidateApiKey. JWTs are
short-lived Auth0-issued RS256 tokens for interactive clients. Every request
must also send `X-Origin-App`; JWT users with multiple account memberships
must also send `X-Active-Account`.
x-credential-kinds:
- kind: api-key
prefix: lev_sk_
- kind: jwt
issuer: https://auth.lev.com/
- target: $
description: >-
Record the request headers the API requires but does not model as parameters.
The source document carries them as an `x-lev-headers` vendor array on each
operation rather than as OpenAPI parameters, so generated clients omit them.
update:
x-apievangelist-required-headers:
- name: Authorization
value: Bearer <token>
required: true
- name: X-Origin-App
value: <client-name>
required: true
- name: X-Active-Account
value: <account-slug>
required: false
- name: Idempotency-Key
value: <uuid>
required: false
applies_to: write operations
- target: $
description: >-
Capture the cross-cutting runtime semantics documented outside the spec —
envelope, pagination, idempotency, and rate limiting.
update:
x-apievangelist-conventions:
response_envelope:
request_id: UUID v4
timestamp: ISO 8601
data: payload
pagination:
default: cursor
cursor_param: cursor
next_field: next_cursor
has_more_field: has_more
limit_default: 50
limit_max: 200
offset_when: a sort parameter is supplied
mutually_exclusive: cursor pagination and the sort parameter
idempotency:
header: Idempotency-Key
format: uuid
conflict_status: 409
conflict_type: conflict
errors:
envelope: '{request_id, error:{status, type, message, details}}'
rfc9457: false
rate_limits:
exceeded_status: 429
exceeded_type: rate_limit_exceeded
retry_field: retry_after_seconds
discovery_operation: getMe
- target: $.paths['/api/external/v2/health'].get
description: >-
Mark the liveness endpoint as explicitly unauthenticated, overriding the
default security applied above.
update:
security: []
x-apievangelist-note: Public liveness endpoint, no authentication required,
fixed at 100 requests per minute per caller.