rumoro-dev Attention API

The Attention API from rumoro-dev — 2 operation(s) for attention.

Operations 2

GET /v1/attention List attention items #
POST /v1/attention/{id}/dismiss Dismiss an attention item #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/rumoro-dev:rumoro-dev-attention-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

rumoro-dev-attention-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Rumoro Attention API
  version: 0.0.1
  description: Social listening for developers and AI agents.
servers:
- url: https://api.rumoro.dev
tags:
- name: Attention
paths:
  /v1/attention:
    get:
      operationId: listAttention
      summary: List attention items
      description: Lists items that need a person, latest first. Kinds are mention.spike (a keyword's mentions jumped in the last hour), sentiment.negative_spike (its 24-hour negative share jumped), keyword.noisy (it turned noisy) and channel.failing (a channel's recent sends all failed). Checks run hourly. Items open when the condition starts and resolve when it ends. Open items are the default, and `status=all` adds the history. Opening an item also sends an account event of the same name to subscribed webhook, Slack, email and Telegram channels.
      tags:
      - Attention
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          enum:
          - open
          - resolved
          - dismissed
          - all
          default: open
          description: Which items to list. Defaults to open.
        required: false
        description: Which items to list. Defaults to open.
        name: status
        in: query
      - schema:
          type: string
          description: Filters by kind. Send a comma-separated list such as mention.spike,keyword.noisy.
        required: false
        description: Filters by kind. Send a comma-separated list such as mention.spike,keyword.noisy.
        name: kind
        in: query
      - schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 50
          description: How many items to return, latest first. 50 by default and 100 at most.
        required: false
        description: How many items to return, latest first. 50 by default and 100 at most.
        name: limit
        in: query
      - schema:
          type: string
          description: Pass the previous page's nextCursor.
        required: false
        description: Pass the previous page's nextCursor.
        name: cursor
        in: query
      responses:
        '200':
          description: The attention items
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/AttentionItem'
                  nextCursor:
                    type:
                    - string
                    - 'null'
                    description: Cursor for the next page, or null when there are no more pages.
                required:
                - data
                - nextCursor
        '400':
          description: The kind is unknown, or the cursor did not come from this list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: The API key is missing or not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
  /v1/attention/{id}/dismiss:
    post:
      operationId: dismissAttention
      summary: Dismiss an attention item
      description: Dismisses an item. It leaves the open list and stays away while its condition lasts. After the condition ends, a new episode can open a new item. Calling it twice has the same effect as once.
      tags:
      - Attention
      security:
      - bearerAuth: []
      parameters:
      - schema:
          type: string
          minLength: 1
          description: The attention item's id (att_...).
          example: att_abc123
        required: true
        description: The attention item's id (att_...).
        name: id
        in: path
      responses:
        '200':
          description: The item, now dismissed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttentionItem'
        '401':
          description: The API key is missing or not valid
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: This workspace has no attention item with this id
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    ChannelFailingEventData:
      type: object
      properties:
        attentionId:
          type: string
          description: Related attention item (att_...). See GET /v1/attention, dismiss with POST /v1/attention/{id}/dismiss.
        url:
          type: string
          description: The dashboard page to open.
        channel:
          type: object
          properties:
            id:
              type: string
              description: The channel's id (dest_...).
            kind:
              type: string
              enum:
              - slack
              - email
              - webhook
              - telegram
              description: Type of channel.
            label:
              type: string
              description: The name you gave the channel.
          required:
          - id
          - kind
          - label
          description: The channel that keeps failing.
        failures:
          type: integer
          minimum: 0
          description: Consecutive failed sends in the past 24 hours.
        lastError:
          type:
          - string
          - 'null'
          description: The latest error, as Slack, email, the webhook or Telegram returned it.
        since:
          type: string
          description: Time of the first of those failures.
      required:
      - attentionId
      - url
      - channel
      - failures
      - lastError
      - since
    MentionSpikeEventData:
      type: object
      properties:
        attentionId:
          type: string
          description: Related attention item (att_...). See GET /v1/attention, dismiss with POST /v1/attention/{id}/dismiss.
        url:
          type: string
          description: The dashboard page to open.
        keyword:
          type: object
          properties:
            id:
              type: string
              description: The keyword's id (kw_...).
            term:
              type: string
              description: The term being tracked.
            kind:
              type: string
              enum:
              - brand
              - competitor
              - topic
              description: The keyword's kind, brand, competitor or topic.
            name:
              type: string
              description: The keyword's display name. It is the term, or "term (Group)" when the keyword is not in the default group.
            groupId:
              type: string
              description: The keyword's group id (grp_...).
          required:
          - id
          - term
          - kind
          - name
          - groupId
          description: The keyword this item concerns.
        window:
          type: object
          properties:
            from:
              type: string
              description: Start time, included.
            to:
              type: string
              description: End time, not included.
          required:
          - from
          - to
          description: Match-time range of the counts.
        matches:
          type: integer
          minimum: 0
          description: New matches during the hour, meaning posts that matched within 6 hours of being published. Look-backs and free reviews are not counted.
        relevant:
          type: integer
          minimum: 0
          description: How many of them have been scored relevant so far.
        baseline:
          type: object
          properties:
            meanPerHour:
              type: number
              minimum: 0
              description: Average new matches per hour during the baseline.
            stddevPerHour:
              type: number
              minimum: 0
              description: The standard deviation of that average.
            hours:
              type: integer
              minimum: 0
              description: How many hours the baseline covers. It is the week before the window, or the time since the keyword was created if that is shorter.
          required:
          - meanPerHour
          - stddevPerHour
          - hours
          description: The keyword's normal volume.
      required:
      - attentionId
      - url
      - keyword
      - window
      - matches
      - relevant
      - baseline
    AttentionItem:
      type: object
      properties:
        id:
          type: string
          description: The attention item's id (att_...).
        kind:
          type: string
          enum:
          - mention.spike
          - sentiment.negative_spike
          - keyword.noisy
          - channel.failing
          description: mention.spike flags an hour with far more mentions than usual, and sentiment.negative_spike a jump in the negative share over 24 hours. keyword.noisy flags a keyword whose scored matches are mostly noise, and channel.failing a channel whose recent sends all failed.
        status:
          type: string
          enum:
          - open
          - resolved
          - dismissed
          description: open means the condition is still true. resolved means it is not anymore. dismissed means someone dismissed it, and it will not reopen for the same episode.
        subject:
          type: object
          properties:
            type:
              type: string
              enum:
              - keyword
              - channel
              description: Either keyword or channel.
            id:
              type: string
              description: The keyword's id (kw_...) or the channel's id (dest_...).
          required:
          - type
          - id
          description: The keyword or channel the item concerns.
        title:
          type: string
          description: A one-line summary of what happened.
        openedAt:
          type: string
          description: First time the condition was seen.
        resolvedAt:
          type:
          - string
          - 'null'
          description: When the condition ended. Null while it lasts.
        dismissedAt:
          type:
          - string
          - 'null'
          description: When someone dismissed it. Null if no one did.
        data:
          anyOf:
          - $ref: '#/components/schemas/MentionSpikeEventData'
          - $ref: '#/components/schemas/NegativeSpikeEventData'
          - $ref: '#/components/schemas/KeywordNoisyEventData'
          - $ref: '#/components/schemas/ChannelFailingEventData'
          description: The numbers at the time it opened. This is the same object the account event with the same name sends as `data`.
      required:
      - id
      - kind
      - status
      - subject
      - title
      - openedAt
      - resolvedAt
      - dismissedAt
      - data
    KeywordNoisyEventData:
      type: object
      properties:
        attentionId:
          type: string
          description: Related attention item (att_...). See GET /v1/attention, dismiss with POST /v1/attention/{id}/dismiss.
        url:
          type: string
          description: The dashboard page to open.
        keyword:
          type: object
          properties:
            id:
              type: string
              description: The keyword's id (kw_...).
            term:
              type: string
              description: The term being tracked.
            kind:
              type: string
              enum:
              - brand
              - competitor
              - topic
              description: The keyword's kind, brand, competitor or topic.
            name:
              type: string
              description: The keyword's display name. It is the term, or "term (Group)" when the keyword is not in the default group.
            groupId:
              type: string
              description: The keyword's group id (grp_...).
          required:
          - id
          - term
          - kind
          - name
          - groupId
          description: The keyword this item concerns.
        windowDays:
          type: integer
          minimum: 0
          description: How many days the noise is measured over. If the keyword changed within that time, it starts at the change.
        scored:
          type: integer
          minimum: 0
          description: Matches scored by the classifier during that time.
        relevant:
          type: integer
          minimum: 0
          description: How many of them were relevant.
        noiseShare:
          type: number
          minimum: 0
          maximum: 1
          description: The part that scored below 40. Every match is billed, relevant or not.
      required:
      - attentionId
      - url
      - keyword
      - windowDays
      - scored
      - relevant
      - noiseShare
    NegativeSpikeEventData:
      type: object
      properties:
        attentionId:
          type: string
          description: Related attention item (att_...). See GET /v1/attention, dismiss with POST /v1/attention/{id}/dismiss.
        url:
          type: string
          description: The dashboard page to open.
        keyword:
          type: object
          properties:
            id:
              type: string
              description: The keyword's id (kw_...).
            term:
              type: string
              description: The term being tracked.
            kind:
              type: string
              enum:
              - brand
              - competitor
              - topic
              description: The keyword's kind, brand, competitor or topic.
            name:
              type: string
              description: The keyword's display name. It is the term, or "term (Group)" when the keyword is not in the default group.
            groupId:
              type: string
              description: The keyword's group id (grp_...).
          required:
          - id
          - term
          - kind
          - name
          - groupId
          description: The keyword this item concerns.
        window:
          type: object
          properties:
            from:
              type: string
              description: Start time, included.
            to:
              type: string
              description: End time, not included.
          required:
          - from
          - to
          description: Match-time range of the counts.
        negative:
          type: integer
          minimum: 0
          description: Relevant matches in the window with negative sentiment.
        relevant:
          type: integer
          minimum: 0
          description: Relevant match count for the window.
        share:
          type: number
          minimum: 0
          maximum: 1
          description: negative divided by relevant.
        baseline:
          type: object
          properties:
            negative:
              type: integer
              minimum: 0
              description: How many relevant matches were negative in the prior week.
            relevant:
              type: integer
              minimum: 0
              description: Relevant match count for those 7 days.
            share:
              type: number
              minimum: 0
              maximum: 1
              description: The normal share of negative matches, smoothed so that a quiet week still gives a value.
          required:
          - negative
          - relevant
          - share
          description: The keyword's normal sentiment.
      required:
      - attentionId
      - url
      - keyword
      - window
      - negative
      - relevant
      - share
      - baseline
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
              - unauthorized
              - forbidden
              - read_only_key
              - validation_error
              - not_found
              - invalid_cursor
              - payload_too_large
              - rate_limited
              - duplicate_keyword
              - insufficient_balance
              - keyword_limit_reached
              - billing_not_configured
              - unknown_channel
              - not_a_digest
              - hourly_email_unsupported
              - slack_not_connected
              - slack_not_configured
              - telegram_not_configured
              - email_not_configured
              - invalid_assignee
              - classification_pending
              - already_member
              - last_owner
              - duplicate_segment
              - duplicate_view
              - duplicate_group
              - default_group
              - default_group_context
              - invalid_signature
              - invalid_token
              - upstream_unavailable
              - internal_error
              - unsupported_media_type
              - request_timeout
              - key_limit
              - conflict
              - no_billing_owner
              - rule_disabled
              - no_channels
              - channel_disabled
              - no_recipients
              - recipient_suppressed
              - confirmation_rate_limited
              - confirmation_requires_resend
              - email_test_rate_limited
              - email_hourly_limit
              - email_idempotency_expired
              - email_transport_unavailable
              - delivery_not_configured
              - delivery_key_unavailable
              - not_retryable
              - not_replayable
              - digest_has_replay
              - digest_retry_expired
              - delivery_request_incomplete
              - request_conflict
              - stale_version
              - version_conflict
              - already_classified
              - keyword_inactive
              - source_unavailable
              - source_timeout
              - invalid_host
              - invalid_origin
              - database_unavailable
              - database_not_ready
              - not_configured
              description: A stable code for programs. Branch on it, not on the message. New codes may be added, so treat an unknown one as a general failure with the same status.
            message:
              type: string
              description: A description for people. Its wording can change.
            requestId:
              type: string
              description: This request's id, also sent in the X-Request-Id header. Include it when you contact support.
            retryAfterSeconds:
              type: integer
              description: Seconds to wait before retrying, on rate_limited and other errors you can retry. Same value as the Retry-After header.
          required:
          - code
          - message
          description: Details of the error.
      required:
      - error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: An API key from POST /v1/api-keys. Keys start with ref_.
