HomeDevelopers

REST API and MCP server

Query the Log Baseline data from your own code or from an AI assistant. The REST API and the Model Context Protocol (MCP) server are read-only, free, and need no key. Both return the same data.

Responses use dataset version 0.5.1. The baseline is generic, so check its recommendations against your own tenant.

Endpoints

Both endpoints offer the same operations with the same parameters.

REST API
https://api.baseline.infernux.no/v1
OpenAPI 3.1 document
MCP server (Streamable HTTP)
https://mcp.baseline.infernux.no/mcp
Works with clients on MCP version 2026-07-28 and on the 2025 versions.

Try the REST API

curl "https://api.baseline.infernux.no/v1/tables?q=sign%20in&tier=analytics&limit=3"

Connect an MCP client

Add the server URL to any client that supports remote MCP servers over HTTP. All tools are read-only.

VS Code .vscode/mcp.json

{
  "servers": {
    "log-baseline": {
      "type": "http",
      "url": "https://mcp.baseline.infernux.no/mcp"
    }
  }
}

Claude Code

claude mcp add --transport http log-baseline https://mcp.baseline.infernux.no/mcp

API reference

In REST, each operation is a GET request. In MCP, it is a tool call with the operation id as the tool name. Both take the same parameters and check them the same way. The sample responses are real output from dataset version 0.5.1.

Dataset

Dataset info (get_dataset_info)

Version, provenance, and record counts of the Log Baseline dataset that every other operation reads.

GET /v1/manifest

Parameters

None.

Responses
Responses for Dataset info
StatusDescription
200The dataset version, the source repository and revision, and record counts.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/manifest"

MCP tool call

{"name":"get_dataset_info","arguments":{}}
Sample response
{
  "dataVersion": "0.5.1",
  "schemaVersion": "1.4.0",
  "importedOn": "2026-10-26",
  "source": {
    "repository": "https://github.com/lnfernux/log-baseline",
    "revision": "dcfa046907a25524afa812f5f0677961d76baf1e",
    "minimumLogHorizonVersion": "0.9.0"
  },
  "counts": {
    "tables": 946,
    "activeTables": 773,
    "sharedSources": 57,
    "baselines": 3,
    "terms": 52
  },
  "site": "https://baseline.infernux.no",
  "developers": "https://baseline.infernux.no/developers/",
  "api": "https://api.baseline.infernux.no",
  "mcp": "https://mcp.baseline.infernux.no/mcp"
}

Tables

Search tables (search_tables)

Search and filter Microsoft Sentinel and Log Analytics tables by text, domain, log type, classification, tier, or rule. Returns table summaries.

GET /v1/tables

Parameters
Parameters for Search tables
NameTypeDescription
qstringin queryFree-text search. Every word must match.
domainstringin queryTaxonomy domain id. See get_taxonomy. One of identity, endpoint, network, cloud, email-collaboration, applications-workloads, data-security, infrastructure-platform, security-operations, threat-intelligence.
logTypestringin queryTaxonomy log type id. See get_taxonomy. One of activity, alert, application, audit, authentication, configuration, container, data-access, diagnostic, endpoint-telemetry, health, network-flow, posture, security-event, storage-access, threat-indicator, vulnerability.
classificationstringin query One of primary, secondary.
tierstringin queryRecommended Microsoft Sentinel tier. One of analytics, datalake.
valueRulestringin queryValue rule id. See get_rules. One of C1, C2, C3, C4, C5, C6, C7, C8, C9.
tierRulestringin queryTier rule id. See get_rules. One of T1, T2, T3, T4, T5.
includeRetiredbooleanin queryInclude legacy and deprecated tables. Default false.
limitintegerin queryPage size, 1-100. Default 25.
offsetintegerin queryNumber of results to skip. Default 0.
Responses
Responses for Search tables
StatusDescription
200A page of table summaries, sorted by relevance when q is set and by name otherwise.
400A parameter is invalid or unknown. The body lists each issue.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/tables?q=sign%20in&tier=analytics&limit=3"

MCP tool call

