Zapier integration

TechSpy for Zapier

Connect TechSpy to 8,000+ apps with Zapier — no code. Use triggers to start a Zap when a report is published, a scan is saved, or a watched domain changes; use actions to detect a stack, audit DNS/DMARC, discover subdomains, compare domains, or start monitoring. Everything runs on the same engine as the app.

5

Triggers

9

Actions

8,000+

Apps to connect

Connect your account

  1. 1

    Generate an API key on the API settings page (requires the Max plan).

  2. 2

    In Zapier, add a TechSpy step and choose Connect a new account.

  3. 3

    Paste your ts_… key when prompted. That's it — the same key works for every trigger and action.

No published app needed to try it: you can also add a Webhooks by Zapier → Custom Request step pointing at /api/analyze. Full endpoint reference in the API docs.

Domain monitoring

The three change triggers watch a domain over time. Add domains to monitor in two ways:

In a Zap

Use the Watch a Domain action — e.g. on every new CRM company, start monitoring its domain.

In the app

Manage your watched domains at Settings → Domain Monitoring.

TechSpy rescans each watched domain daily and diffs it against the last snapshot. When the tech stack, subdomains, or email-security records move, the matching trigger fires. The first scan sets a baseline (no trigger), so you only hear about real changes.

Triggers

A trigger starts a Zap. TechSpy offers 5.

Trigger

New Report Published (Trigger)

Fires when TechSpy publishes a new report. Built for teams who want each report pushed to Slack, a CRM, or a content queue the moment it goes live, instead of watching the dashboard.

When to use it

  • Post every new deep dive to a Slack channel the second it publishes.
  • Log each report in a content tracker or editorial calendar for the marketing team.
  • Feed new comparison and ranking reports into an email digest or CRM sequence for sales follow-up.

Inputs None — this trigger polls automatically.

Outputs

Field Type Description
id string Unique report identifier. Used for deduplication so the same report never fires twice.
title string The report's title.
content_type string One of single, comparison, ranking, knowledge_base, blog.
slug string URL slug for the report.
url string Full public URL of the published report.
published_at datetime Timestamp the report went live.

Example Zaps

  1. TechSpy → Slack. New Report Published fires. A Slack "Send Channel Message" step posts to #content-live, mapping title into the message body and url as the link. Include content_type in the message so the channel sees whether it's a deep dive, comparison, or ranking.
  2. TechSpy → Airtable. New Report Published fires. An Airtable "Create Record" step adds a row to a content base, mapping title, slug, url, content_type, and published_at into their own fields. Store id in a text field so you can cross-reference the record later.

Limits & notes

  • Polls on Zapier's standard schedule (roughly every 1–15 minutes depending on your plan), so expect a short delay between publish and trigger.
  • Deduplicated on id. Once a report has fired, editing or re-publishing it does not fire the trigger again.
  • On first turn-on, Zapier pulls a batch of recent reports to seed the trigger. Those may run through the Zap once; only new reports fire after that.

Troubleshooting

  • Not seeing a report you just published? Confirm its status is published in TechSpy. Drafts and scheduled reports don't fire until they go live.
  • Want only one report type? Add a Zapier Filter step after the trigger and gate on content_type (for example, continue only when it equals single).
Trigger

New Saved Scan (Trigger)

Fires when you save a new scan to your TechSpy account. Use it to start a downstream workflow — a CRM update, an alert, a spreadsheet row — the moment a scan lands, so you don't have to watch the dashboard.

When to use it

  • Log every new scan to a Google Sheet or Airtable base as a running record of companies you've researched.
  • Alert Slack or email the moment a prospect's scan is ready, so sales acts on fresh tech-stack intel.
  • Create or update a CRM record when you scan a target account, attaching its tech count and stack summary.

Inputs

None — this trigger polls automatically.

Outputs

Field Type Description
id string Unique identifier for the saved scan. Use it as the dedup key downstream.
url string The website URL that was scanned.
created_at datetime When the scan was saved.
tech_count integer Number of technologies detected on the site.
tech_summary string Comma-separated list of detected technologies.
dns_grade string Letter grade for the site's DNS configuration. Can be null if not assessed.

