# Get customer feedback keywords

Retrieves keyword analysis from customer feedback reviews. Keywords are extracted and aggregated from review text with current vs previous period comparison for both frequency percentage and average rating. Supports pagination (pageSize defaults to 50 when page is set) and sorting. Defaults to the last 30 days if startDate is not provided.

Endpoint: GET /dashboard/customer-feedback-keywords
Version: 20260701

## Query parameters:

  - `startDate` (any)
    Start date (inclusive) as an ISO-8601 date or date-time, with or without zone/offset (e.g. 2025-01-01, 2025-01-01T14:30:00, 2025-01-01T14:30:00Z, 2025-01-01T14:30:00%2B02:00). Zone-aware values are normalised to UTC. The formats yyyy.MM.dd, dd.MM.yyyy, dd-MM-yyyy HH:mm:ss and dd.MM.yyyy HH:mm:ss are also accepted. Optional for most endpoints — defaults to a period before end date if omitted.

  - `endDate` (any)
    End date (inclusive) as an ISO-8601 date or date-time, with or without zone/offset. Zone-aware values are normalised to UTC. The formats yyyy.MM.dd, dd.MM.yyyy, dd-MM-yyyy HH:mm:ss and dd.MM.yyyy HH:mm:ss are also accepted. Defaults to today.

  - `group` (string)
    Overrides the automatic granularity of the date range. Case-insensitive. When omitted, granularity is derived from the range length. Legacy values DAY, WEEK, MONTH and YEAR are also accepted. HOUR returns the whole range as a single bucket holding the ACTIONS_PHONE hour-of-day profile (phone0..phone23) and is only valid for the ACTIONS_PHONE metric; other endpoints treat it as DAILY.

  - `filterCategory` (string)
    Filter strategy to use for scoping locations

  - `textFilter` (any)
    Deprecated: use the newer `query` parameter instead. Free-text location search that narrows results to matching locations (matches name, address, identifier and label fields). Supports #label and @group tokens (e.g. "main st #premium @north"), combined with AND semantics. Applied only when no filterCategory is set.

  - `locationIds` (any)
    Comma-separated location IDs (used when filterCategory=location)

  - `businessIds` (any)
    Comma-separated business IDs (used when filterCategory=business)

  - `labels` (any)
    Label names (used when filterCategory=labels)

  - `locationGroupIds` (any)
    Location group IDs (used when filterCategory=location-groups)

  - `excludedLocationIds` (any)
    Comma-separated location IDs to exclude from results

  - `excludedBusinessIds` (any)
    Comma-separated business IDs to exclude from results

  - `excludedLabels` (any)
    Label names to exclude from results

  - `excludedLocationGroupIds` (any)
    Location group IDs to exclude from results

## Response 200 fields (*/*):

  - `status` (any, required)
    Response status
    Example: SUCCESS

  - `response` (object, required)
    Response payload

  - `response.keywords` (array, required)
    List of extracted keywords with metrics

  - `response.keywords.keyword` (any, required)
    The keyword text
    Example: service

  - `response.keywords.percentage` (object, required)
    Keyword frequency as percentage of total reviews, current vs previous period

  - `response.keywords.percentage.current` (any, required)
    Value in the current period
    Example: 25.5

  - `response.keywords.percentage.previous` (any, required)
    Value in the equivalent previous period
    Example: 20

  - `response.keywords.rating` (object, required)
    Average rating of reviews containing this keyword, current vs previous period

  - `response.keywords.rating.current` (any, required)
    Value in the current period
    Example: 25.5

  - `response.keywords.rating.previous` (any, required)
    Value in the equivalent previous period
    Example: 20

  - `response.keywords.aggregatedWords` (array)
    Word variants grouped under this keyword
    Example: ["service","services"]

  - `response.keywords.ratingSum` (object, required)
    Backwards-compatibility field kept for legacy clients; not computed by this service and always {current: 0, previous: 0}.

  - `response.keywords.ratingSum.current` (any, required)
    Value in the current period
    Example: 25.5

  - `response.keywords.ratingSum.previous` (any, required)
    Value in the equivalent previous period
    Example: 20

  - `response.keywords.count` (object, required)
    Backwards-compatibility field kept for legacy clients; not computed by this service and always {current: 0, previous: 0}.

  - `response.keywords.count.current` (any, required)
    Value in the current period
    Example: 25.5

  - `response.keywords.count.previous` (any, required)
    Value in the equivalent previous period
    Example: 20

  - `response.keywords.directoryDetails` (any)
    Backwards-compatibility field kept for legacy clients; not computed by this service and always null.

  - `response.keywords.allKeywords` (array)
    Backwards-compatibility field kept for legacy clients; not computed by this service and always null.

  - `response.totalFeedbacksAnalyzed` (any, required)
    Total number of feedbacks analyzed for keyword extraction

  - `response.page` (any)
    Current page number (present when pagination is used)

  - `response.pageSize` (any)
    Page size (defaults to 50 when page is set)

  - `response.total` (any)
    Total number of keywords available

