{
  "name": "Layer",
  "alternate_name": "Layer AI",
  "description": "Layer is the AI platform for creative teams in games and entertainment: generate and edit images, video, 3D, and audio assets, train custom styles on your own art, and run node-based workflows — through the app, a REST API, or MCP.",
  "homepage": "https://www.layer.ai",
  "documentation_url": "https://www.layer.ai/docs",
  "pricing_url": "https://www.layer.ai/pricing",
  "specification": {
    "registered": false,
    "note": "/.well-known/ai-catalog.json is a conventional, non-registered path. The IANA-registered API discovery document for this domain is /.well-known/api-catalog (RFC 9727), and the MCP manifest is /.well-known/mcp. This document indexes both plus the readable content surface; where they overlap they are generated from one source and cannot disagree.",
    "api_catalog": "https://www.layer.ai/.well-known/api-catalog",
    "mcp_manifest": "https://www.layer.ai/.well-known/mcp",
    "api_index": "https://www.layer.ai/api/index.json"
  },
  "apis": {
    "rest": {
      "base_url": "https://api.app.layer.ai/api",
      "description_url": "https://www.layer.ai/openapi.json",
      "description_format": "openapi-3.1",
      "documentation_url": "https://www.layer.ai/docs/v2/rest-api",
      "versions": [
        "v1",
        "v2"
      ],
      "versioning_url": "https://www.layer.ai/docs/versioning"
    },
    "mcp": [
      {
        "id": "creative",
        "name": "Layer MCP Server",
        "description": "Generate and edit images, video, 3D, and audio; run Blueprint workflows; train styles; assemble video timelines; upload and score files.",
        "url": "https://mcp.app.layer.ai/mcp",
        "transport": "streamable-http",
        "tool_count": 36,
        "manifest_url": "https://www.layer.ai/.well-known/mcp",
        "documentation_url": "https://www.layer.ai/docs/mcp",
        "setup_url": "https://www.layer.ai/docs/mcp/setup"
      },
      {
        "id": "management",
        "name": "Layer Management MCP Server",
        "description": "Administer a workspace: projects, groups, members, roles, usage limits, and Creative Unit consumption. Kept separate so admin tools do not crowd the creative toolset.",
        "url": "https://mcp.app.layer.ai/mcp-management",
        "transport": "streamable-http",
        "tool_count": 22,
        "manifest_url": "https://www.layer.ai/.well-known/mcp",
        "documentation_url": "https://www.layer.ai/docs/mcp/management",
        "setup_url": "https://www.layer.ai/docs/mcp/management/setup"
      }
    ]
  },
  "authentication": {
    "methods": [
      "personal_access_token",
      "oauth2"
    ],
    "oauth": {
      "type": "oauth2",
      "flow": "authorization_code",
      "pkce_required": true,
      "dynamic_client_registration": true,
      "authorization_servers": [
        "https://auth.app.layer.ai/"
      ],
      "authorization_server_metadata": "https://auth.app.layer.ai/.well-known/oauth-authorization-server",
      "scopes_supported": [
        "openid",
        "profile",
        "email",
        "offline_access"
      ],
      "description": "Unauthenticated requests return 401 with a `WWW-Authenticate: Bearer resource_metadata=…` challenge pointing at the RFC 9728 protected-resource metadata for that server. Follow it to the authorization server, register dynamically, and run the authorization-code + PKCE flow.",
      "issuer": "https://auth.app.layer.ai/"
    },
    "personal_access_token": {
      "supported": true,
      "type": "personal_access_token",
      "description": "Create a Personal Access Token (prefixed `pat_`) yourself in the app under Settings → Personal Access Tokens. No approval step and no sales contact. The token value is shown once. There is no REST endpoint that mints, lists, or revokes tokens.",
      "url": "https://next.app.layer.ai/",
      "documentation_url": "https://www.layer.ai/docs/authentication"
    },
    "documentation_url": "https://www.layer.ai/docs/authentication"
  },
  "policies": {
    "permissions": {
      "model": "role-based",
      "description": "Layer authorizes every request from the calling user, not from the credential. Access is evaluated against that user's role in the target workspace (and, for project-scoped resources, their project membership). A request the user may not perform returns 403.",
      "documentation_url": "https://www.layer.ai/docs/authentication#permissions",
      "api_scopes_supported": [],
      "scoped_credentials_supported": false,
      "scoped_credentials_note": "A Personal Access Token inherits ALL of its creating user's permissions; there are no per-token scopes. To limit an integration, provision a dedicated Layer user and give that user only the workspace role and project membership it needs.",
      "roles": [
        "VIEWER",
        "MEMBER",
        "ADMIN",
        "OWNER"
      ],
      "general_rule": "GET operations require VIEWER in the target workspace. Operations that create, change, or delete state — or that start a run and therefore consume Creative Units — require at least MEMBER. Workspace and member administration requires ADMIN or OWNER."
    },
    "rate_limits": {
      "scope": "user",
      "description": "Generation is rate limited per user — the owner of the access token — not per workspace. List, get, and estimate endpoints are not rate limited, and workflow runs are not currently subject to the generation limits.",
      "documentation_url": "https://www.layer.ai/docs/rate-limits",
      "limits": [
        {
          "name": "generations",
          "description": "Generations across all modalities",
          "limit": 60,
          "window_seconds": 60
        },
        {
          "name": "video-generations",
          "description": "Video generations, counted in addition to the all-modality limit",
          "limit": 30,
          "window_seconds": 60
        }
      ],
      "exceeded": {
        "status": 429,
        "error_code": "RATE_LIMITED",
        "media_type": "application/problem+json",
        "retry_after_header": "Retry-After",
        "description": "Exceeding a limit returns 429 with a `Retry-After` header in seconds. Wait for that interval, with jitter if you run several workers, before retrying."
      },
      "response_headers": {
        "ratelimit": {
          "supported": false,
          "specification": "https://www.rfc-editor.org/rfc/rfc9331"
        },
        "x_ratelimit": {
          "supported": false
        },
        "retry_after": {
          "supported": true,
          "specification": "https://www.rfc-editor.org/rfc/rfc9110#field.retry-after"
        }
      }
    },
    "versioning": {
      "style": "uri-path",
      "description": "The REST API is path-versioned under the base URL: /v1 is the stable surface, /v2 extends inference generation with reference sets and adds the base-model and reference-set catalogs. Both are served together; v1 routes are unaffected by v2.",
      "current_versions": [
        "v1",
        "v2"
      ],
      "documentation_url": "https://www.layer.ai/docs/versioning",
      "deprecation_policy": {
        "url": "https://www.layer.ai/docs/deprecation",
        "signals": [
          {
            "name": "Deprecation header",
            "specification": "https://www.rfc-editor.org/rfc/rfc9745",
            "description": "A deprecated operation returns `Deprecation: @<unix-timestamp>` — the moment it became deprecated. It keeps working until its sunset date."
          },
          {
            "name": "Sunset header",
            "specification": "https://www.rfc-editor.org/rfc/rfc8594",
            "description": "A deprecated operation returns `Sunset: <HTTP-date>` — the moment it stops responding. Treat this as the migration deadline."
          },
          {
            "name": "Link: rel=\"deprecation\"",
            "specification": "https://www.rfc-editor.org/rfc/rfc9745#name-the-deprecation-link-relati",
            "description": "A `Link` header with `rel=\"deprecation\"` points at the migration notes."
          },
          {
            "name": "OpenAPI deprecated flag",
            "specification": "https://spec.openapis.org/oas/v3.1.0#fixed-fields-7",
            "description": "The operation is marked `deprecated: true` in /openapi.json, with `x-layer-sunset` carrying the same date as the Sunset header."
          }
        ],
        "minimum_notice_days": 90,
        "breaking_change_policy": "Breaking changes ship under a new version prefix rather than changing an existing one. New endpoints, new optional request fields, new response fields, and new enum values are non-breaking — parse responses leniently and ignore what you do not recognise."
      }
    },
    "webhooks": {
      "supported": false,
      "alternative": "poll",
      "description": "Layer does not deliver webhooks. Long-running generations are polled: start a run, then poll it on the `poll_interval_seconds` the response returns.",
      "documentation_url": "https://www.layer.ai/docs/async-jobs"
    },
    "onboarding": {
      "manifest_url": "https://www.layer.ai/api/onboarding.json",
      "documentation_url": "https://www.layer.ai/docs/self-serve-access",
      "self_serve_signup": {
        "supported": true,
        "url": "https://next.app.layer.ai/"
      },
      "sales_contact_required": false,
      "free_tier": {
        "supported": true,
        "type": "starter_credits",
        "time_limited": false,
        "description": "Creating a Layer account is free and includes a one-off grant of Creative Units, enough to run real generations before subscribing. It is not a time-limited trial and it does not expire into a locked account. Continued generation needs a subscription (from $10/month) or a CU pack; there are no seat fees or feature gates.",
        "url": "https://www.layer.ai/pricing"
      },
      "self_serve_credentials": {
        "supported": true,
        "type": "personal_access_token",
        "description": "Create a Personal Access Token (prefixed `pat_`) yourself in the app under Settings → Personal Access Tokens. No approval step and no sales contact. The token value is shown once. There is no REST endpoint that mints, lists, or revokes tokens.",
        "url": "https://next.app.layer.ai/",
        "documentation_url": "https://www.layer.ai/docs/authentication"
      },
      "oauth_connection": {
        "supported": true,
        "description": "MCP clients connect over OAuth 2.0 with PKCE and dynamic client registration — no API key and no pre-registered client. Point the client at an MCP endpoint and complete the browser sign-in it prompts for.",
        "documentation_url": "https://www.layer.ai/docs/mcp/setup"
      },
      "sandbox": {
        "supported": false,
        "description": "There is no separate sandbox or test environment. Estimate endpoints (and their MCP equivalents) price a run without executing it, which is the supported way to rehearse a call for free.",
        "documentation_url": "https://www.layer.ai/docs/creative-units"
      },
      "cost_control": "Every generation has a matching estimate operation. Call it and read `has_sufficient_creative_units` before executing a run."
    }
  },
  "content": {
    "indexes": [
      {
        "name": "llms.txt",
        "url": "https://www.layer.ai/llms.txt",
        "type": "text/plain",
        "description": "llmstxt.org index of every section of this site, with a Markdown link per page."
      },
      {
        "name": "llms-full.txt",
        "url": "https://www.layer.ai/llms-full.txt",
        "type": "text/plain",
        "description": "Full text of the site in one document, for ingestion in a single fetch."
      },
      {
        "name": "Documentation llms.txt",
        "url": "https://www.layer.ai/docs/llms.txt",
        "type": "text/plain",
        "description": "llmstxt.org index of the developer documentation (also -full and -small variants)."
      },
      {
        "name": "Sitemap",
        "url": "https://www.layer.ai/sitemap-index.xml",
        "type": "application/xml",
        "description": "Every canonical, indexable URL on this domain."
      }
    ],
    "data_endpoints": [
      {
        "name": "Pricing",
        "url": "https://www.layer.ai/pricing.json",
        "type": "application/json",
        "description": "Plans, Creative Unit packs, and per-model generation costs."
      },
      {
        "name": "API index",
        "url": "https://www.layer.ai/api/index.json",
        "type": "application/json",
        "description": "REST and MCP entry points, authentication, permissions, limits, and policy."
      },
      {
        "name": "OpenAPI description",
        "url": "https://www.layer.ai/openapi.json",
        "type": "application/json",
        "description": "Layer REST API surface as OpenAPI 3.1 (base URL https://api.app.layer.ai/api)."
      }
    ],
    "negotiation": {
      "description": "Marketing and documentation pages are also published as Markdown. Request the same path with `Accept: text/markdown`, or append `.md` to the path.",
      "specification": "https://acceptmarkdown.com",
      "example": "https://www.layer.ai/pricing.md"
    },
    "errors": {
      "description": "A missing path returns a real 404 whose body is negotiated: Markdown at /404.md, an RFC 9457 problem document at /404.json. An unsatisfiable Accept header returns 406 with the same problem-document shape.",
      "not_found_markdown": "https://www.layer.ai/404.md",
      "not_found_json": "https://www.layer.ai/404.json",
      "not_acceptable_json": "https://www.layer.ai/406.json",
      "specification": "https://www.rfc-editor.org/rfc/rfc9457"
    }
  },
  "usage": {
    "robots_txt": "https://www.layer.ai/robots.txt",
    "crawling": {
      "allowed": true,
      "description": "Every page on this site is crawlable — nothing indexable sits behind a login or paywall, and the default robots.txt group disallows no path. Two named groups qualify that: the crawlers behind an answer engine are allowed explicitly, and the crawlers that exist only to build training corpora are disallowed. Crawl politely; this is a static site behind a CDN, so there is no published crawl-delay.",
      "content_signal": {
        "value": "search=yes, ai-input=yes, ai-train=no",
        "specification": "https://contentsignals.org",
        "search": true,
        "ai_input": true,
        "ai_train": false,
        "description": "This site may be indexed for search and used as input to an AI answer (grounding or retrieval, with attribution). Its content is not offered for model training."
      },
      "allowed_agents": [
        "GPTBot",
        "OAI-SearchBot",
        "ChatGPT-User",
        "ClaudeBot",
        "Claude-SearchBot",
        "Claude-User",
        "PerplexityBot",
        "Perplexity-User",
        "Google-Extended",
        "Applebot-Extended"
      ],
      "disallowed_agents": [
        "CCBot",
        "Bytespider"
      ]
    },
    "attribution": {
      "entity": "Layer",
      "alternate_name": "Layer AI",
      "canonical_url": "https://www.layer.ai",
      "description": "Cite the canonical page URL. Every page carries a <link rel=\"canonical\">, and the Organization and WebSite JSON-LD nodes share stable @ids so \"Layer\" and \"Layer AI\" resolve to one entity on this domain."
    },
    "terms": [
      {
        "name": "Terms of Service",
        "url": "https://www.layer.ai/terms-of-service"
      },
      {
        "name": "Acceptable Use Policy",
        "url": "https://www.layer.ai/acceptable-use-policy"
      },
      {
        "name": "Privacy Policy",
        "url": "https://www.layer.ai/privacy-policy"
      },
      {
        "name": "Copyright Infringement Policy",
        "url": "https://www.layer.ai/copyright-infringement-policy"
      }
    ],
    "training_permission": {
      "granted": false,
      "signalled_by": [
        "robots.txt Content-Signal (ai-train=no)",
        "robots.txt Disallow for CCBot and Bytespider"
      ],
      "ai_input_permitted": true,
      "description": "Training a model on this content is not permitted. Using it as input to an AI answer — retrieval, grounding, summarising with attribution — is (`ai-input=yes`). No `noai`/`noimageai` meta directives are served; robots.txt and the Terms of Service are where this position is stated.",
      "terms_url": "https://www.layer.ai/terms-of-service"
    }
  },
  "discovery": {
    "api_catalog": "https://www.layer.ai/.well-known/api-catalog",
    "ai_catalog": "https://www.layer.ai/.well-known/ai-catalog.json",
    "openapi": "https://www.layer.ai/openapi.json",
    "mcp_manifest": "https://www.layer.ai/.well-known/mcp",
    "api_index": "https://www.layer.ai/api/index.json",
    "onboarding": "https://www.layer.ai/api/onboarding.json",
    "oauth_authorization_server": "https://auth.app.layer.ai/.well-known/oauth-authorization-server",
    "oauth_protected_resource": "https://mcp.app.layer.ai/.well-known/oauth-protected-resource/mcp",
    "sitemap": "https://www.layer.ai/sitemap-index.xml",
    "llms_txt": "https://www.layer.ai/llms.txt",
    "llms_full_txt": "https://www.layer.ai/llms-full.txt",
    "docs_llms_txt": "https://www.layer.ai/docs/llms.txt",
    "robots_txt": "https://www.layer.ai/robots.txt"
  },
  "developer_resources": [
    {
      "name": "Layer developer documentation",
      "url": "https://www.layer.ai/docs",
      "type": "text/html",
      "description": "Home of the Layer REST API, MCP servers, and integration guides."
    },
    {
      "name": "Layer API quickstart",
      "url": "https://www.layer.ai/docs/quickstart",
      "type": "text/html",
      "description": "Authenticate, pick a model, estimate cost, generate, and fetch results."
    },
    {
      "name": "Layer API authentication",
      "url": "https://www.layer.ai/docs/authentication",
      "type": "text/html",
      "description": "Personal Access Tokens, OAuth 2.0, and the workspace-role permission model."
    },
    {
      "name": "Layer REST API reference",
      "url": "https://www.layer.ai/docs/v2/rest-api",
      "type": "text/html",
      "description": "Every REST endpoint, generated from the OpenAPI description."
    },
    {
      "name": "Layer OpenAPI description",
      "url": "https://www.layer.ai/openapi.json",
      "type": "application/json",
      "description": "Machine-readable Layer REST API surface (OpenAPI 3.1, base URL https://api.app.layer.ai/api)."
    },
    {
      "name": "Layer API index",
      "url": "https://www.layer.ai/api/index.json",
      "type": "application/json",
      "description": "REST and MCP entry points, OAuth discovery, rate limits, versioning, onboarding."
    },
    {
      "name": "Layer agent onboarding",
      "url": "https://www.layer.ai/api/onboarding.json",
      "type": "application/json",
      "description": "Self-serve signup, credentials, the free tier, zero-cost dry runs, and every credential-free endpoint."
    },
    {
      "name": "Layer self-serve access guide",
      "url": "https://www.layer.ai/docs/self-serve-access",
      "type": "text/html",
      "description": "How to get from zero to an authenticated call without contacting sales."
    },
    {
      "name": "Layer API catalog",
      "url": "https://www.layer.ai/.well-known/api-catalog",
      "type": "application/linkset+json",
      "description": "RFC 9727 catalog of every Layer API, as an RFC 9264 linkset."
    },
    {
      "name": "Layer AI catalog",
      "url": "https://www.layer.ai/.well-known/ai-catalog.json",
      "type": "application/json",
      "description": "One entry point for an AI client: APIs, auth, policy, and the readable content surface."
    },
    {
      "name": "Layer MCP server",
      "url": "https://www.layer.ai/mcp",
      "type": "text/html",
      "description": "Connect Claude, Cursor, VS Code, Codex, or any MCP client to Layer."
    },
    {
      "name": "Layer MCP manifest",
      "url": "https://www.layer.ai/.well-known/mcp",
      "type": "application/json",
      "description": "Machine-readable manifest of both Layer MCP servers, their transport and tools."
    },
    {
      "name": "Layer MCP setup guide",
      "url": "https://www.layer.ai/docs/mcp/setup",
      "type": "text/html",
      "description": "Per-client install instructions for the Layer MCP server."
    },
    {
      "name": "Layer API rate limits",
      "url": "https://www.layer.ai/docs/rate-limits",
      "type": "text/html",
      "description": "Generation rate limits, 429 handling, and which response headers Layer sends."
    },
    {
      "name": "Layer API versioning",
      "url": "https://www.layer.ai/docs/versioning",
      "type": "text/html",
      "description": "How the REST API is versioned and what counts as a breaking change."
    },
    {
      "name": "Layer API deprecation policy",
      "url": "https://www.layer.ai/docs/deprecation",
      "type": "text/html",
      "description": "Deprecation and Sunset headers, notice period, and how removals are announced."
    },
    {
      "name": "Layer API errors",
      "url": "https://www.layer.ai/docs/errors",
      "type": "text/html",
      "description": "RFC 9457 problem details, error codes, and how to recover from each."
    },
    {
      "name": "Layer OAuth authorization server metadata",
      "url": "https://auth.app.layer.ai/.well-known/oauth-authorization-server",
      "type": "application/json",
      "description": "RFC 8414 metadata for the Layer authorization server (PKCE, dynamic registration)."
    }
  ]
}