{"name":"search_tables","arguments":{"q":"sign in","tier":"analytics","limit":3}}
Sample response
{
  "total": 24,
  "limit": 3,
  "offset": 0,
  "nextOffset": 3,
  "items": [
    {
      "tableName": "SigninLogs",
      "description": "Interactive user sign-in events from Microsoft Entra ID including MFA, conditional access, and location",
      "category": "Identity & Access",
      "connector": "Microsoft Entra ID",
      "status": "active",
      "domainId": "identity",
      "logTypeId": "authentication",
      "classification": "primary",
      "recommendedTier": "analytics",
      "valueRule": "C2",
      "tierRule": "T1",
      "volumeClass": "medium",
      "recommendedRetentionDays": 365,
      "isFree": false,
      "lakeSupported": true
    },
    {
      "tableName": "ADFSSignInLogs",
      "description": "AD FS sign-in events from federated authentication through Active Directory Federation Services",
      "category": "Identity & Access",
      "connector": "Microsoft Entra ID",
      "status": "active",
      "domainId": "identity",
      "logTypeId": "authentication",
      "classification": "primary",
      "recommendedTier": "analytics",
      "valueRule": "C2",
      "tierRule": "T1",
      "volumeClass": "medium",
      "recommendedRetentionDays": 365,
      "isFree": false,
      "lakeSupported": true
    }
  ]
}

Lists are cut to two items and long text is shortened.

Get table (get_table)

Full baseline record for one table: classification, tier, value and tier rules with ASD and CISA mappings, evidence, shared sources, and baselines that include it.

GET /v1/tables/{tableName}

Parameters
Parameters for Get table
NameTypeDescription
tableName requiredstringin pathLog Analytics table name, for example SigninLogs. Case-insensitive.
Responses
Responses for Get table
StatusDescription
200The full table record.
400A parameter is invalid or unknown. The body lists each issue.
404No item has that id.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/tables/SigninLogs"

MCP tool call

{"name":"get_table","arguments":{"tableName":"SigninLogs"}}
Sample response
{
  "tableName": "SigninLogs",
  "description": "Interactive user sign-in events from Microsoft Entra ID including MFA, conditional access, and location",
  "category": "Identity & Access",
  "connector": "Microsoft Entra ID",
  "status": "active",
  "domainId": "identity",
  "logTypeId": "authentication",
  "classification": "primary",
  "recommendedTier": "analytics",
  "valueRule": "C2",
  "tierRule": "T1",
  "volumeClass": "medium",
  "recommendedRetentionDays": 365,
  "isFree": false,
  "lakeSupported": true,
  "domainLabel": "Identity",
  "logTypeLabel": "Authentication and sign-in",
  "keywords": [
    "sign-in",
    "login"
  ],
  "mitreSources": [
    "User Account: Authentication",
    "Logon Session: Logon Session Creation"
  ],
  "volumeDriver": "sign-in",
  "valueRuleDetail": {
    "id": "C2",
    "title": "Authentication and credential use",
    "classification": "primary",
    "records": "Authentication and credential use, including non-interactive, service principal, managed identity, federated, VPN, NAC, and password vault a…",
    "acsc": [
      {
        "section": 2,
        "title": "Network device logs",
        "detail": "VPN and NAC"
      },
      {
        "section": 3,
        "title": "Microsoft Domain Controller",
        "detail": null
      }
    ],
    "cisa": [
      {
        "section": 1,
        "title": "Identity, credential, and access management (ICAM)",
        "detail": "1b Track usage of credentials"
      }
    ]
  },
  "tierRuleDetail": {
    "id": "T1",
    "tier": "analytics",
    "title": "Near-real-time detection",
    "when": "Generic detections need near-real-time matching on single events."
  },
  "evidence": [
    {
      "id": "log-horizon-classifications",
      "title": "Log Horizon classification baseline",
      "url": "https://github.com/lnfernux/log-horizon/commit/17f20e95d5bd3558993794f2d47cd9a23ff6cc2d"
    },
    {
      "id": "log-baseline-volume-model",
      "title": "Log Baseline volume model",
      "url": "https://github.com/lnfernux/log-baseline#volume-model"
    }
  ],
  "sharedSources": [],
  "baselines": [
    "minimum",
    "recommended"
  ],
  "ruleReferences": 639
}

Lists are cut to two items and long text is shortened.

Get table fields (get_table_fields)

