> ## Documentation Index
> Fetch the complete documentation index at: https://docs.echozero.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Signal ingest audit log (Telegram, Discord, or inbound webhook)

> Paginated rows from `signal-ingest-logs` for this agent: platform-neutral `externalChannelId` / `externalMessageId` (`webhook` for inbound HTTP POSTs), legacy Telegram fields when present, parse outcome, and optional linked trade summary.



## OpenAPI

````yaml https://mcp.echozero.app/api/docs-json get /api/v1/developers/agents/{id}/signals/ingest-log
openapi: 3.0.0
info:
  title: EchoZero MCP API
  description: >-
    EchoZero MCP Server - Developer API for agent management, trading,
    marketplace, and AI chat.


    **Rate Limiting:** All endpoints enforce per-API-key rate limits. Tiers:
    free (60 req/min), standard (300 req/min), premium (1000 req/min). Every
    response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`,
    `X-RateLimit-Reset` headers. Exceeding the limit returns `429 Too Many
    Requests` with a `Retry-After` header.
  version: '1.0'
  contact: {}
servers:
  - url: https://mcp.echozero.app
    description: Production
security: []
tags:
  - name: MCP Protocol
    description: >-
      Model Context Protocol (Streamable HTTP): `/mcp`, `/mcp/sse` — not under
      `/api`; same API key as REST
  - name: Health
    description: Server health check
  - name: API Keys
    description: API key generation, listing, and revocation
  - name: User
    description: >-
      User profile, sessions, social, onboarding, internal agent subscriptions,
      and bot activations (v1: /v1/users/me)
  - name: Token
    description: Token data and trending
  - name: Trade
    description: Trade execution and history
  - name: Strategy
    description: Strategy (trading bot) configuration and control
  - name: Agent
    description: Agent registration and management
  - name: AI
    description: AI chat, intent, and insights
  - name: Wallet
    description: Wallet operations, deposits, and withdrawals
  - name: Notification
    description: Notification management and settings
  - name: Auth
    description: >-
      Public authentication: signup / login lookup, code verification, Google
      OAuth, refresh, and sign-out. Returns `accessToken` / `refreshToken` in
      the JSON body.
  - name: OAuth
    description: >-
      OAuth 2.1 authorization-code + PKCE for AI assistant clients:
      `/oauth/authorize`, `/oauth/token`, `/oauth/introspect`, `/status`.
  - name: Activity
    description: User trade activity list and search
  - name: Feed
    description: Social activity feed timeline
  - name: Earn
    description: Leaderboard, rewards, and referrals
  - name: Statics
    description: Countries, languages, and static data
  - name: Misc
    description: File uploads and utility endpoints
  - name: Developer
    description: Developer registration and profile
  - name: Developer dashboard
    description: >-
      Per-agent dashboard: subscribers (anonymized), performance detail, signal
      history (v1)
  - name: Developer Agent
    description: Developer agent listings and management
  - name: Developer Agents (Marketplace)
    description: Public browse, search, and subscribe to external developer-listed agents
paths:
  /api/v1/developers/agents/{id}/signals/ingest-log:
    get:
      tags:
        - Developer dashboard
      summary: Signal ingest audit log (Telegram, Discord, or inbound webhook)
      description: >-
        Paginated rows from `signal-ingest-logs` for this agent:
        platform-neutral `externalChannelId` / `externalMessageId` (`webhook`
        for inbound HTTP POSTs), legacy Telegram fields when present, parse
        outcome, and optional linked trade summary.
      operationId: DeveloperDashboardController_signalsIngestLog
      parameters:
        - name: id
          required: true
          in: path
          schema:
            type: string
        - name: outcome
          required: false
          in: query
          description: >-
            When set, only ingest rows with this outcome are returned (e.g.
            `matched`, `unmatched`).
          schema:
            type: string
            enum:
              - matched
              - unmatched
              - skipped
              - rate_limited
              - deduped
              - no_rule
              - prefix_skip
              - error
        - name: x-signature
          in: header
          required: true
          description: >-
            Required for API-key authenticated requests. HMAC-SHA256(secretKey,
            timestamp + METHOD + path + body) as lowercase hex. Omit only for
            JWT/OAuth session tokens or public routes.
          schema:
            type: string
        - name: x-timestamp
          in: header
          required: true
          description: >-
            Required with x-signature. Epoch milliseconds; rejected if drift
            exceeds 5 minutes. Omit only for JWT/OAuth session tokens or public
            routes.
          schema:
            type: string
      responses:
        '200':
          description: Ingest audit rows.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/McpSuccessResponseDto'
                  - properties:
                      data:
                        type: object
                        properties:
                          items:
                            type: array
                            items:
                              $ref: >-
                                #/components/schemas/DashboardSignalIngestLogItemDto
                          pagination:
                            $ref: '#/components/schemas/PaginationMetaDto'
        '401':
          description: Missing or invalid API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpErrorResponseDto'
        '403':
          description: Not a registered developer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpErrorResponseDto'
        '404':
          description: Agent not found or not owned.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpErrorResponseDto'
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/McpErrorResponseDto'
      security:
        - bearer-jwt: []
        - api-key: []
components:
  schemas:
    McpSuccessResponseDto:
      type: object
      properties:
        success:
          type: boolean
          example: true
        data:
          type: object
          description: Endpoint-specific payload
          additionalProperties: true
      required:
        - success
        - data
    DashboardSignalIngestLogItemDto:
      type: object
      properties:
        id:
          type: string
        developerAgentId:
          type: string
        platform:
          type: string
          enum:
            - telegram
            - discord
            - webhook
        externalChannelId:
          type: string
          description: >-
            Channel id (Telegram chat id, Discord channel snowflake, or webhook
            sentinel `__agent_inbound_webhook__`). Legacy rows fall back from
            `telegramChatId`.
        externalMessageId:
          type: string
          description: >-
            Message id as string (Discord snowflake or Telegram message id
            stringified).
        telegramChatId:
          type: string
          description: Legacy Telegram chat id; omitted for Discord-only rows.
        telegramMessageId:
          type: number
        rawText:
          type: string
          description: Raw channel text (truncated at persistence cap).
        outcome:
          type: string
          enum:
            - matched
            - unmatched
            - skipped
            - rate_limited
            - deduped
            - no_rule
            - prefix_skip
            - error
        parsedAction:
          type: string
        parsedIntent:
          type: string
        parsedToken:
          type: string
        entryPrice:
          type: string
        takeProfit:
          type: string
        stopLoss:
          type: string
        parseConfidence:
          type: number
          description: Parser confidence in [0, 1] when present.
        parseSource:
          type: string
          description: Parser pipeline source (e.g. rules, llm_fallback, llm_shadow).
        parseModel:
          type: string
          description: Model id when LLM path participated.
        parseNote:
          type: string
          description: Short parser pipeline diagnostic note.
        parsedSummary:
          type: string
        skipReason:
          type: string
          description: >-
            Stable skip code when trade creation did not proceed (e.g.
            token_not_supported).
        skipReasons:
          description: >-
            Human-readable skip reasons resolved from `skipReason` for
            dashboards.
          type: array
          items:
            $ref: '#/components/schemas/TradeReasonDto'
        tradeSignalId:
          type: string
          description: >-
            Public `TradeSignal.signalId` when a trade row was created for this
            ingest.
        linkedTradeSignalId:
          type: string
          description: >-
            When the ingest row was a lifecycle follow-up, this points to the
            canonical trade that was updated/closed.
        linkedTrade:
          description: Joined trade metadata when `tradeSignalId` resolves.
          allOf:
            - $ref: '#/components/schemas/LinkedTradeFromIngestDto'
        createdAt:
          type: string
          format: date-time
      required:
        - id
        - developerAgentId
        - platform
        - externalChannelId
        - rawText
        - outcome
        - createdAt
    PaginationMetaDto:
      type: object
      properties:
        total:
          type: number
        limit:
          type: number
        page:
          type: number
        totalPages:
          type: number
        hasNextPage:
          type: boolean
        hasPreviousPage:
          type: boolean
      required:
        - total
        - limit
        - page
        - totalPages
        - hasNextPage
        - hasPreviousPage
    McpErrorResponseDto:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          $ref: '#/components/schemas/McpErrorBodyDto'
      required:
        - success
        - error
    TradeReasonDto:
      type: object
      properties:
        code:
          type: string
        raw:
          type: string
        category:
          type: string
        severity:
          type: string
          enum:
            - failure
            - warning
            - info
        title:
          type: string
        message:
          type: string
        remediation:
          type: string
      required:
        - code
        - raw
        - category
        - severity
        - title
        - message
    LinkedTradeFromIngestDto:
      type: object
      properties:
        signalId:
          type: string
        status:
          type: string
        txHash:
          type: string
          description: On-chain or simulated tx id when executed.
        failureReasons:
          description: >-
            Human-readable failure reasons when the linked trade was rejected or
            failed.
          type: array
          items:
            $ref: '#/components/schemas/TradeReasonDto'
        diagnosticReasons:
          description: Non-fatal diagnostic reasons attached to the linked trade.
          type: array
          items:
            $ref: '#/components/schemas/TradeReasonDto'
        failureReason:
          type: string
          description: >-
            Joined failure/diagnostic copy for compact ingest rows
            (newline-separated).
      required:
        - signalId
        - status
    McpErrorBodyDto:
      type: object
      properties:
        code:
          type: string
          example: NOT_FOUND
        message:
          type: string
          example: Resource not found
      required:
        - code
        - message
  securitySchemes:
    bearer-jwt:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: >-
        User JWT access token issued by `POST /api/auth/verify` or `POST
        /api/auth/social/verify`. Routes that accept both auth modes declare
        `api-key` *and* `bearer-jwt` security schemes.
    api-key:
      type: apiKey
      in: header
      name: x-api-key

````