{
    "name": "LaraBug API",
    "description": "Error tracking for Laravel and JavaScript applications: exceptions, slow requests, queries, queues, scheduled tasks and dependency vulnerabilities, each with the request context behind it.",
    "documentation": {
        "html": "https://v4.larabug.com/docs/integrations/http-api",
        "markdown": "https://v4.larabug.com/docs/integrations/http-api.md",
        "llms_txt": "https://v4.larabug.com/llms.txt"
    },
    "authentication": {
        "ingest_key": {
            "type": "bearer",
            "header": "Authorization: Bearer YOUR_INGEST_KEY",
            "description": "The application's ingest key, on its settings page in the panel, sent beside the project key in the body. It posts events to that one application and reaches nothing else, which is why it is safe in a browser bundle."
        },
        "account_token": {
            "type": "bearer",
            "header": "Authorization: Bearer YOUR_ACCOUNT_TOKEN",
            "description": "Your account token, which POST /api/login returns for an email and a password. It is the whole account, and it sees exactly what its owner sees."
        },
        "none": {
            "type": "none",
            "description": "Open. Rate limited by address."
        }
    },
    "endpoints": [
        {
            "method": "GET",
            "path": "/api/exceptions",
            "description": "Exceptions across every application you can see.",
            "authentication": "account_token"
        },
        {
            "method": "DELETE",
            "path": "/api/exceptions/{exception}",
            "description": "Delete an exception.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/exceptions/{exception}",
            "description": "One exception.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/exceptions/{exception}/read",
            "description": "Mark an exception read.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/exceptions/{exception}/toggle-public",
            "description": "Turn an exception's public page on or off.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/feedback",
            "description": "Submit a report from the feedback widget, tied to the error behind it.",
            "authentication": "none"
        },
        {
            "method": "GET",
            "path": "/api/issues",
            "description": "Issues across every application you can see. Grouped occurrences, which is what the panel browses; the exception endpoints below are the flat rows underneath them.",
            "authentication": "account_token"
        },
        {
            "method": "DELETE",
            "path": "/api/issues/{issue}",
            "description": "Delete an issue and everything under it.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/issues/{issue}",
            "description": "One issue.",
            "authentication": "account_token"
        },
        {
            "method": "PATCH",
            "path": "/api/issues/{issue}/assignee",
            "description": "Give an issue to someone, or clear its assignee by sending no user.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/issues/{issue}/occurrences",
            "description": "The occurrences behind an issue, newest first.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/issues/{issue}/occurrences/{exception}",
            "description": "One occurrence, with its stack trace and the request behind it.",
            "authentication": "account_token"
        },
        {
            "method": "PATCH",
            "path": "/api/issues/{issue}/priority",
            "description": "Set an issue's priority, or clear it by sending none.",
            "authentication": "account_token"
        },
        {
            "method": "DELETE",
            "path": "/api/issues/{issue}/snooze",
            "description": "Wake a snoozed issue now.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/issues/{issue}/snooze",
            "description": "Stop an issue notifying for a number of minutes.",
            "authentication": "account_token"
        },
        {
            "method": "PATCH",
            "path": "/api/issues/{issue}/status",
            "description": "Set an issue's status to OPEN, READ or FIXED.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/log",
            "description": "Report an event. What the clients post to, with the project key in the body beside the application's ingest key in the header.",
            "authentication": "ingest_key"
        },
        {
            "method": "POST",
            "path": "/api/login",
            "description": "Exchange an email and password for an account token. What the mobile apps sign in with.",
            "authentication": "none"
        },
        {
            "method": "GET",
            "path": "/api/projects",
            "description": "Your applications.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/projects",
            "description": "Create an application.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}",
            "description": "One application.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/cache",
            "description": "Its cache events.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/commands",
            "description": "The commands it ran.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/exceptions",
            "description": "Its exceptions.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/exceptions/{exception}",
            "description": "One of its exceptions.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/issues",
            "description": "Its issues.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/mail",
            "description": "The mail it sent.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/members",
            "description": "Who an issue in it can be assigned to.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/notifications",
            "description": "The notifications it sent.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/queries",
            "description": "Its queries.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/queue-jobs",
            "description": "Its queue jobs.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/projects/{project}/scheduled-tasks",
            "description": "Its scheduled tasks.",
            "authentication": "account_token"
        },
        {
            "method": "POST",
            "path": "/api/register-fcm-token",
            "description": "Register a device for the mobile app's push notifications.",
            "authentication": "none"
        },
        {
            "method": "POST",
            "path": "/api/sourcemaps",
            "description": "Upload one JavaScript source map for a release, as multipart fields release, minified_url (a full url, or ~/ and a path for any host), sourcemap and an optional dist. 201 for a new file, 200 for a replaced one, 413 when it is too large, 422 when it is not a version 3 map.",
            "authentication": "ingest_key"
        },
        {
            "method": "GET",
            "path": "/api/sourcemaps/releases/{release}",
            "description": "The source maps a release has, for a build to check its upload against.",
            "authentication": "ingest_key"
        },
        {
            "method": "GET",
            "path": "/api/sponsors",
            "description": "The sponsors shown in the panel.",
            "authentication": "account_token"
        },
        {
            "method": "GET",
            "path": "/api/user",
            "description": "The account the token belongs to.",
            "authentication": "account_token"
        }
    ],
    "rate_limit": {
        "authenticated": "Per account, 600 requests a minute on the free plan and 6,000 on every paid plan. A ceiling against runaway clients rather than a plan feature: how much an account may send in a month is set by its issue and telemetry allowances, which answer 402 for the allowance that is spent. Every response carries X-RateLimit-Limit and X-RateLimit-Remaining.",
        "ingest": "POST /api/log counts issues (exceptions, JavaScript errors, CVE scans) and telemetry (every batch and queue job) in separate buckets of that size, so a burst of telemetry never throttles an exception.",
        "anonymous": "60 requests per minute, by address."
    },
    "mcp": {
        "endpoint": "https://v4.larabug.com/mcp",
        "transport": "http",
        "authentication": "oauth",
        "install": "claude mcp add --transport http larabug https://v4.larabug.com/mcp",
        "documentation": "https://v4.larabug.com/docs/integrations/mcp-server",
        "description": "The same account, read by an assistant: issues, occurrences with their stack traces, and the CVE findings. Reading needs the read scope, and changing an issue needs write."
    }
}