Example Zaps

  1. New scan → Slack alert for sales. Trigger: New Saved Scan (TechSpy). Action: Slack "Send Channel Message" to #prospecting. Map url and tech_count into the message text, and tech_summary into a code block so reps see the full stack at a glance. Include id for reference.

  2. New scan → Airtable log → HubSpot company update. Trigger: New Saved Scan (TechSpy). Step 2: Airtable "Create Record" in a Scans table, writing id, url, created_at, tech_count, tech_summary, and dns_grade to their own columns. Step 3: HubSpot "Create or Update Company," matched on the domain from url, storing tech_summary in a custom property and dns_grade on the record for lead scoring.

Limits & notes

  • Authenticated by your API key. You only see scans saved under your own account.
  • Polling trigger: new scans surface within a few minutes of being saved, not instantly.
  • On setup, Zapier loads a batch of your recent existing scans so you can pick a sample to build with. Live runs fire only on genuinely new scans after that.
  • dns_grade can be null. Add a filter step if a downstream field requires a value.

Troubleshooting

  • A saved scan didn't trigger the Zap. Polling runs on an interval, so give it a few minutes. If it still hasn't fired, confirm the scan was saved under the same account whose API key authenticates this Zap — scans from other accounts are never returned.
  • A downstream step errors on a blank grade. dns_grade is nullable. Map it to an optional field, or add a Filter or Formatter step to supply a default before the action runs.
Trigger

Tech Stack Changed (Trigger)

Fires when a domain you watch adds or drops a detected technology. Built for sales, competitive intel, and partnerships teams who want to catch tooling shifts at watched accounts the day they land.

When to use it

  • Alert your sales team the moment a target account adds a payment processor you compete against.
  • Catch when a competitor drops a legacy analytics tool so you can time an outreach push.
  • Keep a running log of every stack change across watched accounts for quarterly review.

Inputs None — this trigger polls automatically. It requires at least one watched domain, added via the Watch a Domain action or under Settings > Domain Monitoring.

Outputs

Field Type Description
id string Unique ID for this change event.
url string The watched domain where the change was detected.
change_type string Either tech_added or tech_removed.
item string The technology that was added or removed.
detected_at datetime When the change was detected.

Example Zaps

  1. Slack competitive alert. Trigger: Tech Stack Changed. Action: Send Channel Message in Slack to #competitive-intel. Build the message from item and change_type (for example, "Stripe was tech_added on url") and append detected_at for timing.
  2. Google Sheets change log. Trigger: Tech Stack Changed. Action: Create Spreadsheet Row in Google Sheets. Map detected_at, url, change_type, and item to their own columns, and store id in a key column so you never log the same event twice.

Limits & notes

  • Checks run daily, so a change can surface up to 24 hours after it happens.
  • The first scan of a newly watched domain sets a baseline and does not fire. You only get events on changes after that.
  • Only domains you actively watch are polled. A domain not added via Watch a Domain or Settings > Domain Monitoring produces no events.

Troubleshooting

  • No events firing? Confirm the domain is watched and has finished its baseline scan. A brand-new domain stays silent until its second daily check.
  • Flood of events on day one? That happens when the baseline was skipped or the domain was re-added, which resets the baseline. Let one more daily cycle pass and it settles.
Trigger

New Subdomain Detected (Trigger)

Fires when a domain you're watching exposes a new subdomain. Built for security, recon, and competitive-intel teams tracking when a target stands up new infrastructure.

When to use it

  • Alert your security team in Slack when a watched competitor or vendor brings up a new staging. or api. host.
  • Catch a target company's product launches by watching for subdomains like app. or docs. before the public announcement.
  • Feed a running inventory of a domain's external attack surface into a spreadsheet or CRM for periodic review.

Inputs

None — this trigger polls automatically. It requires at least one watched domain configured in TechSpy.

Outputs

Field Type Description
id string Unique identifier for this subdomain detection event.
url string The watched domain the subdomain belongs to.
item string The newly detected subdomain hostname.
detected_at datetime When TechSpy first saw the subdomain.

