Harvis Keys API
Account API keys. Session-only: a key cannot mint another key.
Account API keys. Session-only: a key cannot mint another key.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/harvis-dev:harvis-dev-keys-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a 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: 3.2.0
info:
title: harvis.dev Keys API
version: '1'
description: Everything an account can control, over HTTP. This document is generated from lib/api/contract.ts, which is also what the dashboard's server actions call — so what the harvis CLI can do and what the web app can do are the same list by construction. Do not edit this file by hand; run `bun run api:generate`.
servers:
- url: https://harvis.dev
tags:
- name: Keys
description: 'Account API keys. Session-only: a key cannot mint another key.'
paths:
/api/v1/keys:
get:
operationId: keys.list
summary: The account's API keys. Revoked keys are not listed
tags:
- Keys
security:
- session: []
responses:
'200':
description: The account's API keys. Revoked keys are not listed.
content:
application/json:
schema:
$ref: '#/components/schemas/ApiKeyList'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'403':
description: '`crossOrigin`, `sessionRequired`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
post:
operationId: keys.create
summary: Create an API key
description: 'The token comes back in this response and cannot be retrieved again — the row keeps only a digest of it. Session-only: a key cannot mint another key, or revoking one would mean nothing.'
tags:
- Keys
security:
- session: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateApiKeyInput'
responses:
'201':
description: Create an API key.
content:
application/json:
schema:
$ref: '#/components/schemas/CreateApiKeyResult'
'400':
description: '`invalidRequest`, `nameRequired`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'403':
description: '`crossOrigin`, `sessionRequired`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
/api/v1/keys/{keyId}:
delete:
operationId: keys.revoke
summary: Revoke an API key. Anything using it stops working immediately
tags:
- Keys
security:
- session: []
parameters:
- name: keyId
in: path
required: true
schema:
type: string
responses:
'200':
description: Revoke an API key. Anything using it stops working immediately.
content:
application/json:
schema:
$ref: '#/components/schemas/OkResult'
'401':
description: '`unauthorized`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'403':
description: '`crossOrigin`, `sessionRequired`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
'404':
description: '`keyNotFound`'
content:
application/json:
schema:
$ref: '#/components/schemas/ApiError'
components:
schemas:
CreateApiKeyResult:
type: object
properties:
key:
$ref: '#/components/schemas/ApiKey'
token:
description: 'Shown exactly once. Send it as `Authorization: Bearer <token>`.'
type: string
required:
- key
- token
additionalProperties: false
ApiKey:
type: object
properties:
id:
type: string
name:
type: string
prefix:
description: The first characters of the token, so a key can be recognised in a list.
type: string
lastUsedAt:
description: Written at most once an hour, so it lags by up to that.
anyOf:
- format: date-time
type: string
- type: 'null'
createdAt:
format: date-time
type: string
required:
- id
- name
- prefix
- lastUsedAt
- createdAt
additionalProperties: false
OkResult:
type: object
properties:
ok:
type: boolean
const: true
required:
- ok
additionalProperties: false
CreateApiKeyInput:
type: object
properties:
name:
description: What the key is for, so you can recognise it later.
type: string
maxLength: 120
required:
- name
additionalProperties: false
ApiKeyList:
type: object
properties:
keys:
type: array
items:
$ref: '#/components/schemas/ApiKey'
required:
- keys
additionalProperties: false
ApiError:
type: object
properties:
error:
type: object
properties:
code:
description: A stable machine code — see docs/api.md for the full list.
type: string
message:
description: English prose, for a human reading a log.
type: string
required:
- code
- message
additionalProperties: false
required:
- error
additionalProperties: false
securitySchemes:
apiKey:
type: http
scheme: bearer
bearerFormat: hvs_…
description: An account key, created at https://harvis.dev/dashboard/keys and shown once.
session:
type: apiKey
in: cookie
name: better-auth.session_token
description: The dashboard's own sign-in cookie. Listed because the browser calls these same endpoints; a CLI or a server should use apiKey instead.