x-rumoro-errors:
- code: unauthorized
  status: 401
  source: user
  retryable: false
  description: The credential is missing or does not belong to a workspace.
  fix: 'Send Authorization: Bearer ref_… with a key from /api-keys.'
- code: forbidden
  status: 403
  source: user
  retryable: false
  description: The credential works but is not allowed to do this.
- code: read_only_key
  status: 403
  source: user
  retryable: false
  description: A read-only key called an endpoint that writes.
  fix: Create a key with write scope.
- code: validation_error
  status: 400
  source: user
  retryable: false
  description: The body or query is not valid. The message says which field.
- code: not_found
  status: 404
  source: user
  retryable: false
  description: Your workspace has nothing with this id. An id from another workspace also returns 404, never 403.
- code: invalid_cursor
  status: 400
  source: user
  retryable: false
  description: The cursor could not be read, or was issued for another sort. Start again from the first page.
- code: payload_too_large
  status: 413
  source: user
  retryable: false
  description: 'The body exceeds the endpoint limit (128 KiB for JSON). A 409 with this code: a delivery whose payload was too large cannot be retried or replayed.'
- code: rate_limited
  status: 429
  source: user
  retryable: true
  description: The workspace sent over 600 requests in a minute across all its keys and tokens, or reached an endpoint's own limit. Retry-After and error.retryAfterSeconds tell you when to try again.
  fix: Wait Retry-After seconds and send the same request again. X-RateLimit-Remaining on every response says how much room is left.