High-value fields, split hints, and the fields most referenced by public detection rules for one table.

GET /v1/tables/{tableName}/fields

Parameters
Parameters for Get table fields
NameTypeDescription
tableName requiredstringin pathLog Analytics table name, for example SigninLogs. Case-insensitive.
limitintegerin queryMaximum referenced fields to return. Default 25.
Responses
Responses for Get table fields
StatusDescription
200High-value fields, split hints with KQL, and referenced fields with reference counts.
400A parameter is invalid or unknown. The body lists each issue.
404No item has that id.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/tables/SigninLogs/fields?limit=5"

MCP tool call

{"name":"get_table_fields","arguments":{"tableName":"SigninLogs","limit":5}}
Sample response
{
  "tableName": "SigninLogs",
  "highValueFields": [
    "TimeGenerated",
    "UserPrincipalName"
  ],
  "splitHints": [
    {
      "description": "Keep failed sign-ins, risky sign-ins, MFA events, and all emergency access account sign-ins in Analytics. Replace the placeholders with the …",
      "kql": "(ResultType != \"0\" or RiskLevelDuringSignIn != \"none\" or ConditionalAccessStatus == \"failure\" or AuthenticationRequirement == \"multiFactorAu…"
    }
  ],
  "referencedFields": [
    {
      "field": "ResultType",
      "references": 81
    },
    {
      "field": "TimeGenerated",
      "references": 81
    }
  ],
  "ruleReferences": 639,
  "universalFields": [
    "TimeGenerated"
  ]
}

Lists are cut to two items and long text is shortened.

Shared sources

Search shared sources (search_sources)

Search log sources that share a table, such as CommonSecurityLog or Syslog vendors, each with its own classification and tier.

GET /v1/sources

Parameters
Parameters for Search shared sources
NameTypeDescription
qstringin queryFree-text search. Every word must match.
tablestringin queryLog Analytics table name, for example SigninLogs. Case-insensitive.
classificationstringin query One of primary, secondary.
tierstringin queryRecommended Microsoft Sentinel tier. One of analytics, datalake.
limitintegerin queryPage size, 1-100. Default 25.
offsetintegerin queryNumber of results to skip. Default 0.
Responses
Responses for Search shared sources
StatusDescription
200A page of shared source summaries.
400A parameter is invalid or unknown. The body lists each issue.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/sources?table=CommonSecurityLog&limit=2"

MCP tool call

{"name":"search_sources","arguments":{"table":"CommonSecurityLog","limit":2}}
Sample response
{
  "total": 40,
  "limit": 2,
  "offset": 0,
  "nextOffset": 2,
  "items": [
    {
      "sourceId": "acronis",
      "displayName": "Acronis Cyber Protect (CEF)",
      "table": "CommonSecurityLog",
      "connector": "Acronis Cyber Protect (CEF via AMA)",
      "description": "Acronis Cyber Protect alerts, including ransomware and backup protection",
      "classification": "primary",
      "recommendedTier": "analytics",
      "valueRule": "C1",
      "tierRule": "T1",
      "volumeClass": "low",
      "recommendedRetentionDays": 365
    },
    {
      "sourceId": "acronis-audit",
      "displayName": "Acronis Cyber Protect audit (CEF)",
      "table": "CommonSecurityLog",
      "connector": "Acronis Cyber Protect (CEF via AMA)",
      "description": "Acronis Cyber Protect audit events for console and policy changes",
      "classification": "primary",
      "recommendedTier": "analytics",
      "valueRule": "C3",
      "tierRule": "T1",
      "volumeClass": "low",
      "recommendedRetentionDays": 365
    }
  ]
}

Get shared source (get_source)

Full record for one shared source, including its filter, parser, split hints, and rules.

GET /v1/sources/{sourceId}

Parameters
Parameters for Get shared source
NameTypeDescription
sourceId requiredstringin pathShared source id from search_sources.
Responses
Responses for Get shared source
StatusDescription
200The full shared source record.
400A parameter is invalid or unknown. The body lists each issue.
404No item has that id.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/sources/paloalto-panos"

MCP tool call

