Skip to main content
POST
/
v2
/
trends
/
match
Semantic Trend Match
curl --request POST \
  --url https://api.upriver.ai/v2/trends/match \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <api-key>' \
  --data '
{
  "query": "<string>",
  "match_mode": "auto",
  "limit": 10,
  "min_score": 0.4,
  "brand_safety": "<string>",
  "trend_type": "<string>",
  "genre": "<string>",
  "energy": "<string>",
  "tags": [
    "<string>"
  ],
  "exclude_tags": [
    "<string>"
  ]
}
'
{
  "results": [
    {
      "trend": {
        "title": "<string>",
        "summary": "<string>",
        "origin": "<string>",
        "virality_reason": "<string>",
        "notability_for_ads": "<string>",
        "trend_type": "theme",
        "has_signature_sound": true,
        "has_visual_template": true,
        "has_choreography": true,
        "id": "<string>",
        "instructions": "<string>",
        "trend_id": "<string>",
        "discovered_at": "<string>",
        "fingerprint": "<string>",
        "canonical_id": "<string>",
        "status": "<string>",
        "metadata": {},
        "variants": [
          "<string>"
        ],
        "all_records": [
          {}
        ],
        "relations_out": [
          {}
        ],
        "relations_in": [
          {}
        ],
        "source_count": 123,
        "video_count": 123,
        "audio_count": 123,
        "variants_count": 123,
        "source_sample": [
          "<unknown>"
        ],
        "video_samples": [
          "<unknown>"
        ],
        "audio_samples": [
          "<unknown>"
        ],
        "playback": "<string>",
        "source_first_published_at": "<string>",
        "source_last_published_at": "<string>",
        "media_last_published_at": "<string>",
        "earliest_video_at": "<string>",
        "median_video_at": "<string>",
        "video_date_span_days": 123,
        "video_date_count": 123,
        "freshness_date": "<string>",
        "freshness_score": 123,
        "timeliness_status": "<string>",
        "typical_duration_seconds": 123,
        "editorial_date": "<string>",
        "editorial_date_precision": "<string>",
        "activated_at": "<string>",
        "updated_at": "<string>",
        "tags": [
          {
            "tag_name": "<string>",
            "strength": 123,
            "purpose": "<string>",
            "rationale": "<string>"
          }
        ],
        "sound_category": "<string>",
        "sound_genre": "<string>",
        "sound_subgenre": "<string>",
        "sound_mood": "<string>",
        "sound_energy": "<string>",
        "sound_tempo_bpm": 123,
        "sound_tempo_feel": "<string>",
        "brand_safety": "<string>",
        "brand_safety_reason": "<string>",
        "is_song": true,
        "is_catchphrase": true,
        "catchphrase_text": "<string>",
        "has_vocals": true,
        "has_lyrics": true,
        "detected_language": "<string>",
        "sound_usage_type": "<string>",
        "sound_id": "<string>",
        "sound_title": "<string>",
        "sound_artist": "<string>",
        "brand_categories": [
          "<string>"
        ],
        "content_scenarios": [
          "<string>"
        ],
        "audience_vibes": [
          "<string>"
        ],
        "emotional_tone": "<string>",
        "audio_summary": "<string>",
        "lyric_snippet": "<string>",
        "lyric_theme": "<string>",
        "key_instruments": [
          "<string>"
        ]
      },
      "match_score": 123,
      "match_mode": "<string>"
    }
  ],
  "query": "<string>",
  "match_mode": "<string>"
}

Authorizations

X-API-Key
string
header
required

Body

application/json

Payload for POST /v2/trends/match — semantic trend matching.

query
string
required

Natural language query describing the sound or brand fit. e.g. "upbeat pop sound for a beauty brand doing product unboxing"

match_mode
string
default:auto

Embedding space to search: "sonic" (audio characteristics), "brand" (brand/audience fit), "both" (RRF blend), or "auto" (keyword heuristic).

limit
integer
default:10

Maximum results to return

Required range: 1 <= x <= 50
min_score
number
default:0.4

Minimum cosine similarity threshold

Required range: 0 <= x <= 1
brand_safety
string | null

Filter by brand safety: "safe", "caution", "unsafe"

trend_type
string | null

Filter by trend type: "sound", "challenge", "template", "theme"

genre
string | null

Filter by sound genre

energy
string | null

Filter by energy level

tags
string[] | null

Include trends with these tags

exclude_tags
string[] | null

Exclude trends with these tags

Response

Successful Response

Response for POST /v2/trends/match.

results
TrendMatchResult · object[]
required

Matched trends ranked by similarity

query
string
required

Original query

match_mode
string
required

Resolved match mode (what "auto" chose)