- code: duplicate_keyword
  status: 409
  source: user
  retryable: false
  description: This group already has the term. Each group can hold a term once, and other groups can hold it too.
- code: insufficient_balance
  status: 402
  source: user
  retryable: false
  description: The balance cannot pay for one more keyword-day.
  fix: Top up from Billing; tracking resumes on its own.
- code: keyword_limit_reached
  status: 402
  source: user
  retryable: false
  description: The workspace already runs 500 keywords, or has 500 that are not deleted.
- code: billing_not_configured
  status: 503
  source: system
  retryable: false
  description: No payment provider is set up on this deployment.
- code: unknown_channel
  status: 400
  source: user
  retryable: false
  description: An alert named a channel id that is not in this workspace.
- code: not_a_digest
  status: 400
  source: user
  retryable: false
  description: An action for digests was used on an instant alert.
- code: hourly_email_unsupported
  status: 400
  source: user
  retryable: false
  description: An hourly alert got an email channel, which could mean 24 emails a day. Use Slack, Telegram or a webhook, or send a daily digest by email.
- code: slack_not_connected
  status: 409
  source: user
  retryable: false
  description: Slack must be connected in Settings first. Returned as 404 by the Slack connection endpoints and 409 elsewhere.
- code: slack_not_configured
  status: 503
  source: system
  retryable: false
  description: No Slack app is set up on this deployment.