Example Zaps

  1. New subdomain → Slack alert. Trigger: New Subdomain Detected on your watched domain. Action: Slack "Send Channel Message" to #security-recon. Map item into the message body as the new host, url as the parent domain, and detected_at as the timestamp. Your team reads "New subdomain on acme.com: staging.acme.com (detected 2026-07-10)" without leaving Slack.

  2. New subdomain → Google Sheets log. Trigger: New Subdomain Detected. Action: Google Sheets "Create Spreadsheet Row" in an attack-surface tracker. Map item to the Subdomain column, url to the Root Domain column, detected_at to the First Seen column, and id to a Record ID column for dedup. Over time the sheet becomes a dated inventory of every host that appeared under the domain.

Limits & notes

  • Checks run daily. Expect up to a 24-hour delay between a subdomain going live and the trigger firing.
  • The first scan of a newly watched domain sets a baseline. Existing subdomains are recorded silently and do not fire the trigger. Only subdomains found after that baseline fire a Zap.
  • A watched domain must be configured in TechSpy before this trigger returns anything.

Troubleshooting

  • Trigger never fires after setup. The baseline scan absorbs everything already present, so you only get events once a genuinely new subdomain appears. Run Zapier's test step to confirm the connection, then wait for real new activity.
  • Expected a subdomain but saw nothing. Confirm the domain is on your watched list and the daily check has run since you added it. Subdomains with no DNS exposure (or wildcard-only records) won't surface as distinct item values.
Trigger

Email-Security Posture Changed (Trigger)

Fires when a domain you're watching changes its SPF, DMARC, or DKIM record. Built for security and IT teams who need to catch email-auth drift before it turns into spoofing or blocked mail.

When to use it

  • Alert your team the moment a vendor or subsidiary weakens its DMARC policy from reject to none.
  • Track an acquisition target's email-auth setup during due diligence.
  • Catch an unauthorized change to your own domain's SPF record before phishing lands.

Inputs

None — this trigger polls automatically. You need at least one watched domain configured in TechSpy.

Outputs

Field Type Description
id string Unique identifier for this change event.
url string The watched domain the change was detected on.
field string Which record changed: spf, dmarc, or dkim.
old_value string The record value before the change.
new_value string The record value after the change.
detected_at datetime When TechSpy detected the change.

Example Zaps

  1. Slack alert to the security channel. Trigger: Email-Security Posture Changed → Action: Slack, Send Channel Message to #sec-alerts. Map url, field, old_value, and new_value into the message body so the on-call engineer sees which domain changed and what it moved from and to. Add detected_at as the timestamp.

  2. Audit log in Airtable. Trigger: Email-Security Posture Changed → Action: Airtable, Create Record in your "Email Auth History" base. Map id to a primary column, then url, field, old_value, new_value, and detected_at to their own fields. You get a searchable record of every SPF, DMARC, and DKIM change across all watched domains.

Limits & notes

  • Checks run once daily. A change surfaces within 24 hours of going live, not in real time.
  • The first scan of a newly watched domain sets a baseline and does not fire. You only get events on changes after that.
  • Requires at least one watched domain. With none configured, the trigger never fires.
  • One event fires per changed field. If SPF and DMARC both change in the same scan, you get two separate events.

Troubleshooting

  • No events after adding a domain. The first scan is baseline-only. Wait for the next daily check plus a real record change before expecting a trigger.
  • old_value is blank. The record didn't exist before — for example, DKIM was just added. A blank old_value with a populated new_value means a record was created, not edited.

Actions

An action runs mid-Zap. Searches look up info; Creates do work (some spend credits).

Search

Get Tech Stack (Search)

Detects a domain's full technology stack in one call: static page analysis, subdomain enumeration, and DNS lookups. Built for anyone who needs to know what a company runs before they reach out, qualify, or route them.

When to use it

  • A new lead lands in your CRM and you want their framework, CMS, and payment provider attached before a rep sees it.
  • Sales wants to filter prospects by hosting or auth stack (e.g., only companies on Shopify, or anyone using Auth0).
  • You're building a competitive dataset and need to enrich a list of domains with what each one is built on.

Inputs

