---
title: "Clickhouse Mashup"
method: POST
path: "/clickhouse/mashup"
tags: ["ClickHouse"]
---

# Clickhouse Mashup

`POST /clickhouse/mashup`

## Request

- Base URL: `https://be.graph8.com/api/v1`
- URL: `https://be.graph8.com/api/v1/clickhouse/mashup`
- Auth: HTTP bearer

Enrich UP_IDs / HEMs / domains against the ClickHouse Cloud mashup tables.

Use this for bulk enrichment workflows where the agent already has a
primary key (UP_ID from ``g8_opensearch_resolve_ids``, a HEM from a
visitor row, or a company domain from CRM). For free-form attribute
search prefer ``g8_opensearch_search`` against ``mashup_contacts``.

## Headers

- `Authorization` string, nullable
- `X-Target-Org-Id` string, nullable

## Request body

- ClickhouseMashupRequest
  - `mode` 'by_upid' | 'by_hem' | 'by_domain', required: Which mashup PK to filter by.
  - `values` string[], required: Up to 100 key values (UP_IDs, HEMs, or domains).
  - `profile` 'b2b' | 'b2c' | 'joined': Which mashup table to read. 'joined' returns the denormalized contact+company record from the current mashup build (mashup.v3_enriched_for_os); by_domain mode only.
  - `limit` integer

## Response `200`

Successful Response

- ApiResponseClickhouseMashupResponse
  - `data` ClickhouseMashupResponse, required
    - `mode` string, required
    - `profile` string, required
    - `records` object[]
    - `matched` integer
    - `requested` integer
  - `pagination` PaginationMeta
    - `page` integer, required: Current page number (1-indexed)
    - `limit` integer, required: Items per page
    - `total` integer, required: Total number of items
    - `has_next` boolean, required: Whether there are more pages
    - `next_cursor` string, nullable: Opaque cursor for the next page; null when there are no more items. Pass it back as the `cursor` query param to fetch the following page without computing page numbers.
    - `total_available` integer, nullable: Search endpoints only: how many records really match, when known. Can be larger than `total`, which is capped at the 10,000 results that can be paged. For company search this is a distinct-company estimate. Null when unknown; absent outside search.
    - `total_is_lower_bound` boolean, nullable: Search endpoints only: true when more records match than `total` shows (the result set is larger than the 10,000 results that can be paged). Absent outside search.
    - `notes` string[], nullable: Search endpoints only: plain-language notes about the result, e.g. that more records match than can be paged, or that a reversed `between` range was put in order.

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/graph8/apis/graph8-developer-api.md) · [All operations](https://skmtc.dev/graph8/apis/graph8-developer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/graph8/apis/graph8-developer-api/revisions/2e7cfa0ca921?raw)