{"name":"get_source","arguments":{"sourceId":"paloalto-panos"}}
Sample response
{
  "sourceId": "paloalto-panos",
  "displayName": "Palo Alto Networks PAN-OS (CEF)",
  "table": "CommonSecurityLog",
  "filter": "DeviceVendor =~ \"Palo Alto Networks\" and DeviceProduct =~ \"PAN-OS\"",
  "connector": "Palo Alto Networks PAN-OS (CEF via AMA)",
  "classification": "primary",
  "valueRule": "C5",
  "category": "Network Security",
  "description": "PAN-OS firewall traffic, threat, URL, and system logs",
  "keywords": [
    "palo",
    "alto"
  ],
  "mitreSources": [
    "Network Traffic: Network Traffic Flow"
  ],
  "recommendedTier": "datalake",
  "tierRule": "T3",
  "volumeClass": "very-high",
  "volumeDriver": "connection",
  "recommendedRetentionDays": 180,
  "splitHints": [
    {
      "description": "Keep threat logs and traffic that was not allowed in Analytics. Allowed traffic goes to the data lake.",
      "kql": "(Activity !~ \"TRAFFIC\" or (isnotempty(DeviceAction) and DeviceAction !~ \"allow\"))"
    }
  ],
  "sourceIds": [
    "azure-sentinel-rule-corpus",
    "log-baseline-classification-rules"
  ]
}

Lists are cut to two items and long text is shortened.

Baselines

List baselines (list_baselines)

The pre-made baselines (minimum, recommended, plus) with summaries and table counts.

GET /v1/baselines

Parameters

None.

Responses
Responses for List baselines
StatusDescription
200All baselines with summaries and table counts.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/baselines"

MCP tool call

{"name":"list_baselines","arguments":{}}
Sample response
{
  "items": [
    {
      "id": "minimum",
      "label": "Minimum",
      "summary": "Core Microsoft identity, Sentinel, Azure control-plane, and Microsoft 365 audit coverage.",
      "guidance": "Use this as a starting floor when the listed services are present. It favors broadly useful investigation records over comprehensive telemet…",
      "tableCount": 8
    },
    {
      "id": "recommended",
      "label": "Recommended",
      "summary": "Adds Microsoft Graph, common Azure resource logs, and behavior analytics.",
      "guidance": "Use this when the relevant products and Azure services are deployed. Resource-specific tables should only be enabled for resources that exis…",
      "tableCount": 16
    }
  ]
}

Lists are cut to two items and long text is shortened.

Get baseline (get_baseline)

One pre-made baseline with the reason each table is included and the full table records. Each level includes the levels below it.

GET /v1/baselines/{level}

Parameters
Parameters for Get baseline
NameTypeDescription
level requiredstringin path One of minimum, recommended, plus.
Responses
Responses for Get baseline
StatusDescription
200The baseline, why each table is included, and the full table records.
400A parameter is invalid or unknown. The body lists each issue.
404No item has that id.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/baselines/minimum"

MCP tool call

{"name":"get_baseline","arguments":{"level":"minimum"}}
Sample response
{
  "id": "minimum",
  "label": "Minimum",
  "summary": "Core Microsoft identity, Sentinel, Azure control-plane, and Microsoft 365 audit coverage.",
  "guidance": "Use this as a starting floor when the listed services are present. It favors broadly useful investigation records over comprehensive telemet…",
  "tableCount": 8,
  "logTypes": [
    "Alert",
    "Audit"
  ],
  "additions": [
    {
      "tableName": "SigninLogs",
      "reason": "Interactive authentication is the starting point for account access investigations."
    },
    {
      "tableName": "AuditLogs",
      "reason": "Directory changes expose role, application, group, and policy modifications."
    }
  ],
  "tables": [
    {
      "tableName": "SigninLogs",
      "connector": "Microsoft Entra ID",
      "classification": "primary",
      "valueRule": "C2",
      "category": "Identity & Access",
      "description": "Interactive user sign-in events from Microsoft Entra ID including MFA, conditional access, and location",
      "keywords": [
        "sign-in",
        "login"
      ],
      "mitreSources": [
        "User Account: Authentication",
        "Logon Session: Logon Session Creation"
      ],
      "recommendedTier": "analytics",
      "tierRule": "T1",
      "volumeClass": "medium",
      "volumeDriver": "sign-in",
      "isFree": false,
      "recommendedRetentionDays": 365,
      "sourceIds": [
        "log-horizon-classifications",
        "log-baseline-volume-model"
      ],
      "domainId": "identity",
      "logTypeId": "authentication"
    },
    {
      "tableName": "AuditLogs",
      "connector": "Microsoft Entra ID",
      "classification": "primary",
      "valueRule": "C3",
      "category": "Identity & Access",
      "description": "Entra ID directory audit events including user, group, role, and application changes",
      "keywords": [
        "audit",
        "entra"
      ],
      "mitreSources": [
        "User Account: User Account Modification",
        "Active Directory: Active Directory Object Modification"
      ],
      "recommendedTier": "analytics",
      "tierRule": "T1",
      "volumeClass": "medium",
      "volumeDriver": "admin-action",
      "isFree": false,
      "recommendedRetentionDays": 365,
      "sourceIds": [
        "log-horizon-classifications",
        "log-baseline-volume-model"
      ],
      "domainId": "identity",
      "logTypeId": "authentication"
    }
  ]
}

