prospex
Sign in

Swiss Buying Signals in Clay and n8n

6 min read

Clay, n8n, your sequencer and CRM can already enrich and route companies. Prospex supplies the Swiss company list they need: companies that match your market, the reasons they match, missing facts, and recent activity.

This guide shows how to pull one Prospex market as JSON or CSV and use it in Clay or n8n. Create the market and copy its feed URL. Then map the fields your workflow needs.

Swiss company data is spread across registers, gazettes, trademark records and job boards. Prospex combines those sources before the list reaches your workflow.

Start from a market

Each feed belongs to one market and reflects the companies in its Core or Explore tab. In /app/markets/, describe the companies you sell to and add example customers. Then build the market. Core contains the closest matches. Explore contains the broader candidates. Each company includes the reasons behind its fit.

The feed returns Core by default. Add ?tab=explore for Explore. If the URL already has a query string, append &tab=explore.

Open Connect from the market. The Connect page shows a JSON feed URL and a CSV feed URL. Both contain the same access token.

https://prospex.ch/app/markets/feed/{token}.json
https://prospex.ch/app/markets/feed/{token}.csv

The token is embedded in the URL, so no separate authorization header is required. Anyone with the URL can read the market. Store it in your automation's credential store. If it is exposed, regenerate it from the Connect page. The old URL becomes invalid immediately.

The JSON feed

curl -s 'https://prospex.ch/app/markets/feed/{token}.json?limit=5'

The response contains market metadata, pagination fields, usage, and a data array. A shortened response looks like this:

{
  "version": 1,
  "market": {"id": 12, "name": "Romandie, 11–50", "refreshed_at": "…"},
  "count": 5,
  "total": 214,
  "has_more": true,
  "next_url": "https://prospex.ch/app/markets/feed/…?limit=5&cursor=…",
  "usage": {"rows_today": 5, "daily_limit": 5000},
  "data": [ … ]
}

Each item in data represents one company. Fields commonly used for joins and filters are at the top level. Recent events are nested under signals.

  • company_id, company_url: the identity of the company, and the page a human opens.
  • fit and fit_label: fit is the stable value for automation rules (strong, good, or possible). fit_label is the translated label shown to a person.
  • reasons: why this company is in your market, in sentences, one per line of the workspace.
  • missing: facts Prospex has not verified yet. A missing fact is not evidence that the company failed the criterion.
  • bucket: core or explore.
  • pinned, decided, in_crm: pinned is true for a company you kept by hand. decided is true when you accepted or rejected the company. in_crm is true when it has been sent to your CRM.
  • signal_count, latest_signal_date, and signals: the last few dated events on the company, each with its type, title, date, Prospex link, and original source.

Each row also carries company attributes: company_name, company_uid, company_website, company_domain, company_canton, company_city, company_sector, company_sector_code, company_sector_group, company_tagline, company_employee_size, and company_audience.

Use company_domain when the other tool is keyed by website. Use company_uid when matching Swiss register data.

Separate fit from timing

fit tells you why a company belongs in the market. signals tells you what changed there recently. Each company includes its latest signal date and up to three recent events. An event contains its type, title, date, Prospex link, and original source.

Use latest_signal_date for a quick recency filter. Open the nested signals array when the workflow needs the event itself. For example, an n8n branch can send a strong-fit company with a recent capital increase to account research, together with the source URL. A strong fit with no recent event can remain in the market for later review.

Follow next_url to paginate

Pages are 100 rows by default and 500 at most. When there are more, next_url is a complete absolute URL. Request it, and keep requesting until next_url is empty.

url = "https://prospex.ch/app/markets/feed/{token}.json?limit=500"
while url:
  page = requests.get(url).json()
  yield from page["data"]
  url = page["next_url"]

A cursor is tied to the market build that created it. If the market refreshes between requests, the old cursor returns 400. Restart from the first feed URL to read the new ordering.

Clay

Choose whether Prospex creates the table or enriches one you already have.

Create a new table from Prospex. Fetch the JSON feed and select the data array. Then create one row per company. Refresh on a schedule, and your table becomes a mirror of the market.

Match Prospex to a table you already have. Import the CSV into a second table, then match its Domain column to the domain in your existing table. The CSV provides one row per company with fixed headers. Arrays are flattened into cells: Reasons uses pipes and Missing uses commas. Use JSON when the workflow needs full event details.

Prospex supplies company fit and recent activity. Clay can add the people and contact details.

n8n

Schedule Trigger → HTTP Request → Split Out on data.

  1. Add a Schedule Trigger.
  2. Add an HTTP Request and paste the JSON feed URL from Prospex.
  3. Enable pagination. Use {{ $response.body.next_url }} as the next request URL and stop when {{ $response.body.has_more }} is false.
  4. Add Split Out and select data.

Top-level company fields are now available as {{ $json.company_name }}, {{ $json.company_domain }}, and {{ $json.fit }}. The signals field remains a nested array. Add a second Split Out when the next node needs one item per event.

A common branch is an IF node on {{ $json.fit }}: route strong fits to contact enrichment or account research, and send the rest to a review sheet. Another is a Filter on {{ $json.missing }} containing website: it sends companies whose missing array contains website to a website-discovery step.

Daily limit

An account can pull 5,000 rows per day across market feeds, signal downloads and CSV exports. When the quota is exhausted, the feed returns 429 with a Retry-After header. The Connect page shows today's usage and reset time. The budget resets at midnight Europe/Zurich.

For now, poll the feed on a schedule. Webhook delivery is planned.

The market feed ends at company level. Add contacts and email addresses with your enrichment tool, then route qualified records to your sequencer or CRM. If you need the underlying register publications, see the Zefix REST API and the SHAB API guides.

Cookie preferences

Necessary cookies always run. The other two are on unless you turn them off.