Dageno Insight API
    • API & MCP Guide
    • Overview
    • Authentication
    • Errors
    • MCP Integration
    • Query Parameters & Limits
    • API Reference
      • Projects
        • List authorized projects
        • Get project configuration
      • Tracking
        • List topics
        • List prompts
        • Get Tracking metrics
        • Get Tracking citations
        • List Tracking responses
        • Get Tracking response
      • Market
        • List authorized markets
        • Get market metrics
        • Get market citations
        • List market responses
        • Get entity details
        • List child entities
        • List co-mentioned entities
        • List entity sources

    API & MCP Guide

    Access project data through 16 read-only endpoints or the matching MCP tools. Both use the same API key, project authorization and backend allowances. In this documentation, market is the public term for the scope identified by categoryId; existing paths and JSON field names are unchanged.

    Connect to the service#

    InterfaceProduction URLAuthentication
    Public APIhttps://api.dageno.ai/llm-data-service/api/v1/llm-data/publicAuthorization: Bearer API_KEY
    MCP (Streamable HTTP)https://api.dageno.ai/llm-data-mcp/mcpSame key and header
    Create a dg_live_ key in the console. Each key currently authorizes one project and accesses real data in its service environment. Do not send a login JWT, x-team-id or x-project-id to data endpoints.
    API/MCP access must be enabled in the team's effective subscription entitlements (mcpEnabled: true). The subscription must be non-Free, active or canceling, and unexpired. This is checked on every data request. Starter access is not assumed: it requires the entitlement to be explicitly enabled. Disabling access, expiry or a downgrade to Free also blocks existing keys.
    Start with GET /projects, then GET /projects/{projectId} to obtain authorized markets, brands, platforms, regions and effective limits.
    MCP client configuration:
    {
      "mcpServers": {
        "dagenoai-llm-data": {
          "url": "https://api.dageno.ai/llm-data-mcp/mcp",
          "headers": { "Authorization": "Bearer API_KEY" }
        }
      }
    }

    Request parameters#

    Only use parameters listed by the endpoint. Unknown parameters are rejected.
    ParameterMeaning
    projectIdAuthorized project UUID; an API path parameter or MCP argument
    entityIdPublic entity UUID returned by the service
    responseIdTracking response ID returned by the response list
    startDate, endDateInclusive business dates in YYYY-MM-DD format; required for statistical queries
    categoryIdAuthorized L3 market UUID from market.categories; identifies a market
    platforms, regionsPlatform/region codes; Tracking accepts up to 20/50 values, Market accepts one of each. Regions use uppercase two-letter codes
    topicIds, promptIdsTracking topic/prompt UUIDs; up to 50/100 values
    brandsTracking brand domains from the configured comparison set; up to 51
    brandIdsPublic brand UUIDs in the market comparison set; up to 100
    brandIdSingle brand for market citations; valid only with population=brand
    intentIdsL2 intent codes returned by an intent grouping; up to 20
    sourceDomainExact source domain, without a protocol or path
    populationMarket citations: market (default, whole market) or brand (responses mentioning the selected brand)
    collectedAfterExclusive Tracking ingestion timestamp in ISO 8601 with timezone; not the annotation update time
    pageSize, cursorCursor pagination; pageSize defaults to 20. Omit cursor on the first page
    limitAggregate/ranking row limit; defaults to 50, or 20 for co-mentions
    For arrays, use comma-separated API query values, such as platforms=chatgpt,gemini, and JSON arrays in MCP, such as "platforms":["chatgpt","gemini"]. MCP metric groupBy uses an array; citation/source groupBy is a single string.
    Metric endpointSupported groupBy combinations
    Trackingbrand, date, prompt, platform, region, topic; brand+date, brand+platform, brand+region, brand+topic, brand+prompt, platform+date
    Marketbrand, date, platform, region, intent; brand+date
    Use commas for combined API groupings, such as groupBy=brand,date. Grouping order may be reversed. Without a brand grouping, select at most one brand; the default is the own brand. With a brand grouping, Tracking defaults to configured brands, while Market defaults to Top N plus the own brand and configured competitors.

    Endpoints and MCP tools#

    All data endpoints use GET. Paths are relative to the Public API URL. P means /projects/{projectId} and E means P/market/entities/{entityId}. MCP path parameters are included in arguments.
    In the table, dates means required startDate and endDate. Tracking filters means optional platforms, regions, topicIds and promptIds. Market filters means optional platforms and regions. Data types are defined below.
    PathMCP toolParametersdata
    /projectslist_projectsOptional pageSize≤100, cursorProject[]
    Pget_projectNo query parametersProjectDetail
    P/tracking/topicslist_tracking_topicsOptional pageSize≤100, cursorTopic[]
    P/tracking/promptslist_tracking_promptsOptional topicIds, pageSize≤100, cursorPrompt[]
    P/tracking/metricsget_tracking_metricsRequired dates, groupBy; optional Tracking filters, brands, limit≤10000MetricRow<TrackingMetrics>[]
    P/tracking/citationsget_tracking_citationsRequired dates, groupBy; optional Tracking filters, sourceDomain, limit≤100Citation[]
    P/tracking/responseslist_tracking_responsesRequired dates; optional Tracking filters, collectedAfter, pageSize≤50, cursorTrackingResponse[]
    P/tracking/responses/{responseId}get_tracking_responseNo query parametersTrackingResponse
    P/market/categorieslist_market_categoriesRequired datesMarketScope
    P/market/metricsget_market_metricsRequired dates, categoryId, groupBy; optional Market filters, brandIds, intentIds, limit≤10000MetricRow<MarketMetrics>[]
    P/market/citationsget_market_citationsRequired dates, categoryId, groupBy; optional Market filters, population, brandId, sourceDomain, limit≤100Citation[]
    P/market/responseslist_market_responsesRequired dates, categoryId; optional Market filters, brandIds, intentIds, pageSize≤20, cursorMarketResponse[]
    Eget_market_entityRequired datesEntityDetail
    E/relationsget_market_entity_relationsRequired dates; optional limit≤50Relation[]
    E/co-mentionsget_market_entity_co_mentionsRequired dates; optional limit≤20CoMention[]
    E/sourcesget_market_entity_sourcesRequired dates, groupBy; optional limit≤50EntitySource[]
    Graph endpoints do not accept market, platform or region filters. Their population is global responses associated with the entity.

    Response structure#

    API success responses have data and meta. Lists return a data array; details return a data object. The following TypeScript describes the JSON fields. ? means an optional field. Timestamps are ISO 8601 strings; dates are YYYY-MM-DD.
    type Result<T> = { data: T; meta: Meta };
    type Meta = {
      requestId: string; generatedAt: string;
      hasMore?: boolean; nextCursor?: string | null;
      truncated?: boolean; limit?: number; maxRecords?: number;
      timezone?: string;
      requestedRange?: { startDate: string; endDate: string };
      effectiveRange?: { startDate: string; endDate: string } | null;
      validDays?: number; dataAsOf?: string | null;
      population?: string; aggregation?: string;
      aggregations?: Record<string, string>;
      metricVersion?: string; scopeVersion?: string; quality?: string;
      sample?: { mode: string; size: number | null; limit: number | null };
      syncLookbackDays?: number;
      segmentSelection?: string;
    };
    type NamedCode = { code: string; name: string };
    type Market = { categoryId: string; name: string };
    type TrackingBrand = { domain: string; name: string; isOwn: boolean };
    type MarketBrand = { entityId: string; name: string; isOwn: boolean; isConfigured: boolean };
    type Budget = { used: number; limit: number; remaining: number; resetAt: string };
    type Project = {
      projectId: string; name: string; brand: { name: string; domain: string };
      modules: { tracking: boolean; market: boolean }; capabilities: string[];
    };
    type ProjectDetail = Project & {
      tracking: { brands: TrackingBrand[]; platforms: NamedCode[]; regions: NamedCode[];
        timezone: string; dataAsOf: string | null } | null;
      market: { ownBrand: MarketBrand; competitors: MarketBrand[]; categories: Market[];
        platforms: NamedCode[]; regions: NamedCode[]; timezone: string; dataAsOf: string | null } | null;
      limits: Record<string, number>;
      budgets: { evidenceDaily: Budget; requestsDaily: Budget };
    };
    type Topic = { topicId: string; name: string; promptCount: number };
    type Prompt = {
      promptId: string; text: string; topicId: string | null;
      platforms: string[]; regions: string[]; status: 'active' | 'paused';
      collectionStatus: string; createdAt: string;
    };
    type MetricRow<T> = { dimensions: Record<string, unknown>; metrics: T };
    type TrackingMetrics = {
      visibility: number | null; aiMention: number | null; shareOfVoice: number | null;
      avgPosition: number | null; ownDomainCitationRate: number | null;
      responseCount: number; mentionResponseCount: number; visibleResponseCount: number;
      citedResponseCount: number; ownDomainCitedResponseCount: number;
      mentionCount: number; comparisonMentionCount: number; validDays: number;
    };
    type MarketMetrics = {
      visibility: number | null; mentionResponseCount: number; responseCount: number;
      avgPosition: number | null; rankedResponseCount: number; validDays: number;
    };
    type Citation = {
      domain: string; url: string | null; title: string | null; domainType: string;
      citedResponseCount: number; citationCount: number; citationRate: number | null;
      denominator: { kind: string; count: number };
    };
    type TrackingResponse = {
      responseId: string; promptId: string; promptText: string; topicId: string | null;
      platform: string; region: string; date: string; respondedAt: string; collectedAt: string;
      ownBrand: { mentioned: boolean; visible: boolean; position: number | null };
      answerMarkdown: string; citations: { url: string; domain: string }[];
    };
    type MarketResponse = {
      responseId: string; question: string | null; platform: string; region: string; date: string;
      excerpt: string; citationUrls: string[];
      mentionedBrands: { brand: MarketBrand; position: number | null }[];
    };
    type MarketScope = {
      authorized: Market[];
      ownBrandSegments: (Market & { authorized: boolean; visibility: number | null;
        mentionResponseCount: number; responseCount: number; rank: number | null })[];
    };
    type EntityRef = { entityId: string; name: string; type: string; detailAccessible: boolean };
    type EntityDetail = {
      entity: EntityRef; displayAlias: string | null; domain: string | null;
      parent: EntityRef | null; childCount: number;
      metrics: { directResponseCount: number; rollupResponseCount: number; totalResponseCount: number;
        visibility: number | null; top1Rate: number | null; avgPosition: number | null;
        rankedResponseCount: number };
    };
    type Relation = { entity: EntityRef; relationType: 'child'; responseCount: number;
      shareOfParent: number | null; avgPosition: number | null };
    type CoMention = { entity: EntityRef; coMentionResponseCount: number; coMentionIndex: null };
    type EntitySource = { domain: string; url: string | null; citedResponseCount: number;
      citationRate: number | null; denominator: { kind: string; count: number } };
    The dimensions object contains only requested groupings: Tracking brand is TrackingBrand; Market brand is MarketBrand plus rank/inTopN; date is a date string; prompt is {promptId,text}; topic is {topicId,name}; platform, region and intent are {code,name}.
    Tracking answerMarkdown and Market excerpt contain full Markdown. The existing excerpt field name is retained; it is not limited to 300 characters. Market citationUrls contains at most five URLs; links within the full response are preserved. Unmatched source types return Other.
    MCP returns the same API data/meta in result.structuredContent, with the same JSON in result.content[].text. Backend failures have isError=true and preserve the API error fields, adding HTTP status and, when available, retryAfter. MCP does not recalculate statistics, automatically paginate or retry.

    Query rules#

    RuleBehavior
    DatesMaximum inclusive span: 90 days. Tracking supports retained history. Market/graph start dates must be within the latest 40 UTC dates, including today; end dates allow two days of timezone grace
    Business dayTracking uses fixed UTC-4; Market and graph statistics use UTC
    PaginationFollow nextCursor with unchanged filters and pageSize; stop when null. Default cursor lifetime: 24 hours. Do not reuse across keys, projects or operations
    Market responsesAt most the first 500 responses per cursor chain, at most 20 per page. This is 25 pages at size 20 or 500 at size 1. The final page returns only the remaining records; truncated=true means more matching data exists beyond the cap
    ListsDefault pageSize: 20. Maximum: 100 for projects/topics/prompts, 50 for Tracking responses, 20 for market responses
    Aggregateslimit is not a page size. Citation limit: 100; child/source limit: 50; co-mention limit: 20. Date groupings return the complete series; results above 10000 rows require a smaller query
    Market scopeUse only configured, authorized L3 markets. ownBrandSegments summarizes the own brand within configured markets; it does not query unconfigured markets. No additional monthly market-access budget applies
    Entity scopeLimited to the own brand plus two descendant levels and configured competitors plus one level, with at most 50 entities per root/level. A listed UUID does not grant detail access: check detailAccessible. Unauthorized details return 404
    RelationshipsDirect children only; no recursive pagination. Co-mention does not imply competition
    RatiosValues are 0-1; multiply by 100 for percentages. null is unavailable, not zero. Do not sum or re-average row ratios
    AggregationTracking visibility and related metrics use valid-day means; share of voice is a period ratio. Market visibility deduplicates responses over the period. Follow meta.aggregation/aggregations and denominator
    CitationscitedResponseCount counts distinct citing responses; citationCount counts occurrences. Tracking domain rates use cited responses as denominator, while URL rates use all responses. Market citation rates use cited responses in the selected population. Graph sources may be sampled; inspect meta.sample
    Empty dataLists can be empty and effectiveRange can be null. Check validDays. A null dataAsOf does not imply freshness through today

    Limits and allowances#

    API and MCP share backend counters. Team allowances are shared by all team keys and projects. Read effective values and remaining evidence/request allowances from GET /projects/{projectId}.
    LimitDefault / scope
    Backend frequency60 requests/minute per key; 120/minute per team
    Backend concurrency2 requests per key; 4 per team
    Daily requests5000 per team
    Daily market evidence500 returned responses per team; repeated reads also count
    Entity detail accessEffective per-project daily distinct-entity allowance in limits.entityAccessDailyLimit; shared with console and Preview access. The own brand also counts; revisiting an entity on the same day does not consume another slot
    MCP entry frequency60 HTTP requests/minute per key per instance; 600 total per instance, including protocol requests and invalid-key attempts
    MCP entry concurrency2 per key per instance; 8 total per instance, held until the response stream ends or is canceled
    Authenticated backend attempts can consume request quota even when processing later fails. MCP initialization and tool discovery do not consume backend data-query requests, but they do count against MCP entry limits. Entry counters are local to each process and reset on restart; backend team counters remain shared across instances.
    Request and evidence daily allowances reset at UTC 00:00. Entity-access allowances reset at fixed UTC-4 midnight and are shared for the project across console, Preview, API and MCP. Replacing a key does not reset these allowances. The 500-record cursor cap and the team's 500-response daily evidence allowance are separate limits.

    Errors#

    {
      "error": {
        "code": "INVALID_PARAMETER",
        "message": "Invalid endDate",
        "requestId": "44444444-4444-4444-8444-444444444444",
        "details": [{ "field": "endDate", "reason": "out_of_range" }]
      }
    }
    HTTP / codeAction
    400 INVALID_PARAMETERCheck parameters, dates, groupings or cursor
    401 INVALID_API_KEYCheck the key's environment, validity, expiry and revocation status
    403 MODULE_NOT_ENABLED / CAPABILITY_REQUIREDCheck subscription entitlement, subscription validity, module availability and key authorization
    404 NOT_FOUNDResource is missing or outside the authorized scope
    409 PROJECT_NOT_READYThe project's data context is not ready
    429 RATE_LIMITEDRespect Retry-After; reduce frequency/concurrency
    429 QUOTA_EXCEEDEDDaily request or evidence allowance exhausted; follow resetAt
    429 ENTITY_ACCESS_DAILY_LIMIT_EXCEEDEDShared project daily entity-access allowance exhausted; follow resetAt
    503 DEPENDENCY_UNAVAILABLE / 504 QUERY_TIMEOUTRetry later or narrow the query
    500 INTERNAL_ERRORRetain requestId for support
    Error details and resetAt are optional. Rate-limit responses include Retry-After. MCP rejects JSON-RPC batch arrays with HTTP 400 / -32600 before calling the backend. MCP entry limits return HTTP 429 / RATE_LIMITED directly, before a tool result exists.
    Modified at 2026-11-04 10:58:07
    Next
    Overview
    Built with