WritersLogic Verifiable AI Agent Hub API Keys API
API key generation and revocation (JWT auth only)
API key generation and revocation (JWT auth only)
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/writerslogic-com:writerslogic-com-api-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: WritersProof API Keys API
version: 1.0.0
description: Certificate Authority and verification API for the Proof-of-Effort protocol. Certify, verify, and prove human authorship.
contact:
name: WritersLogic LLC
url: https://writersproof.com
license:
name: SSPL-1.0
url: https://www.mongodb.com/licensing/server-side-public-license
servers:
- url: https://api.writersproof.com
description: Production
- url: https://api.writerslogic.com
description: Legacy
tags:
- name: API Keys
description: API key generation and revocation (JWT auth only)
paths:
/v1/apikeys:
post:
tags:
- API Keys
operationId: createApiKey
summary: Create an optionally expiring API key
security:
- bearerAuth: []
description: 'Self-service keys are always free. The plaintext is returned exactly once; only its SHA-256 digest is stored. Omit expiresInDays for a non-expiring key. Maximum 5 creations/minute/account. This operation is not idempotent: if the network loses the response, list and revoke the unusable key before issuing a replacement.'
requestBody:
required: true
content:
application/json:
schema:
type: object
additionalProperties: false
required:
- name
properties:
name:
type: string
minLength: 1
maxLength: 128
expiresInDays:
type: integer
minimum: 1
maximum: 365
responses:
'201':
description: 'Secret shown once; Cache-Control: private, no-store'
content:
application/json:
schema:
type: object
required:
- id
- name
- key
- key_prefix
- tier
- expires_at
- created_at
properties:
id:
type: string
format: uuid
name:
type: string
key_prefix:
type: string
tier:
type: string
enum:
- free
- compliance
created_at:
type: string
format: date-time
expires_at:
type:
- string
- 'null'
format: date-time
last_used_at:
type:
- string
- 'null'
format: date-time
key:
type: string
pattern: ^wp_sk_[a-f0-9]{64}$
'400':
description: Invalid JSON or validation failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'401':
description: Missing, invalid, expired, or revoked credential
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'429':
description: Rate limit exceeded. Retry after the indicated delay.
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
headers:
Retry-After:
schema:
type: integer
minimum: 1
'500':
description: Internal failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'503':
description: Service temporarily unavailable
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
get:
tags:
- API Keys
operationId: listApiKeys
summary: List non-revoked keys, including expired keys
security:
- bearerAuth: []
parameters:
- name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 20
- name: offset
in: query
schema:
type: integer
minimum: 0
maximum: 100000
default: 0
responses:
'200':
description: Key metadata; secrets and hashes are never returned
content:
application/json:
schema:
type: object
required:
- data
- pagination
properties:
data:
type: array
items:
type: object
required:
- id
- name
- key_prefix
- tier
- created_at
- expires_at
- last_used_at
properties:
id:
type: string
format: uuid
name:
type: string
key_prefix:
type: string
tier:
type: string
enum:
- free
- compliance
created_at:
type: string
format: date-time
expires_at:
type:
- string
- 'null'
format: date-time
last_used_at:
type:
- string
- 'null'
format: date-time
pagination:
type: object
required:
- limit
- offset
- hasMore
properties:
limit:
type: integer
offset:
type: integer
hasMore:
type: boolean
'400':
description: Invalid JSON or validation failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'401':
description: Missing, invalid, expired, or revoked credential
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'429':
description: Rate limit exceeded. Retry after the indicated delay.
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
headers:
Retry-After:
schema:
type: integer
minimum: 1
'500':
description: Internal failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'503':
description: Service temporarily unavailable
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
/v1/apikeys/{id}:
patch:
tags:
- API Keys
operationId: renameApiKey
summary: Rename an active key without replacing its secret
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- name
additionalProperties: false
properties:
name:
type: string
minLength: 1
maxLength: 128
responses:
'200':
description: Updated metadata
content:
application/json:
schema:
type: object
properties:
id:
type: string
format: uuid
name:
type: string
'400':
description: Invalid JSON or validation failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'401':
description: Missing, invalid, expired, or revoked credential
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'404':
description: Key not found or not owned by you
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'409':
description: Key is revoked
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'429':
description: Rate limit exceeded. Retry after the indicated delay.
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
headers:
Retry-After:
schema:
type: integer
minimum: 1
'500':
description: Internal failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'503':
description: Service temporarily unavailable
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
delete:
tags:
- API Keys
operationId: revokeApiKey
summary: Revoke a key; repeating the request is safe
security:
- bearerAuth: []
parameters:
- name: id
in: path
required: true
schema:
type: string
format: uuid
description: An owned key that is already revoked returns 200 again. In-flight requests authenticated before revocation may complete.
responses:
'200':
description: Key revoked
content:
application/json:
schema:
type: object
required:
- id
- revoked
properties:
id:
type: string
format: uuid
revoked:
const: true
'400':
description: Invalid JSON or validation failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'401':
description: Missing, invalid, expired, or revoked credential
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'403':
description: Key belongs to another account
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'404':
description: Key does not exist
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'429':
description: Rate limit exceeded. Retry after the indicated delay.
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
headers:
Retry-After:
schema:
type: integer
minimum: 1
'500':
description: Internal failure
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
'503':
description: Service temporarily unavailable
content:
application/json:
schema:
type: object
required:
- error
properties:
error:
type: string
code:
type: string
description: Stable machine-readable code, where available
requestId:
type: string
format: uuid
details:
type: object
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
description: Supabase JWT token
apiKeyAuth:
type: apiKey
in: header
name: X-API-Key
description: API key with wp_sk_ prefix