CtrlK
BlogDocsLog inGet started
Tessl Logo
PluginPublic

synter/synter-audience-discovery

Build, size, and purchase a Synter Audience from a plain-English B2B contact or US adult signal description — inspect schema vocabularies, size typed filters, discover behavioral traits, save reusable Signals definitions, and run approval-gated CSV exports. Use when the user wants to build, size, or purchase a B2B contact list, prospect list, lead list, contact data export, or US adult signal audience from a plain-English description.

Quality

88%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Medium

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

SKILL.md

name:
synter-audience-discovery
description:
Build, size, and purchase a Synter Audience from a plain-English B2B contact or US adult signal description — inspect schema vocabularies, size typed filters, discover behavioral traits, save reusable Signals definitions, and run approval-gated CSV exports. Use when the user wants to build, size, or purchase a B2B contact list, prospect list, lead list, contact data export, or US adult signal audience from a plain-English description.
synter:
{"tools":["synter.audience"],"permissions":{"read":["audiences"],"write":["audiences"]},"approval":"required","outputs":[{"type":"project_artifact"}]}

Synter Audience Discovery

Turn a description of who to reach into a real audience. Use only the native synter_audience tool exposed by this skill. Do not call backend/provider tool names directly and do not switch to campaign planning when an audience call fails.

This skill creates lists; it never activates them, launches campaigns, or recommends an unrelated channel or budget.

Use standard customer-facing terminology (Synter audience data, Synter Signals, and Synter Audience) and quote the standard Synter retail pricing defined in this skill rather than internal credit counters.

Choose the audience path

  • Contact audience: B2B companies and named contacts with work-email data.
  • Signals audience: US adults, behavioral/affinity traits, entity discovery, then full-profile enrichment.

External MCP clients (Claude Code, Claude Desktop, Cursor)

Use the connected Synter MCP's synter_audience directly. The key needs audiences:write and access to the selected workspace/file. An authorization failure is not permission to switch customers or call private supplier tools.

  1. Call action="destinations". Follow next_cursor even when a page is empty until the intended writable Synter file is found. campaign_id is that file's UUID, not a Google/Meta campaign ID. Do not silently choose another file.
  2. Supply that campaign_id to schema, size, or discover_traits to refine the audience without delivering paid rows.
  3. Request export (contact filter) or export_signals (reviewed expression) with the same campaign_id and explicit max_rows. If the file has no conversation, open it in Synter and start one; a supplied thread_id must belong to this file.
  4. Present the returned maximum price and review_url. The human approves that saved review in Synter. A chat "yes" is not an approval token.
  5. Poll with only action="export_status", purchase_id="<returned ID>" for either audience type. External polling does not accept export_id, filters, or a different destination. Return the saved, authenticated CSV artifact.

Never resubmit export to poll. An interrupted response is not proof nothing happened: use the purchase ID when available. Pending identical requests reuse the existing review; after approval, continue polling that ID. This tool does not activate an ad audience or start outbound sending. Purchased third-party data is not automatically eligible for every platform's customer-match policy.

Reusable Signals definitions

Before export or activation, save the reviewed Signals recipe with action="save_definition", definition={name, groups:[{name, traits:[{label,id}]}], exclusions:[], notes, max_rows, destinations} and the exact campaign_id for external callers. This free action creates a project file; it does not purchase or upload contacts. OR within each group, AND between groups; only verified exclusion IDs are executable. Use human-readable trait labels in visible summaries. Use action="read_definition", artifact_id=... to reuse it within the same project. Then request an approved bounded export separately.

Campaign IDE contact audience workflow

Do not begin with export. Build and verify the filter before taking paid delivery.

  1. synter_audience(action="schema", entity="contact")
  2. Repeat action="schema" with column to inspect exact vocabularies.
  3. action="size" with a typed filter tree; refine until the count fits.
  4. action="export" with the approved filter and explicit max_rows from 1 through 100,000.
  5. Poll action="export_status" with the returned export_id until completion.

Every action that delivers paid records (export and export_signals) returns pending_review with Synter, the destination project, row ceiling, and maximum record charge at $0.15 per delivered record ($150 CPM), plus the disclosed flat action fee. Show that review and ask the user to reply "I APPROVE". Stop there: the authenticated approval flow executes the frozen request and owns its durable purchase id. Never re-call or reconstruct the purchase yourself.