- code: telegram_not_configured
  status: 503
  source: system
  retryable: false
  description: No Telegram bot is set up on this deployment.
- code: email_not_configured
  status: 503
  source: system
  retryable: false
  description: This deployment has no email sender set up, so email destinations cannot be used.
- code: invalid_assignee
  status: 400
  source: user
  retryable: false
  description: The assignee is not in the workspace.
- code: classification_pending
  status: 409
  source: user
  retryable: true
  description: Relevance or sentiment feedback was sent before the classifier scored the mention.
- code: already_member
  status: 409
  source: user
  retryable: false
  description: The invited address already belongs to a member.
- code: last_owner
  status: 409
  source: user
  retryable: false
  description: The workspace would have no owner left after this removal.
- code: duplicate_segment
  status: 409
  source: user
  retryable: false
  description: Another segment in the workspace has this name.
- code: duplicate_view
  status: 409
  source: user
  retryable: false
  description: Another view in the workspace has this name.
- code: duplicate_group
  status: 409
  source: user
  retryable: false
  description: Another group in the workspace has this name or externalId.
- code: default_group
  status: 409
  source: user
  retryable: false
  description: The default group cannot be deleted. It holds keywords created without a group.
- code: default_group_context
  status: 400
  source: user
  retryable: false
  description: The default group uses the workspace's company profile, which you change with PATCH /v1/company. Only other groups can have their own description.
- code: invalid_signature
  status: 401
  source: user
  retryable: false
  description: An incoming webhook had no valid signature.
- code: invalid_token
  status: 400
  source: user
  retryable: false
  description: A signed link (unsubscribe, confirmation, preferences) was tampered with or is malformed.
- code: upstream_unavailable
  status: 502
  source: platform
  retryable: true
  description: An outside service such as Slack or Polar failed during the request. Retry with increasing waits.
- code: internal_error
  status: 500
  source: system
  retryable: false
  description: Something failed on our side; 502 when Telegram failed a bot lookup. The response carries a requestId; quote it to support.
- code: unsupported_media_type
  status: 415
  source: user
  retryable: false
  description: 'A body was sent without Content-Type: application/json.'