Lists are cut to two items and long text is shortened.

Rules and taxonomy

Get classification rules (get_rules)

Value rules C1-C9 with ASD and CISA mappings, tier rules T1-T5, the classification/tier matrix with live counts, the volume model, and data lake limits.

GET /v1/rules

Parameters

None.

Responses
Responses for Get classification rules
StatusDescription
200Value rules, tier rules, the matrix with table counts, the volume model, and data lake limits.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/rules"

MCP tool call

{"name":"get_rules","arguments":{}}
Sample response
{
  "guidance": {
    "acsc": "https://www.cyber.gov.au/business-government/detecting-responding-to-threats/event-logging/implementing-siem-soar-platforms/priority-logs-fo…",
    "cisa": "https://www.cisa.gov/sites/default/files/2023-02/TLP%20CLEAR%20-%20Guidance%20for%20Implementing%20M-21-31_Improving%20the%20Federal%20Gover…",
    "tableFeatures": "https://learn.microsoft.com/azure/azure-monitor/reference/tables-features"
  },
  "valueRules": [
    {
      "id": "C1",
      "title": "Detections and findings",
      "classification": "primary",
      "records": "Detections, alerts, incidents, security findings (vulnerability and posture findings), and detection pipeline health",
      "acsc": [
        {
          "section": 1,
          "title": "Endpoint detection and response (EDR) logs",
          "detail": "EDR detections"
        },
        {
          "section": 2,
          "title": "Network device logs",
          "detail": "IDS/IPS alerts"
        }
      ],
      "cisa": []
    },
    {
      "id": "C2",
      "title": "Authentication and credential use",
      "classification": "primary",
      "records": "Authentication and credential use, including non-interactive, service principal, managed identity, federated, VPN, NAC, and password vault a…",
      "acsc": [
        {
          "section": 2,
          "title": "Network device logs",
          "detail": "VPN and NAC"
        },
        {
          "section": 3,
          "title": "Microsoft Domain Controller",
          "detail": null
        }
      ],
      "cisa": [
        {
          "section": 1,
          "title": "Identity, credential, and access management (ICAM)",
          "detail": "1b Track usage of credentials"
        }
      ]
    }
  ],
  "tierRules": [
    {
      "id": "T1",
      "tier": "analytics",
      "title": "Near-real-time detection",
      "when": "Generic detections need near-real-time matching on single events."
    },
    {
      "id": "T2",
      "tier": "analytics",
      "title": "Enrichment or join target",
      "when": "Low-volume enrichment or join target for analytics-tier detections or Sentinel features."
    }
  ],
  "matrix": [
    {
      "id": "primary-analytics",
      "classification": "primary",
      "tier": "analytics",
      "valueRules": "C1-C8",
      "tierRules": [
        "T1",
        "T2"
      ],
      "definition": "High-value events that need near-real-time detection, low-volume join targets, or high-value tables the lake cannot hold.",
      "tableCount": 350,
      "rulePairs": [
        {
          "valueRule": "C1",
          "tierRule": "T1",
          "count": 130
        },
        {
          "valueRule": "C3",
          "tierRule": "T1",
          "count": 61
        }
      ]
    },
    {
      "id": "primary-datalake",
      "classification": "primary",
      "tier": "datalake",
      "valueRules": "C1-C8",
      "tierRules": [
        "T3",
        "T4"
      ],
      "definition": "High-value events at high volume detected through aggregation or jobs, or high-value context used mainly in investigations.",
      "tableCount": 239,
      "rulePairs": [
        {
          "valueRule": "C5",
          "tierRule": "T3",
          "count": 176
        },
        {
          "valueRule": "C5",
          "tierRule": "T4",
          "count": 35
        }
      ]
    }
  ],
  "volumeClasses": [
    "low",
    "medium"
  ],
  "volumeDrivers": [
    {
      "driver": "alert",
      "defaultClass": "low"
    },
    {
      "driver": "admin-action",
      "defaultClass": "low"
    }
  ],
  "dataLakeLimits": [
    "Data lake ingestion latency is up to 15 minutes.",
    "A scheduled KQL job starts at least 30 minutes after it is created."
  ]
}

