Lacuna · Authentication Profile
Lacuna Authentication
Authentication
Lacuna secures its APIs with http and oauth2 across 2 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode flow(s).
AI MusicMusic GenerationAI Song GeneratorAI Lyrics GeneratorAudioMIDISongwritingGenerative AIMCP ServerAgent SkillsA2ADeveloper ToolsAccountAuthentication
Methods: http, oauth2
Schemes: 2
OAuth flows: authorizationCode
API key in: header
Security Schemes
bearerAuth http
scheme: bearer
oauth2 oauth2
· flows: authorizationCode
Source
Authentication Profile
generated: '2026-09-11'
method: searched
source: openapi/lacuna-music-openapi-original.json
docs: https://www.lacuna.fm/auth.md
discovery:
authorization_server_metadata: https://www.lacuna.fm/.well-known/oauth-authorization-server
protected_resource_metadata: https://www.lacuna.fm/.well-known/oauth-protected-resource
jwks_uri: https://www.lacuna.fm/.well-known/jwks.json
agent_auth_guide: https://www.lacuna.fm/auth.md
summary:
types:
- http
- oauth2
api_key_in:
- header
oauth2_flows:
- authorizationCode
anonymous_tier: false
notes: >-
Two credential paths, both requiring a human account holder at some point: a developer API key
(recommended for autonomous agents, the only browser-free path) or OAuth 2.0 authorization code
with PKCE for manually-registered first-party clients. Dynamic client registration (RFC 7591) is
explicitly NOT supported. The same Authorization: Bearer header is used across REST, MCP and A2A.
schemes:
- name: bearerAuth
type: http
scheme: bearer
description: >-
Lacuna developer API key issued from the dashboard at /profile/api and sent as
`Authorization: Bearer lyr_live_...`. Shown once at creation. Keys carry scopes and an optional
expiry set at creation time; revocation at the same URL takes effect immediately. Requires an
active Pro plan or above — the tier check runs on every request, so a downgrade invalidates
live keys without revoking them (403 permission_error / tier_insufficient).
key_prefix: lyr_live_
registration_url: https://www.lacuna.fm/profile/api
requires_human_interaction: true
sources:
- openapi/lacuna-music-openapi-original.json
- well-known/lacuna-auth.md
- a2a/lacuna-agent-card.json
- mcp/lacuna-mcp-server-card.json
- name: oauth2
type: oauth2
description: >-
OAuth 2.0 authorization code flow with PKCE (S256 required) for first-party clients registered
manually with Lacuna. Public clients — token_endpoint_auth_method is `none`. Access tokens live
15 minutes; refresh tokens are issued to the iOS client only.
flows:
- flow: authorizationCode
authorizationUrl: https://www.lacuna.fm/oauth/authorize
tokenUrl: https://www.lacuna.fm/oauth/token
revocationUrl: https://www.lacuna.fm/oauth/revoke
code_challenge_methods_supported:
- S256
scopes: 5
grant_types_supported:
- authorization_code
- refresh_token
- 'urn:lacuna:params:oauth:grant-type:apple-assertion'
revocation:
standard: RFC 7009
endpoint: https://www.lacuna.fm/oauth/revoke
accepts: [access_token, refresh_token]
auth_methods_supported: [none]
always_200: true
note: >-
Published in the authorization-server metadata as `revocation_endpoint` and documented as Step 3
of auth.md. Both were added between the 2026-08-09 and 2026-09-11 rounds — the August metadata
carried no revocation_endpoint at all.
private_grants:
- grant_type: 'urn:lacuna:params:oauth:grant-type:apple-assertion'
registered_for: lacuna-ios
third_party_usable: false
note: >-
A private Sign-in-with-Apple assertion grant added alongside the iOS app (2026-09-04
changelog). The client sends Apple's identity token, the original 43-character nonce and
Apple's single-use authorization code; a missing or blank code is rejected with
invalid_request, and Lacuna tokens are issued only after Apple accepts the code and confirms
it belongs to the same Apple user. Registered only for `lacuna-ios` — third-party clients
cannot use it.
dynamic_client_registration: false
dcr_note: >-
auth.md is explicit that Lacuna supports neither dynamic client registration (RFC 7591), nor
ID-JAG assertions, nor an anonymous claim ceremony — there are exactly two credential paths and
both put a human account holder in the loop at some point.
sources:
- well-known/lacuna-oauth-authorization-server.json
- well-known/lacuna-auth.md
- a2a/lacuna-agent-card.json
credential_introspection:
operation: getMe
endpoint: GET https://www.lacuna.fm/api/v1/me
cost: free — no credits consumed
returns: auth.kind (api_key|oauth), auth.scopes[], auth.key.id / name / expires_at, plan, credit balance, rate limits
note: >-
The API now lets a credential describe itself. This is the documented connection test and the only
way for an agent to learn its own scopes, plan eligibility and key expiry without attempting a
billable call and reading the 402/403. Added to the published OpenAPI since the August round.
challenge:
header: WWW-Authenticate
example: 'Bearer realm="lacuna", resource_metadata="https://www.lacuna.fm/.well-known/oauth-protected-resource", error="invalid_token", error_description="Invalid API key"'
rfc9728_pointer: true
note: >-
A 401 points the caller back at the protected-resource metadata in the challenge itself, which is
the RFC 9728 discovery loop working as intended — an agent that arrives with nothing can bootstrap
from a single failed call.
surfaces:
- surface: REST
endpoint: https://www.lacuna.fm/api/v1/me
auth_required: true
note: Free credential/plan/credit introspection; the documented connection test.
- surface: REST
endpoint: https://www.lacuna.fm/api/v1/music/generations
auth_required: true
- surface: MCP (Streamable HTTP)
endpoint: https://www.lacuna.fm/mcp
auth_required: partial
note: initialize and tools/list answer anonymously; tools/call requires a credential.
- surface: A2A (JSON-RPC)
endpoint: https://www.lacuna.fm/a2a
auth_required: true
note: Anonymous POST observed returning 401 authentication_error / invalid_api_key.
x-evidence:
fetched: '2026-09-11'
urls:
- url: https://www.lacuna.fm/auth.md
http_status: 200
- url: https://www.lacuna.fm/.well-known/oauth-authorization-server
http_status: 200
- url: https://www.lacuna.fm/.well-known/oauth-protected-resource
http_status: 200
- url: https://www.lacuna.fm/api/openapi.json
http_status: 200
- url: https://www.lacuna.fm/.well-known/jwks.json
http_status: 200
Work with this as data
Every security artifact 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 security posture
4 MCP tools reach this
find_securityBrowse and filter every security artifact in the catalog.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.
Call it yourself
curl for this page
This security artifact
curl "https://apis.io/api/v1/security/lacuna-authentication"
All security posture
curl "https://apis.io/api/v1/security?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.