Lev

Lev Placements API

The Placements API from Lev — 4 operation(s) for placements.

Operations 8

GET /api/external/v2/placements List placements with pagination #
POST /api/external/v2/placements Create a placement against a deal #
GET /api/external/v2/placements/{placement_id} Get a single placement by ID #
PATCH /api/external/v2/placements/{placement_id} Update a placement (partial update) #
GET /api/external/v2/placements/{placement_id}/notes List notes logged on a placement #
POST /api/external/v2/placements/{placement_id}/notes Add a note to a placement #
PATCH /api/external/v2/placements/{placement_id}/notes/{note_id} Edit a placement note #
DELETE /api/external/v2/placements/{placement_id}/notes/{note_id} Permanently delete a placement note #

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/lev-placements-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

lev-placements-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Lev Account & Team Placements API
  version: 2026-03
  description: Build on Lev with AI-friendly API docs, agent guides, and production integration recipes.
servers:
- url: https://api.lev.com
  description: Production API
tags:
- name: Placements
paths:
  /api/external/v2/placements:
    get:
      operationId: getPlacements
      summary: List placements with pagination
      description: 'List placements with pagination


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: limit
        in: query
        required: false
        description: Results per page (1–200, default 50)
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        description: Cursor for next page
        schema:
          type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Placement'
                  pagination:
                    type: object
        '400':
          description: cursor and sort cannot be combined; use offset pagination when sorting
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
    post:
      operationId: postPlacements
      summary: Create a placement against a deal
      description: 'Create a placement against a deal


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
              - deal_id
              - private_company_id
              type: object
              properties:
                deal_id:
                  type: integer
                  description: ID of the deal this placement belongs to
                private_company_id:
                  type: integer
                  description: ID of the lender private company (use `GET /companies` to find candidates)
                contact_id:
                  type: integer
                  description: ID of the lender contact for this outreach. Must belong to the lender at `private_company_id`. Omit it and Lev runs an async AI match to recommend a contact at that lender; the recommended contact's name stays masked until you unlock it
                status:
                  type: string
                  description: Placement status enum name. Defaults to `new`. Cannot be `archived` on create
                visibility:
                  type: string
                  description: Placement visibility (`hidden`, `masked`, `shared`)
                description:
                  type: string
                  description: Free-text note (e.g. lender-specific feedback)
                score:
                  type: number
                  description: Manual relevance score (0–100)
                outreach_date:
                  type: string
                  description: ISO 8601 timestamp the lender was first contacted
                lender_status:
                  type: string
                  description: Lender-side status enum name
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    $ref: '#/components/schemas/Placement'
        '400':
          description: Cannot create a placement with status='archived'; create an active placement and PATCH to archive; A placement already exists for this deal, contact, and lender; use PATCH to update it
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Deal not found; Private company not found; Contact not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '422':
          description: 'status: input is not a valid enum member'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
      - 'Content-Type: application/json'
      - 'Idempotency-Key: <uuid>'
  /api/external/v2/placements/{placement_id}:
    get:
      operationId: getPlacementsPlacementId
      summary: Get a single placement by ID
      description: 'Get a single placement by ID


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: placement_id
        in: path
        required: true
        description: The placement ID
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    $ref: '#/components/schemas/Placement'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Placement not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
    patch:
      operationId: patchPlacementsPlacementId
      summary: Update a placement (partial update)
      description: 'Update a placement (partial update)


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: placement_id
        in: path
        required: true
        description: The placement ID
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  description: Placement status enum name. Use `archived` to remove the placement
                visibility:
                  type: string
                  description: Placement visibility (`hidden`, `masked`, `shared`)
                description:
                  type: string
                  description: Free-text note. Changing it also appends a note to the placement's notes (List Placement Notes)
                score:
                  type: number
                  description: Manual relevance score (0–100)
                outreach_date:
                  type: string
                  description: ISO 8601 timestamp the lender was first contacted
                lender_status:
                  type: string
                  description: Lender-side status enum name
              minProperties: 1
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    $ref: '#/components/schemas/Placement'
        '400':
          description: Request body must contain at least one field to update
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Placement not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '422':
          description: 'status: input is not a valid enum member'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
      - 'Content-Type: application/json'
      - 'Idempotency-Key: <uuid>'
  /api/external/v2/placements/{placement_id}/notes:
    get:
      operationId: getPlacementsPlacementIdNotes
      summary: List notes logged on a placement
      description: 'List notes logged on a placement


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: placement_id
        in: path
        required: true
        description: The placement ID
        schema:
          type: integer
      - name: limit
        in: query
        required: false
        description: Results per page (1–200, default 50)
        schema:
          type: integer
      - name: cursor
        in: query
        required: false
        description: Cursor for next page
        schema:
          type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Note'
                  pagination:
                    type: object
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Placement not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
    post:
      operationId: postPlacementsPlacementIdNotes
      summary: Add a note to a placement
      description: 'Add a note to a placement


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: placement_id
        in: path
        required: true
        description: The placement ID
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
              - text
              type: object
              properties:
                text:
                  type: string
                  description: Note text. Must be non-empty.
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    $ref: '#/components/schemas/Note'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Placement not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '422':
          description: text must not be blank
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
      - 'Content-Type: application/json'
      - 'Idempotency-Key: <uuid>'
  /api/external/v2/placements/{placement_id}/notes/{note_id}:
    patch:
      operationId: patchPlacementsPlacementIdNotesNoteId
      summary: Edit a placement note
      description: 'Edit a placement note


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: placement_id
        in: path
        required: true
        description: The placement ID
        schema:
          type: integer
      - name: note_id
        in: path
        required: true
        description: The note ID
        schema:
          type: integer
      requestBody:
        required: true
        content:
          application/json:
            schema:
              required:
              - text
              type: object
              properties:
                text:
                  type: string
                  description: Replacement note text. Must be non-empty.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    $ref: '#/components/schemas/Note'
        '400':
          description: text cannot be empty
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Placement or note not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '422':
          description: text must not be blank
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
      - 'Content-Type: application/json'
      - 'Idempotency-Key: <uuid>'
    delete:
      operationId: deletePlacementsPlacementIdNotesNoteId
      summary: Permanently delete a placement note
      description: 'Permanently delete a placement note


        Docs page: https://www.lev.com/docs/build/placements'
      tags:
      - Placements
      parameters:
      - name: placement_id
        in: path
        required: true
        description: The placement ID
        schema:
          type: integer
      - name: note_id
        in: path
        required: true
        description: The note ID
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  request_id:
                    type: string
                  timestamp:
                    type: string
                    format: date-time
                  data:
                    $ref: '#/components/schemas/BooleanDeleteResult'
        '401':
          description: Authentication required
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
        '404':
          description: Placement or note not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorEnvelope'
      security:
      - bearerAuth: []
      x-lev-docs-page: https://www.lev.com/docs/build/placements
      x-lev-headers:
      - 'Authorization: Bearer <token>'
      - 'X-Origin-App: <client-name>'
      - 'Content-Type: application/json'