Lists are cut to two items and long text is shortened.

Get taxonomy (get_taxonomy)

Domains and log types used to group tables, with active table counts.

GET /v1/taxonomy

Parameters

None.

Responses
Responses for Get taxonomy
StatusDescription
200Domains with their log types and active table counts.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/taxonomy"

MCP tool call

{"name":"get_taxonomy","arguments":{}}
Sample response
{
  "domains": [
    {
      "id": "identity",
      "label": "Identity",
      "description": "Authentication, authorization, accounts, and identity governance.",
      "tableCount": 65,
      "logTypes": [
        {
          "id": "authentication",
          "label": "Authentication and sign-in",
          "tableCount": 65
        }
      ]
    },
    {
      "id": "endpoint",
      "label": "Endpoint",
      "description": "Endpoint detections, host activity, and vulnerability telemetry.",
      "tableCount": 79,
      "logTypes": [
        {
          "id": "endpoint-telemetry",
          "label": "Endpoint telemetry",
          "tableCount": 19
        },
        {
          "id": "security-event",
          "label": "Security event",
          "tableCount": 40
        }
      ]
    }
  ]
}

Lists are cut to two items and long text is shortened.

Statistics

Get statistics (get_stats)

The numbers behind the stats page: totals, the classification/tier matrix, tables per domain and value rule, ACSC and CISA coverage, volume against the matrix, tier and retention, and the tables most referenced by public detection rules. Covers active tables only.

GET /v1/stats

Parameters

None.

Responses
Responses for Get statistics
StatusDescription
200Totals and breakdowns of the active tables, with counts split by tier.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/stats"

MCP tool call

