Skip to main content
POST
/
intents
/
accounts
/
stack
Find companies by tech stack
curl --request POST \
  --url https://app.pipecorn.com/api/v2/intents/accounts/stack \
  --header 'Content-Type: application/json' \
  --header 'X-API-KEY: <api-key>' \
  --data '
{
  "webhook_url": "https://your-company.com/webhooks/stack",
  "stacks": [
    "shopify",
    "webflow"
  ],
  "stack_match": "or",
  "excluded_stacks": [
    "wordpress"
  ],
  "countries": [
    "US",
    "FR"
  ],
  "included_industries": [
    "2190",
    "34"
  ],
  "excluded_industries": [
    "27"
  ],
  "company_size": [
    "11-50",
    "51-200"
  ],
  "limit": 200,
  "streaming": false,
  "name": "Shopify prospects"
}
'
import requests

url = "https://app.pipecorn.com/api/v2/intents/accounts/stack"

payload = {
"webhook_url": "https://your-company.com/webhooks/stack",
"stacks": ["shopify", "webflow"],
"stack_match": "or",
"excluded_stacks": ["wordpress"],
"countries": ["US", "FR"],
"included_industries": ["2190", "34"],
"excluded_industries": ["27"],
"company_size": ["11-50", "51-200"],
"limit": 200,
"streaming": False,
"name": "Shopify prospects"
}
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
webhook_url: 'https://your-company.com/webhooks/stack',
stacks: ['shopify', 'webflow'],
stack_match: 'or',
excluded_stacks: ['wordpress'],
countries: ['US', 'FR'],
included_industries: ['2190', '34'],
excluded_industries: ['27'],
company_size: ['11-50', '51-200'],
limit: 200,
streaming: false,
name: 'Shopify prospects'
})
};