components:
  schemas:
    ApiError:
      type: object
      properties:
        code:
          type: string
        message:
          type: string
    Placement:
      type: object
      properties:
        id:
          type: integer
          description: Placement identifier
        deal_id:
          type: integer
          description: Associated deal ID
        private_company_id:
          type: integer
          nullable: true
          description: Lender private company ID. Null on masked non-owner reads
        lender_name:
          type: string
          nullable: true
          description: Display lender name. Masked non-owner reads use borrower-portal labels such as Lender A
        contact_id:
          type: integer
          nullable: true
          description: Lender contact ID. Null on masked non-owner reads
        contact_name:
          type: string
          nullable: true
          description: Lender contact name. Null on masked non-owner reads, and null for an AI-recommended contact until you reveal it via [Unlock Contact](/build/contacts#unlock-contact) — `contact_id` is still present so you can unlock it
        status:
          type: string
          nullable: true
          description: Current placement status
        lender_status:
          type: string
          nullable: true
          description: Lender-side status
        description:
          type: string
          nullable: true
          description: Placement description
        lev_score:
          type: number
          nullable: true
          description: AI-generated match score
        score:
          type: number
          nullable: true
          description: Manual score
        outreach_date:
          type: string
          nullable: true
          description: Date of initial outreach
        outreach_source:
          type: string
          nullable: true
          description: Source of outreach
        last_communication_date:
          type: string
          nullable: true
          description: Date of last communication
        lender_first_response_date:
          type: string
          nullable: true
          description: Date of lender's first response
        visibility:
          type: string
          nullable: true
          description: Placement visibility
        created_at:
          type: string
          nullable: true
          description: Creation timestamp
        updated_at:
          type: string
          nullable: true
          description: Last update timestamp
    ApiErrorEnvelope:
      type: object
      properties:
        request_id:
          type: string
        error:
          $ref: '#/components/schemas/ApiError'
    BooleanDeleteResult:
      type: object
      properties:
        deleted:
          type: boolean
    Note:
      type: object
      properties:
        id:
          type: integer
        text:
          type: string
          nullable: true
        created_by:
          type: object
          nullable: true
          properties:
            id:
              type: integer
            name:
              type: string
              nullable: true
        created_at:
          type: string
          nullable: true
        updated_at:
          type: string
          nullable: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key or JWT