{"name":"get_stats","arguments":{}}
Sample response
{
  "totals": {
    "tables": 773,
    "primary": 589,
    "analytics": 406,
    "referenced": 117,
    "references": 19306,
    "rulesParsed": 5158
  },
  "matrix": [
    {
      "id": "primary-analytics",
      "classification": "primary",
      "tier": "analytics",
      "tableCount": 350
    },
    {
      "id": "primary-datalake",
      "classification": "primary",
      "tier": "datalake",
      "tableCount": 239
    }
  ],
  "domains": [
    {
      "id": "identity",
      "label": "Identity",
      "tableCount": 65,
      "primary": 65,
      "secondary": 0,
      "analytics": 58,
      "datalake": 7,
      "ruleReferences": 2557,
      "logTypes": [
        {
          "id": "authentication",
          "label": "Authentication and sign-in",
          "tableCount": 65
        }
      ]
    },
    {
      "id": "endpoint",
      "label": "Endpoint",
      "tableCount": 79,
      "primary": 53,
      "secondary": 26,
      "analytics": 58,
      "datalake": 21,
      "ruleReferences": 4988,
      "logTypes": [
        {
          "id": "endpoint-telemetry",
          "label": "Endpoint telemetry",
          "tableCount": 19
        },
        {
          "id": "security-event",
          "label": "Security event",
          "tableCount": 40
        }
      ]
    }
  ],
  "valueRules": [
    {
      "id": "C1",
      "title": "Detections and findings",
      "tableCount": 139,
      "analytics": 138,
      "datalake": 1
    },
    {
      "id": "C2",
      "title": "Authentication and credential use",
      "tableCount": 37,
      "analytics": 34,
      "datalake": 3
    }
  ],
  "guidanceCoverage": [
    {
      "id": "acsc",
      "title": "ACSC priority logs for SIEM ingestion",
      "items": [
        {
          "section": 1,
          "label": "Endpoint detection and response (EDR) logs",
          "valueRules": [
            "C1",
            "C4"
          ],
          "tableCount": 173,
          "analytics": 168,
          "datalake": 5
        },
        {
          "section": 2,
          "label": "Network device logs",
          "valueRules": [
            "C1",
            "C2"
          ],
          "tableCount": 487,
          "analytics": 264,
          "datalake": 223
        }
      ]
    },
    {
      "id": "cisa",
      "title": "CISA M-21-31 event types",
      "items": [
        {
          "section": 1,
          "label": "Identity, credential, and access management (ICAM)",
          "valueRules": [
            "C2",
            "C3"
          ],
          "tableCount": 118,
          "analytics": 107,
          "datalake": 11
        },
        {
          "section": 2,
          "label": "Operating systems",
          "valueRules": [
            "C4"
          ],
          "tableCount": 34,
          "analytics": 30,
          "datalake": 4
        }
      ]
    }
  ],
  "volumeByCell": [
    {
      "volumeClass": "low",
      "cells": {
        "primary-analytics": 191,
        "primary-datalake": 3,
        "secondary-analytics": 24,
        "secondary-datalake": 91
      }
    },
    {
      "volumeClass": "medium",
      "cells": {
        "primary-analytics": 90,
        "primary-datalake": 39,
        "secondary-analytics": 17,
        "secondary-datalake": 20
      }
    }
  ],
  "volumeDrivers": [
    {
      "driver": "connection",
      "defaultClass": "very-high",
      "tableCount": 184,
      "analytics": 10,
      "datalake": 174
    },
    {
      "driver": "alert",
      "defaultClass": "low",
      "tableCount": 129,
      "analytics": 127,
      "datalake": 2
    }
  ],
  "tierRetention": [
    {
      "tier": "analytics",
      "retentionDays": 90,
      "tableCount": 16
    },
    {
      "tier": "analytics",
      "retentionDays": 180,
      "tableCount": 96
    }
  ],
  "topReferencedTables": [
    {
      "tableName": "Pathlock_TDnR_CL",
      "references": 1771
    },
    {
      "tableName": "SecurityEvent",
      "references": 1182
    }
  ]
}

Lists are cut to two items and long text is shortened.

Get field statistics (get_field_stats)

The fields most referenced by public detection rules, across all active tables or narrowed to a domain or log type. Use get_table_fields for one table.

GET /v1/stats/fields

Parameters
Parameters for Get field statistics
NameTypeDescription
domainstringin queryTaxonomy domain id. See get_taxonomy. One of identity, endpoint, network, cloud, email-collaboration, applications-workloads, data-security, infrastructure-platform, security-operations, threat-intelligence.
logTypestringin queryTaxonomy log type id. See get_taxonomy. One of activity, alert, application, audit, authentication, configuration, container, data-access, diagnostic, endpoint-telemetry, health, network-flow, posture, security-event, storage-access, threat-indicator, vulnerability.
limitintegerin queryMaximum fields to return. Default 25.
Responses
Responses for Get field statistics
StatusDescription
200Fields with their reference counts, most referenced first, and how many tables were counted.
400A parameter is invalid or unknown. The body lists each issue.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/stats/fields?domain=identity&limit=5"

MCP tool call

{"name":"get_field_stats","arguments":{"domain":"identity","limit":5}}
Sample response
{
  "domain": "identity",
  "logType": null,
  "tableCount": 65,
  "referencedTables": 18,
  "rulesParsed": 5158,
  "items": [
    {
      "field": "TimeGenerated",
      "references": 322
    },
    {
      "field": "OperationName",
      "references": 173
    }
  ]
}

Lists are cut to two items and long text is shortened.

Dictionary

Search dictionary (search_terms)

Search the Log Baseline dictionary of terms such as primary, data lake, or split candidate.

GET /v1/dictionary