fetch('https://app.pipecorn.com/api/v2/intents/accounts/stack', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://app.pipecorn.com/api/v2/intents/accounts/stack",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'webhook_url' => 'https://your-company.com/webhooks/stack',
'stacks' => [
'shopify',
'webflow'
],
'stack_match' => 'or',
'excluded_stacks' => [
'wordpress'
],
'countries' => [
'US',
'FR'
],
'included_industries' => [
'2190',
'34'
],
'excluded_industries' => [
'27'
],
'company_size' => [
'11-50',
'51-200'
],
'limit' => 200,
'streaming' => false,
'name' => 'Shopify prospects'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-KEY: <api-key>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://app.pipecorn.com/api/v2/intents/accounts/stack"

payload := strings.NewReader("{\n \"webhook_url\": \"https://your-company.com/webhooks/stack\",\n \"stacks\": [\n \"shopify\",\n \"webflow\"\n ],\n \"stack_match\": \"or\",\n \"excluded_stacks\": [\n \"wordpress\"\n ],\n \"countries\": [\n \"US\",\n \"FR\"\n ],\n \"included_industries\": [\n \"2190\",\n \"34\"\n ],\n \"excluded_industries\": [\n \"27\"\n ],\n \"company_size\": [\n \"11-50\",\n \"51-200\"\n ],\n \"limit\": 200,\n \"streaming\": false,\n \"name\": \"Shopify prospects\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("X-API-KEY", "<api-key>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://app.pipecorn.com/api/v2/intents/accounts/stack")
.header("X-API-KEY", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"webhook_url\": \"https://your-company.com/webhooks/stack\",\n \"stacks\": [\n \"shopify\",\n \"webflow\"\n ],\n \"stack_match\": \"or\",\n \"excluded_stacks\": [\n \"wordpress\"\n ],\n \"countries\": [\n \"US\",\n \"FR\"\n ],\n \"included_industries\": [\n \"2190\",\n \"34\"\n ],\n \"excluded_industries\": [\n \"27\"\n ],\n \"company_size\": [\n \"11-50\",\n \"51-200\"\n ],\n \"limit\": 200,\n \"streaming\": false,\n \"name\": \"Shopify prospects\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://app.pipecorn.com/api/v2/intents/accounts/stack")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["X-API-KEY"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"webhook_url\": \"https://your-company.com/webhooks/stack\",\n \"stacks\": [\n \"shopify\",\n \"webflow\"\n ],\n \"stack_match\": \"or\",\n \"excluded_stacks\": [\n \"wordpress\"\n ],\n \"countries\": [\n \"US\",\n \"FR\"\n ],\n \"included_industries\": [\n \"2190\",\n \"34\"\n ],\n \"excluded_industries\": [\n \"27\"\n ],\n \"company_size\": [\n \"11-50\",\n \"51-200\"\n ],\n \"limit\": 200,\n \"streaming\": false,\n \"name\": \"Shopify prospects\"\n}"

response = http.request(request)
puts response.read_body
{
  "total_count": 0,
  "total_available": 0,
  "message": "No results found"
}
{
"message": {
"total_count": 200,
"total_available": 428,
"message": "Stack intent search started successfully. You will receive the results on your webhook shortly.",
"id": "b3f1c2d4-0000-0000-0000-000000000000"
}
}
{
"error": 123,
"message": "<string>"
}
{
"error": 123,
"message": "<string>"
}
{
"error": 123,
"message": "<string>"
}
Import the companies matching a technology-stack query. This is the second step of the two-step tech-stack search — run preview first to size the segment for free, then extract to receive the full company records on your webhook. Technographics are powered by TheirStack.

Credits and rate limits

  • Credits: 3 enrichment credits per imported company
  • Authentication: standard v2 scheme (X-API-KEY)
Extract is exempt from per-second rate limiting — the credit balance is its own throttle. If the account lacks enough enrichment credits for the companies that would be imported, the request returns 401 and no import is created.

Filters

Accepts the same filters as preview (stacks, stack_match, excluded_stacks, countries, included_industries, excluded_industries, company_size), plus:
  • webhook_url (required) — where results are POSTed
  • limit — caps how many companies are imported (and billed). Defaults to 1000, which is also the hard ceiling.
  • streaming — when true, companies are POSTed one at a time instead of in a single payload
  • name — optional import name
Resolve technology names to slugs with the Technology slug lookup endpoint.

Example request

{
  "stacks": ["shopify"],
  "stack_match": "and",
  "countries": ["US"],
  "limit": 200,
  "webhook_url": "https://your-company.com/webhooks/stack"
}

Example response

{
  "message": {
    "total_count": 200,
    "total_available": 428,
    "message": "Stack intent search started successfully. You will receive the results on your webhook shortly.",
    "id": "b3f1c2d4-0000-0000-0000-000000000000"
  }
}
  • total_available is the full match count; total_count is what will be imported (capped by limit, then the 1000 ceiling).
  • When nothing matches, the response is 200 with { "total_count": 0, ... } and no import is created.

Webhook payload

Companies are delivered to your webhook_url using the same field names as the other company imports: name, description, website, logo, industry, location, linkedin_id, linkedin_url, employee_count, employee_range. Blank fields are omitted.

Authorizations

X-API-KEY
string
header
required

Body

application/json
webhook_url
string<uri>
required

URL that receives the imported company records.

Example:

"https://your-company.com/webhooks/stack"

stacks
string[]
required

Technology slugs to match. Resolve names to slugs with GET /accounts/technologies.

Example:
["shopify", "webflow"]
stack_match
enum<string>
default:or

How stacks combine. or matches companies using any listed technology; and requires all of them.

Available options:
or,
and
Example:

"or"

excluded_stacks
string[]

Technology slugs to exclude.

Example:
["wordpress"]
countries
string[]

ISO country codes, OR-matched against the company's country.

Example:
["US", "FR"]
included_industries
string[]

LinkedIn industry IDs to include, OR-matched.

Example:
["2190", "34"]
excluded_industries
string[]

LinkedIn industry IDs to exclude.

Example:
["27"]
company_size
enum<string>[]

Company size display buckets to include.

Available options:
Self-employed,
1-10,
11-50,
51-200,
201-500,
501-1000,
1001-5000,
5001-10000,
10001+
Example:
["11-50", "51-200"]
limit
integer
default:1000

Caps how many companies are imported (and billed). Defaults to 1000, which is also the hard ceiling.

Required range: 1 <= x <= 1000
Example:

200

streaming
boolean

When true, companies are POSTed to the webhook one at a time instead of in a single payload.

Example:

false

name
string

Optional import name.

Example:

"Shopify prospects"

Response

No matching companies; no import created

total_count
integer
required
Example:

0

total_available
integer
required
Example:

0

message
string
required
Example:

"No results found"