Field Required Description
url Yes The domain or URL to scan (e.g., stripe.com or https://stripe.com). TechSpy runs static, subdomain, and DNS detection against it.

Outputs

Field Type Description
url string The domain that was scanned.
status string Scan result status.
tech_summary string Comma-separated list of every detected technology.
tech_count integer Number of technologies detected.
framework string Frontend/backend framework(s) found (e.g., React, Next.js).
hosting string Hosting or cloud provider (e.g., AWS, Vercel).
cms string Content management system, if any (e.g., WordPress).
analytics string Analytics tools (e.g., Google Analytics, Segment).
payment string Payment processors (e.g., Stripe, Braintree).
auth string Authentication provider (e.g., Auth0, Okta).
dns_cdn string CDN serving the domain (e.g., Cloudflare, Fastly).
dns_provider string DNS host for the domain.
email_provider string Email provider from MX records (e.g., Google Workspace).
tls_issuer string TLS certificate issuer (e.g., Let's Encrypt).
raw_json string Full tech stack as a stringified JSON object for downstream parsing.

Example Zaps

  1. HubSpot new company → enrich → Slack alert. Trigger on a new company in HubSpot. Pass the company's domain into url. Map framework, payment, and hosting back onto the HubSpot company record, then post a Slack message to #sales using tech_summary and tech_count so the account owner sees the stack the moment the company is created.

  2. Google Sheets row → enrich → Airtable. A row is added to a Google Sheets prospecting list. Feed the domain column into url. Send the result to Airtable, mapping cms, analytics, auth, and dns_cdn into their own columns and dropping raw_json into a text field for later filtering. Now the whole list is queryable by tech.

Limits & notes

  • Costs 1 credit per scan.
  • Returns in seconds. Fast enough to run inline in a live Zap without a delay step.
  • raw_json is a stringified JSON object. Run it through a Formatter or Code step if you need to parse individual entries.
  • Category fields (framework, cms, payment, and the rest) come back empty when nothing in that category is detected. That's a real result, not an error.

Troubleshooting

  • Empty or thin results. Confirm url is a reachable root domain. Some sites block automated requests or hide their stack behind a CDN. Check status and tech_count before treating the scan as failed.
  • Downstream step chokes on raw_json. It's a string, not an object. Parse it with a Code by Zapier step, or map the individual category fields instead, rather than referencing nested keys directly.
Search

Get DNS Profile (Search)

Scans a domain's DNS setup and returns grades, provider names, and email-security signals. For anyone enriching a lead, account, or scan record with real DNS data before the next step runs.

When to use it

  • Enrich a new CRM company with its CDN, DNS provider, and email host the moment the record is created.
  • Flag prospects with weak email security (missing SPF, DMARC, or DNSSEC) so SDRs open with the right pitch.
  • Pull the TLS issuer and certificate expiry window to build a renewal or compliance watchlist.

Inputs

Field Required Description
url Yes The domain or URL to analyze (e.g. stripe.com or https://stripe.com).

Outputs

Field Type Description
dns_grade string Letter grade for the domain's DNS setup (e.g. A, B).
overall_score number Combined DNS health score.
security_score number Score for the domain's email and DNS security posture.
cdn string CDN detected in front of the domain.
dns_provider string Company hosting the domain's DNS.
email_provider string Provider handling the domain's email (from MX records).
tls_issuer string Certificate authority that issued the TLS certificate.
tls_days number Days remaining until the TLS certificate expires.
spf string SPF record status or value.
dmarc string DMARC record status or value.
dnssec boolean Whether DNSSEC is enabled.
raw_json string Full unparsed scan payload for custom mapping.

Example Zaps

  1. HubSpot new company → Get DNS Profile → HubSpot update company. A company lands in HubSpot. This step scans its domain, then a HubSpot update writes dns_provider, email_provider, and security_score back onto the record so reps see the stack before they dial.
  2. Google Sheets new row → Get DNS Profile → Slack message. An analyst drops target domains into a Google Sheet. This step scans each one. When dnssec is false or dmarc shows no record, a Slack message posts dns_grade, spf, and dmarc to the security channel for follow-up.

Limits & notes

  • Costs 1 credit per lookup.
  • Returns in seconds.
  • Needs a domain that resolves publicly. url accepts a bare domain or a full URL.
  • Fields for services the domain does not use (e.g. no CDN) come back empty. Read raw_json when a parsed field is blank.

Troubleshooting

  • Blank cdn, spf, or dmarc usually means the domain has no such record, not a scan failure. Confirm against raw_json before treating it as an error.
  • Empty results overall: the url did not resolve. Feed the registrable domain (stripe.com), not a full path (https://stripe.com/pricing).
Search

Discover Subdomains (Search)

Finds every subdomain for a domain and groups them by architectural layer (Application, API, and so on). Built for security, sales-intel, and infrastructure teams who need a fast map of a company's public footprint.

When to use it

  • Enrich a new lead or account with the target's subdomain count and layer breakdown before outreach.
  • Feed a recon step in a security workflow that flags newly exposed hosts.
  • Keep a running inventory of a competitor's infrastructure surface in a spreadsheet or database.

Inputs

Field Required Description
url Yes The domain or URL to scan for subdomains (for example, stripe.com).

Outputs

Field Type Description
url String The domain that was scanned.
status String Result status of the scan.
subdomain_count Integer Total number of subdomains found.
subdomains String Comma-separated list of discovered hostnames.
layers_summary String Count of subdomains per layer, for example Application: 2; API: 1.
raw_json String Full raw JSON response for advanced parsing or storage.

Example Zaps

  1. HubSpot new company → Discover Subdomains → Google Sheets. When a new company is created in HubSpot, run Discover Subdomains on the company's url. Append a row to a Google Sheet with url, subdomain_count, and layers_summary so the sales team sees each account's infrastructure footprint at a glance.
  2. Airtable button → Discover Subdomains → Slack. Trigger the search from an Airtable record's url field. Post the result to a #recon Slack channel with subdomain_count in the message and the full subdomains list in the thread, so the security team can review new hosts.

Limits & notes

  • Costs 1 credit per scan.
  • Returns in seconds, not minutes.
  • subdomains is a single comma-separated string. Split it downstream if you need one host per row.

Troubleshooting

  • Empty or low subdomain_count: some domains block enumeration or genuinely run few public subdomains. Check status before assuming the scan failed.
  • Passing a full path (like stripe.com/pricing) still scans the root domain. Feed just the domain in url for the cleanest result.
Search

Email Security Audit (Search)

Checks a domain's email authentication posture (SPF, DMARC, DKIM, DNSSEC) and returns a letter grade. For sales, security, and RevOps teams who want a fast read on whether a prospect or vendor has locked down their email.

When to use it

  • Enrich an inbound lead with an email-security grade before a rep works it.
  • Flag vendors or partners whose domains fail DMARC as a security risk.
  • Sort a prospect list by posture to prioritize outreach or pitch managed-email services.

Inputs

Field Required Description
url Yes The domain or website URL to audit (for example, stripe.com). A bare domain or full URL both work; the audit resolves to the root domain.

Outputs

Field Type Description
url string The domain that was audited.
spf string SPF record status or value.
dmarc string DMARC record status or value.
dkim string DKIM record status or value.
dnssec boolean Whether DNSSEC is enabled on the domain.
security_grade string Letter grade summarizing email posture (for example, A, B, C).
security_score number Numeric score behind the grade.
email_provider string Detected email provider (for example, Google Workspace, Microsoft 365).
raw_json string Full raw audit payload for custom parsing.

Example Zaps

  1. HubSpot new contact → Email Security Audit → Slack. A new contact lands in HubSpot. Pass the contact's company domain into url. Map security_grade and dmarc into a Slack message to #sales-intel: "New lead {company} — email grade {security_grade}, DMARC {dmarc}." Reps see posture before the first call.

  2. Google Sheets new row → Email Security Audit → Airtable. You keep a vendor list in Google Sheets. Each new row runs an audit on the domain in url. Map security_grade, security_score, dnssec, and email_provider into an Airtable "Vendor Risk" base. Filter the view to grades below C to build a follow-up list.

Limits & notes

  • Costs 1 credit per audit.
  • Returns in a few seconds, so it runs inline in a Zap with no polling delay.
  • Reads public DNS records only. No authentication to the target domain is required.

Troubleshooting

  • Empty spf, dmarc, or dkim usually means the record does not exist on that domain, not an audit error. Treat a blank value as "not configured"; security_grade already reflects the gap.
  • A full URL with a path or subdomain can skew results. Strip it to the root domain (acme.com, not mail.acme.com/login) so the audit checks the records that govern the whole domain.
Search

Get Sitemap Structure (Search)

Looks up a site's sitemap and returns its shape: whether one exists, how many URLs it lists, and which sitemap files make it up. For anyone mapping a competitor's or prospect's site coverage before a crawl or report.

When to use it

  • Check whether a target domain publishes a sitemap before you start a full scan.
  • Pull a competitor's total URL count to gauge how much content they publish.
  • Grab the list of sitemap files (blog, products, docs) to route each one to a different downstream step.

Inputs

Field Required Description
url Yes The site or page URL to inspect. TechSpy resolves the domain's sitemap from it.

Outputs

Field Type Description
url string The URL you submitted, echoed back.
sitemap_found boolean true if a sitemap was located, false if none exists or it was unreachable.
total_urls integer Count of URLs listed across the sitemap.
main_sitemap string The primary sitemap file, usually the root or index sitemap.
sitemap_files comma-separated All discovered sitemap files, separated by commas.
truncated boolean true if the URL set was cut off for exceeding the return cap.
raw_json string Full structured response for custom parsing downstream.

Example Zaps

  1. Google Sheets sitemap tracker. Trigger: new row in Google Sheets (a domain to research). Step: Get Sitemap Structure on that domain. Action: update the same row with sitemap_found, total_urls, and main_sitemap so the research sheet shows coverage at a glance.
  2. Slack prospect alert. Trigger: new HubSpot company added to a list. Step: Get Sitemap Structure on the company's website. Action: post a Slack message to your sales channel with total_urls and sitemap_files mapped in, so reps see how much content the prospect ships before the first call.

Limits & notes

  • Fast: this action returns in seconds, not minutes.
  • When total_urls is large, the response may be capped. Check truncated before treating the URL set as complete.
  • sitemap_found can be false even for a live site (no sitemap published, or the file is blocked). Branch on it instead of assuming a sitemap exists.

Troubleshooting

  • sitemap_found is false for a site you know is live. The domain may not publish a sitemap at the standard path, or a firewall blocked the fetch. Confirm the sitemap loads in a browser, then retry with the exact URL.
  • total_urls looks lower than expected. Check truncated. If it is true, the count reflects a capped set, not the full sitemap. Parse raw_json when you need the untrimmed structure.
Create

Deep Scan (With Browser Rendering) (Create)

Renders the target site in a headless browser and captures its HAR to expose hidden APIs and SDKs that never appear in static HTML. Built for single-page apps and JS-heavy sites where a plain scan sees an empty shell.

When to use it

  • Auditing a React, Vue, or Angular SPA where the stack loads client-side and static scanners come back thin.
  • Finding the backend and third-party API domains a competitor's app calls at runtime.
  • Enriching a lead record with a full runtime tech profile before sales or research reaches out.

Inputs

Field Required Description
url Yes Full URL to scan (for example https://example.com). Runs static, subdomain, DNS, sitemap, and deep passes with browser rendering.

Outputs

Field Type Description
url string The URL that was scanned.
status string Scan result status.
cache_hit string Whether the result came from the 7-day cache.
tech_count integer Number of technologies detected.
tech_summary string Readable summary of the detected stack.
dns_grade string Grade for the domain's DNS configuration.
api_domains string Comma-separated list of API domains called at runtime.
subdomains string Comma-separated list of discovered subdomains.
pages_analyzed string Comma-separated list of pages the scan analyzed.
interact_actions integer Number of browser interaction actions performed during rendering.

Example Zaps

  1. HubSpot new company → Deep Scan → Slack alert. A new company lands in HubSpot. Deep Scan renders its site, then a Slack message to #competitive-intel posts tech_summary, tech_count, and api_domains so the team sees the runtime stack the moment the account is created.
  2. Google Sheets new row → Deep Scan → Airtable record. A prospect URL drops into a Google Sheet. Deep Scan runs, then an Airtable Create Record step writes url, dns_grade, subdomains, and pages_analyzed into a research base for the analyst to review.

Limits & notes

  • Consumes 1 Deep Scan credit per run.
  • Runs in minutes, not seconds, because it spins up a real browser and captures a HAR. Set downstream timeouts accordingly.
  • Cache-first: a repeat scan of the same URL within 7 days returns the cached result and flags it in cache_hit.
  • Runs the full pass set (static, subdomain, DNS, sitemap, deep) in one call.

Troubleshooting

  • Low tech_count on a known-heavy site usually means the page blocked rendering or timed out. Confirm the url loads publicly with no login wall, then re-run.
  • Getting an unexpected old result? Check cache_hit — you are inside the 7-day window. Wait for the cache to expire or scan a distinct URL to force a fresh render.
Create

Interact Scan (Create)

The deepest scan TechSpy runs: an LLM opens the target site, then clicks buttons and fills forms to surface tools that only load after a real interaction. Use it when a passive crawl leaves gaps — chat widgets, gated flows, and post-signup tooling.

When to use it

  • Map a competitor's onboarding or checkout to see which payment, support, and analytics tools fire after a form submits.
  • Prep an account before a sales call so reps know the exact stack behind login walls and interactive widgets.
  • Catch post-interaction tools like live chat, consent managers, and A/B testing that standard and deep scans miss because they only load on click.

Inputs

Field Required Description
url Yes The website URL to scan. The LLM visits the page, then clicks and fills forms to reveal interaction-triggered tools.

Outputs

Field Type Description
url String The URL that was scanned.
status String Final scan status.
tech_count Integer Total technologies detected across all stages.
tech_summary String Human-readable summary of the detected tech stack.
dns_grade String Grade for the domain's DNS configuration.
api_domains Array API and backend domains observed during the scan.
subdomains Array Subdomains discovered for the target.
interact_actions Integer Number of clicks and form fills the LLM performed during the interaction stage.
interact_status String Status of the interaction stage specifically.

Example Zaps

  1. Airtable + Slack. Trigger: a new row in an Airtable "Prospects" base with a company URL. Action: Interact Scan (Create) on that url. Downstream: post to a Slack channel, mapping tech_summary and tech_count into the message and adding interact_actions so the team sees how deep the scan went before tools appeared.
  2. Google Sheets + HubSpot. Trigger: a new row added to a Google Sheets account list. Action: Interact Scan (Create) on the url. Downstream: update the matching HubSpot company record — write tech_summary to a stack field, dns_grade to a security field, and api_domains to a notes field for the rep to review.

Limits & notes

  • Consumes 1 Deep Scan credit plus 1 Interact credit per run. Budget both before building high-volume Zaps.
  • Takes minutes, not seconds. The LLM navigates and interacts with the live page, so runs are slower than passive scans. Set downstream steps to expect the delay.
  • If a page has no interactive elements to act on, interact_actions returns 0 and results fall back to the deep-scan findings.

Troubleshooting

  • Zap looks stuck: the interaction stage runs for minutes. Give it time before assuming failure, and check interact_status to see whether the stage completed or was skipped.
  • Low interact_actions on a site you expected to be rich: the LLM only acts on reachable elements. Point url at the interactive page (login, signup, or checkout), not a static landing page.
Create

Compare Two Domains (Create)

Scans two domains and diffs their tech stacks, running static and DNS detection on each. Built for competitive and BD teams who want a side-by-side stack comparison inside an automated workflow.

When to use it

  • A prospect names their current vendor. Diff your customer's domain against theirs to spot migration gaps before a sales call.
  • Track a competitor over time. Re-run the same two domains monthly and log what tech each side adds or drops.
  • Vet an acquisition target by comparing its stack against your own to size up integration work.

Inputs

Field Required Description
url_a Yes First domain to scan.
url_b Yes Second domain to scan.

Outputs

Field Type Description
url_a string The first domain, as submitted.
url_b string The second domain, as submitted.
a_tech_summary string Plain-text summary of the first domain's detected stack.
b_tech_summary string Plain-text summary of the second domain's detected stack.
shared_tech string Comma-separated list of technologies found on both domains.
a_only_tech string Comma-separated list of technologies found only on the first domain.
b_only_tech string Comma-separated list of technologies found only on the second domain.
a_dns_grade string DNS configuration grade for the first domain.
b_dns_grade string DNS configuration grade for the second domain.

Example Zaps

  1. HubSpot to Slack: competitor gap alert. A deal moves to the "Demo Scheduled" stage in HubSpot (trigger). Compare Two Domains scans the prospect's domain as url_a and their named competitor as url_b. A Slack message posts to your sales channel with b_only_tech (what the competitor runs that the prospect doesn't) and shared_tech, so the rep walks in knowing the overlap.

  2. Google Sheets to Gmail: monthly stack diff. A Schedule by Zapier trigger fires on the first of each month and reads a row of domain pairs from Google Sheets, mapping the two columns to url_a and url_b. Compare Two Domains diffs the pair, then Gmail sends a digest with a_tech_summary, b_tech_summary, a_dns_grade, and b_dns_grade in the body for the analyst to review.

Limits & notes

  • Runs two scans (one per domain), so it costs two scan credits per call.
  • Each scan combines static and DNS detection. Expect the step to take tens of seconds, not milliseconds, since both domains are fetched live.
  • Grades and summaries reflect a fresh scan at run time. There is no cached or baseline diff; every call re-scans both domains.

Troubleshooting

  • Empty shared_tech, a_only_tech, or b_only_tech usually means one domain returned little detectable tech. Check that both url_a and url_b resolve and serve a real homepage, not a parked or redirect page.
  • If a domain blocks automated fetches, its *_tech_summary will be thin while its *_dns_grade still populates from DNS alone. Try the apex domain (example.com) rather than a deep path or subdomain.
Create

Watch a Domain (Create)

Adds a domain to TechSpy's daily monitoring so change triggers start firing for it. Use it when a Zap needs to begin tracking a competitor or prospect you aren't watching yet.

When to use it

  • A new competitor closes funding and you want their tech-stack changes tracked starting today.
  • A HubSpot deal reaches a stage where you monitor the account's website for buying signals.
  • You keep a list of target domains in a sheet and want each row enrolled in monitoring automatically.

Inputs

Field Required Description
url Yes The domain to monitor, labeled "Domain" in the Zap editor. TechSpy normalizes it before saving (strips protocol and path), so example.com and https://example.com/pricing resolve to the same watch.

Outputs

Field Type Description
id string The watch record ID. Use it to reference this domain in later steps.
url string The normalized domain that was saved.
watching boolean Whether the domain is now under active monitoring.
created_at datetime When the watch was created.

Example Zaps

  1. Airtable → Watch a Domain → Slack. Trigger on a new record in an Airtable "Target Accounts" base. Pass the record's website field into url. Post a Slack message to your sales channel confirming the account is now tracked, mapping the returned url and created_at into the message text.

  2. HubSpot → Watch a Domain → Google Sheets. Trigger when a HubSpot deal moves to "Evaluation." Feed the associated company domain into url. Append a row to a Google Sheets monitoring log with id, url, and watching so your team has a record of what's under watch.

Limits & notes

  • Idempotent: watching a domain that's already monitored returns the existing watch instead of creating a duplicate, so re-running the Zap is safe.
  • The action itself completes in seconds. Monitoring runs on a daily cycle, so change triggers for this domain begin on the next scan, not instantly.
  • Manage or remove watched domains in-app at Settings > Domain Monitoring.

Troubleshooting

  • Sent a full URL with https:// and a path? It still works, but the url output is normalized and will look different from your raw input. Map the returned url downstream, not the value you sent.
  • If change triggers never fire for a domain, confirm the watch exists at Settings > Domain Monitoring and that watching came back true.

Ready to automate?

Grab your API key, then build your first Zap.