export_status polling is free and needs no new approval. Poll the same returned export_id idempotently until it completes. To abort a bad in-flight Synter export, call action="cancel_export"; cancellation is free but is a state-changing write.

On completion, Synter consumes the private temporary URL server-side, creates a versioned CSV project artifact, and opens it in the right-hand Table view. The complete encrypted CSV remains downloadable; the editable Table is an explicit preview of the header plus the first 999 data rows. Never repeat or expose a signed download URL in chat. Re-polling the same completed export is safe: it reuses the same active project artifact and does not bill the audience twice.

If the user requests 500 prospects, export at most 500 unless they explicitly approve an oversample. After delivery, disclose the actual unique count. If one-contact-per-company is required and deduplication yields fewer than 500, offer (but never silently perform) a second oversampled purchase with its own estimated maximum charge.

Filter syntax

The root and every child must include type:

{
  "type": "group",
  "op": "AND",
  "negate": false,
  "children": [
    {
      "type": "condition",
      "column": "EMAIL_STATUS_PER",
      "operator": "in",
      "valueList": ["VALID"]
    },
    {
      "type": "condition",
      "column": "COUNTRY_CODE_ORG",
      "operator": "in",
      "valueList": ["US"]
    },
    {
      "type": "condition",
      "column": "JOB_TITLE_PER",
      "operator": "contains",
      "value": "engineering manager"
    }
  ]
}

Never guess column names. An invalid column is rejected rather than ignored.

Contact audience correctness traps

  • EMPLOYEE_COUNT_MIN and EMPLOYEE_COUNT_MAX are band edges, not a numeric range. For real lower/upper bounds, first verify and then use EMPLOYEE_PROFILES_ON_LINKEDIN_ORG with gte and lte.
  • Prefer literal JOB_TITLE_PER contains for customer deliverables. Semantic score means fit, not buying intent, and may not narrow predictably.
  • EMAIL_STATUS_PER = VALID is the verified-work-email filter.
  • A company-country filter does not prove the person is in that country.
  • Raw results can contain duplicate people or multiple contacts per company. State that limitation; do not claim a one-company-one-contact result unless the saved table actually proves it.
  • Industry is uncontrolled unless the filter explicitly includes it.

Signals audience workflow

  1. synter_audience(action="discover_traits", query="…", entity="person") returns trait descriptors and sizes, not people.
  2. To purchase the complete deliverable, call synter_audience(action="export_signals", expression="…", entity="person", domains=["email"], max_rows=…) with an explicit 1–100,000-row bound. Synter saves the complete CSV and opens the same 999-row Table preview used for the contact audience workflow.

Signals audiences are US-only and adults-only. All purchased Synter audience records are billed at $150 CPM ($0.15 per delivered record), plus the disclosed flat call fee. Do not describe trait fit as active buying intent. If a request targets minors, explain that Synter cannot fulfill it and ask for an adults-only audience definition; do not substitute another audience or corpus.

Sizing, trait discovery, incomplete export polling, cancellation, service errors, and withheld deliveries have no per-record charge. Completed CSV delivery charges only the rows actually delivered. Before a bounded purchase, state the record rate, disclosed flat fee and maximum total as currency amounts, never raw credit counts. A running Synter export can be cancelled with action="cancel_export"; cancellation delivers no records.

The skill manifest capability is synter.audience; the callable wire name is synter_audience. These are two names for the same tool, not separate tools.

Failure behavior

Report the exact audience step that failed and its impact, then retry only a safe equivalent within this workflow. Never substitute a Google SEM campaign, media plan, budget, or another deliverable for a failed audience request. Never claim a CSV exists until Synter export_status or export_signals returns a project_artifact.

Delivery checklist

  • Requested purchase bound respected (maximum 100,000 data rows)
  • Complete CSV downloadable; Table clearly treated as a 999-data-row preview
  • Verified email criterion included when the user needs contactable B2B rows
  • Literal versus semantic matching disclosed
  • Uncontrolled dimensions disclosed
  • Delivered count distinguished from total matching count
  • project_artifact returned and opened in the Table view

SKILL.md

tile.json