- code: request_timeout
  status: 408
  source: user
  retryable: true
  description: The body did not arrive within 5 seconds.
- code: key_limit
  status: 409
  source: user
  retryable: false
  description: The workspace already has 100 active keys. Revoke one first.
- code: conflict
  status: 409
  source: user
  retryable: false
  description: A resource with these values already exists.
- code: no_billing_owner
  status: 404
  source: user
  retryable: false
  description: There is no owner to bill in this workspace yet.
- code: rule_disabled
  status: 409
  source: user
  retryable: false
  description: The rule is turned off. Enable it before a test or a run.
- code: no_channels
  status: 409
  source: user
  retryable: false
  description: The rule has no destination to test.
- code: channel_disabled
  status: 409
  source: user
  retryable: false
  description: A destination is turned off. Enable it first.
- code: no_recipients
  status: 409
  source: user
  retryable: false
  description: An email destination needs a recipient before it can be turned on.
- code: recipient_suppressed
  status: 409
  source: user
  retryable: false
  description: The address bounced or complained, so no more email goes to it.
- code: confirmation_rate_limited
  status: 429
  source: user
  retryable: true
  description: 'Too many confirmation emails: wait a minute; at most three per address a day and twenty per workspace an hour.'
- code: confirmation_requires_resend
  status: 409
  source: user
  retryable: false
  description: A confirmation email is sent again with a resend, not a delivery retry.
- code: email_test_rate_limited
  status: 429
  source: user
  retryable: true
  description: More than five email tests on this destination this hour.
- code: email_hourly_limit
  status: 409
  source: user
  retryable: false
  description: The destination's hourly email limit is reached; the mention waits for the next daily digest.
- code: email_idempotency_expired
  status: 409
  source: user
  retryable: false
  description: The email's safe retry window passed. Check its receipts before an explicit replay, which may send it twice.
- code: email_transport_unavailable
  status: 503
  source: system
  retryable: false
  description: Email sending is not set up for this delivery on this deployment.
- code: delivery_not_configured
  status: 503
  source: system
  retryable: false
  description: Destinations that need a stored secret are not set up on this deployment.
- code: delivery_key_unavailable
  status: 503
  source: system
  retryable: false
  description: A destination's stored secret cannot be read on this deployment.
- code: not_retryable
  status: 409
  source: user
  retryable: false
  description: Only failed or blocked deliveries can be retried.
- code: not_replayable
  status: 409
  source: user
  retryable: false
  description: A delivery can be replayed once it has finished.
- code: digest_has_replay
  status: 409
  source: user
  retryable: false
  description: This digest delivery has a newer replay. Recover that one.
- code: digest_retry_expired
  status: 409
  source: user
  retryable: false
  description: The digest's six-hour retry window passed. Replay it instead.
- code: delivery_request_incomplete
  status: 500
  source: system
  retryable: true
  description: The saved outcome of a test could not be read. Read it again; don't send a new test.
- code: request_conflict
  status: 409
  source: user
  retryable: false
  description: This requestId was already used for another request. Retry the original, or use a new id.
- code: stale_version
  status: 409
  source: user
  retryable: false
  description: The resource changed since you read it. Read it again before saving.
- code: version_conflict
  status: 409
  source: user
  retryable: true
  description: The webhook's managed rules changed at the same time. Read it again and retry.
- code: already_classified
  status: 409
  source: user
  retryable: false
  description: The mention is already scored; there is nothing to retry.
- code: keyword_inactive
  status: 409
  source: user
  retryable: false
  description: The mention's keyword is paused. Resume it before retrying the score.
- code: source_unavailable
  status: 502
  source: platform
  retryable: true
  description: 'Live search: the platform didn''t answer (503 when it is rate limiting us).'
- code: source_timeout
  status: 504
  source: platform
  retryable: true
  description: 'Live search: the platform didn''t answer in time.'
- code: invalid_host
  status: 403
  source: user
  retryable: false
  description: 'MCP: the request''s Host is not this server''s.'
- code: invalid_origin
  status: 403
  source: user
  retryable: false
  description: 'MCP: the request''s Origin is not allowed.'
- code: database_unavailable
  status: 503
  source: system
  retryable: true
  description: A temporary database problem. Retry with backoff.
- code: database_not_ready
  status: 503
  source: system
  retryable: false
  description: The deployment's database needs maintenance; retrying won't help until it is done.
- code: not_configured
  status: 503
  source: system
  retryable: false
  description: This deployment has no database configured.