Levitate · OpenAPI Overlay 1.0.0
API Evangelist enhancements for the Levitate Public API
8 actions
8 updates
documentation
extends
openapi/levitate-public-v1-openapi.json
Generated by API Evangelist
Written by API Evangelist tooling for Levitate's API. It is a proposal applied on top of the contract, not a document Levitate publishes.
What the actions change
x-agentic-accessdescriptioncontacttermsOfServicePersonalApiKey
Targets 8
$.info
$.servers
$.security
$.components.securitySchemes
$.tags
$.paths['/public/v1/Contacts'].post
$.paths['/public/v1/Companies/{id}'].delete
$.paths['/public/v1/Contacts/{id}'].patch
OpenAPI Overlay
overlay: 1.0.0
info:
title: API Evangelist enhancements for the Levitate Public API
version: 1.0.0
extends: openapi/levitate-public-v1-openapi.json
x-provenance:
generated: '2026-08-25'
method: generated
source: >-
Derived from openapi/levitate-public-v1-openapi.json plus facts published at
https://help.levitate.ai/article/735-levitate-public-api and
https://help.levitate.ai/article/736-oauth-clients-for-the-public-api. The original specification is
never mutated; every statement below is traceable to Levitate's own documentation.
actions:
- target: $.info
description: Add contact, licence-neutral description and terms pointers absent from the published spec.
update:
description: >-
The Levitate Public API reads and writes Levitate contacts, contact key facts, companies and
notes. All endpoints live under https://api.levitate.ai/public/v1 and take a bearer credential:
either a Personal API Key (tied to one user, fixed 30/90/180/365-day expiry, not renewable) or
an OAuth 2.0 authorization-code + PKCE token issued by https://login.levitate.ai. The Public API
feature must be enabled on an account by Levitate Support before keys can be generated. The API
is not a connector and does not sync — it never reaches out to a CRM or AMS on its own.
contact:
name: Levitate Support
url: https://help.levitate.ai/
termsOfService: https://www.levitate.ai/terms-of-service
- target: $.servers
description: Pin the documented base path rather than the bare host, so generated clients hit /public/v1.
update:
- url: https://api.levitate.ai
description: Production. All Public API paths are prefixed /public/v1.
- target: $.security
description: >-
The published spec declares an OAuth2 securityScheme but applies no top-level security requirement
and sets `security: null` on every operation, so a generated client would emit unauthenticated
calls. Every operation in fact requires a bearer credential with the levitate:contacts scope.
update:
- OAuth2:
- levitate:contacts
- target: $.components.securitySchemes
description: >-
Record the Personal API Key credential, which the docs describe as the primary path for scripts
but which the specification omits entirely. Both credentials travel in the same Authorization
bearer header.
update:
PersonalApiKey:
type: http
scheme: bearer
description: >-
Personal API Key generated in the Levitate app under Integrations. Tied to one user, requires
at least one scope, expires after a chosen 30/90/180/365 days and cannot be renewed or
extended. A key scoped to the Levitate MCP Server or a Zapier account key will NOT
authenticate against the Public API.
- target: $.tags
description: Add descriptions to the three declared tags, which the published spec leaves bare.
update:
- name: Contacts
description: The central Levitate record — names, emails, phones, address, tags, custom fields and key facts, plus a boolean search endpoint.
- name: Companies
description: Organization records. A contact's company is inferred from its primary email domain and cannot be set directly.
- name: Notes
description: Activity records with a sanitized HTML body, attached to up to 25 contacts and/or companies.
- target: $.paths['/public/v1/Contacts'].post
description: Flag the non-idempotent create so agent tooling does not blind-retry it.
update:
x-agentic-access:
action-class: write
consequence: creates a durable customer record
reversible: false
note: >-
There is no DELETE operation for a contact in public-v1, so a contact created through the API
cannot be removed through the API. There is no Idempotency-Key header — a retry after a
timeout returns 409 Conflict rather than the original 201 body.
- target: $.paths['/public/v1/Companies/{id}'].delete
description: Flag the irreversible delete.
update:
x-agentic-access:
action-class: delete
consequence: permanently removes a company record
reversible: false
note: Levitate's own description says "Permanently removes a company." No restore operation and no recovery window are published.
- target: $.paths['/public/v1/Contacts/{id}'].patch
description: Warn that array fields are replaced, not merged — the most destructive quiet behaviour in this API.
update:
x-agentic-access:
action-class: update
consequence: overwrites array fields wholesale
reversible: false
note: >-
A supplied array REPLACES the whole array. Sending `tags` overwrites the contact's entire tag
list; the same applies to emailAddresses, phoneNumbers and customFields. Read the current
array, append, and send the full list back.