Parameters
Parameters for Search dictionary
NameTypeDescription
qstringin queryFree-text search. Every word must match.
limitintegerin queryPage size, 1-100. Default 25.
offsetintegerin queryNumber of results to skip. Default 0.
Responses
Responses for Search dictionary
StatusDescription
200A page of dictionary terms.
400A parameter is invalid or unknown. The body lists each issue.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/dictionary?q=data%20lake&limit=2"

MCP tool call

{"name":"search_terms","arguments":{"q":"data lake","limit":2}}
Sample response
{
  "total": 13,
  "limit": 2,
  "offset": 0,
  "nextOffset": 2,
  "items": [
    {
      "id": "data-lake-tier",
      "term": "Data lake tier",
      "definition": "Low-cost, long-term storage in the Microsoft Sentinel data lake. Data is queried on demand, searched at scale, or summarized into the analyt…",
      "links": [
        {
          "label": "Microsoft: Data lake tier",
          "href": "https://learn.microsoft.com/azure/sentinel/log-plans#data-lake-tier"
        },
        {
          "label": "Microsoft: Sentinel data lake overview",
          "href": "https://learn.microsoft.com/azure/sentinel/datalake/sentinel-lake-overview"
        }
      ],
      "sectionId": "tiers",
      "section": "Sentinel tiers"
    },
    {
      "id": "mirroring",
      "term": "Mirroring",
      "definition": "Data ingested into the analytics tier is also written to the data lake tier as a single copy. The lake therefore always holds the full datas…",
      "sectionId": "data-movement",
      "section": "Data movement"
    }
  ]
}

Lists are cut to two items and long text is shortened.

Get dictionary term (get_term)

One dictionary term with its definition and links.

GET /v1/dictionary/{termId}

Parameters
Parameters for Get dictionary term
NameTypeDescription
termId requiredstringin pathTerm id from search_terms.
Responses
Responses for Get dictionary term
StatusDescription
200The term with its definition, section, and links.
400A parameter is invalid or unknown. The body lists each issue.
404No item has that id.
429Too many requests. Wait the number of seconds in Retry-After.
Example request
curl "https://api.baseline.infernux.no/v1/dictionary/primary"

MCP tool call

{"name":"get_term","arguments":{"termId":"primary"}}
Sample response
{
  "id": "primary",
  "term": "Primary",
  "definition": "A table whose value rule is one of C1 to C8: detections and findings, authentication, identity and configuration changes, endpoint and opera…",
  "links": [
    {
      "label": "Methodology: Value rules",
      "href": "/methodology/#value-rules"
    },
    {
      "label": "Building a practical log baseline",
      "href": "https://infernux.no/blog/buildingapracticallogbaseline/"
    }
  ],
  "sectionId": "classification",
  "section": "Classification"
}

Lists are cut to two items and long text is shortened.

Limits and behavior

Rate limits
Each client can send about 120 REST requests and 60 MCP requests per minute. Above that, you get HTTP 429 and a Retry-After header with the number of seconds to wait.
Paging
List operations take limit (1-100, default 25) and offset. Responses include total and nextOffset, which is null on the last page.
Caching
REST responses include an ETag and can be cached for an hour. Send it back in If-None-Match to get 304 Not Modified when the data hasn't changed.
Versions
The X-Baseline-Version header shows the dataset version. If a response changes in a way that breaks clients, it moves to a new path, such as /v2.
Errors
Errors return JSON with error and message. A 400 also lists what failed validation, including unknown parameters. In MCP, the tool result has isError set and the same body.
Cold starts
The services shut down when idle. The first request after a quiet period can take a few seconds.

Usage data

Each request creates one usage record with metadata only. Records are kept for 30 days. They show which data is used and help stop abuse. A record contains:

  • REST or MCP, the operation name, and the HTTP status
  • The names of the parameters you sent, but not their values
  • The table, source, baseline, or term you looked up, if it exists in the dataset
  • Duration, response size, result count, and dataset version
  • The client type from the User-Agent header, such as curl or browser, and the name and version an MCP client sends
  • A hash of your IP address, or of the /64 network for IPv6

Search text, parameter values, and IP addresses are not stored. The IP hash uses a secret key, so it can't be matched back to an address without that key. It makes it possible to rate limit or block one client. Blocked clients get HTTP 403. If you think you were blocked by mistake, open an issue .