logo-darkPipe0

AI research

Researches the web with an agent and returns rows whose columns you define in the prompt.

ProviderBilling ModeCredentials
Cost
Docs
P
Parallel
Usage
Managed, User
Usage-based

Billed by usage: model tokens per 100-token block, plus each web search, page read and deep-research call the agent makes. Reading a site's feed or sitemap is free.

Billing

Every operation this search can bill while it runs. Model token rates are charged per 100-token block; the rest are charged per call. Hover a price for its unit.

ProviderBilling ModeConnectionCost
Ge
Gemini
research-agent-v1-in-google-low
Always
Managed, User
0.0033credits
Ge
Gemini
research-agent-v1-out-google-low
Always
Managed, User
0.0163credits
Op
OpenAI
research-agent-v1-in-openai-high
Always
Managed, User
0.0217credits
Op
OpenAI
research-agent-v1-out-openai-high
Always
Managed, User
0.13credits
Op
OpenAI
research-agent-v1-in-openai-medium
Always
Managed, User
0.0087credits
Op
OpenAI
research-agent-v1-out-openai-medium
Always
Managed, User
0.052credits
An
Anthropic
research-agent-v1-in-anthropic-high
Always
Managed, User
0.0217credits
An
Anthropic
research-agent-v1-out-anthropic-high
Always
Managed, User
0.11credits
An
Anthropic
research-agent-v1-in-anthropic-low
Always
Managed, User
0.0087credits
An
Anthropic
research-agent-v1-out-anthropic-low
Always
Managed, User
0.0433credits
Pa
Parallel
research-agent-v1-search-parallel
Always
Managed, User
0.2credits
Pa
Parallel
research-agent-v1-extract-parallel
Always
Managed, User
0.1credits
Pa
Parallel
research-agent-v1-task-parallel
Always
Managed, User
0.5credits

Output Fields

You define the output fields

This search's columns come from its own config, not from the catalog: every {% output name, type: "string" %} tag you declare in the prompt becomes one column on every row returned. The catalog therefore lists none — see the config reference below for the tag syntax.

Code Example

const options = {
  method: 'POST',
  headers: {'content-type': 'application/json', authorization: 'Bearer <TOKEN>'},
  body: JSON.stringify({
    search: {
      search_id: 'research:agent@1',
      config: {
        prompt: {
          template: 'Find every blog post published on the monitored sites in the last 14 days.\n\n{% output post_title, type: "string", description: "Exact headline of the post" %}\n{% output post_url, type: "string", format: "url", description: "Canonical URL of the post" %}\n{% output published_at, type: "string", format: "date", description: "Publish date (YYYY-MM-DD) as supplied by the publisher\'s feed. Null if no publisher date exists — never infer one from the page." %}\n{% output post_meta, type: "json", schema: "meta", description: "Author, one-sentence excerpt, and where the date came from" %}',
          json_schemas: {
            meta: {
              type: 'object',
              properties: {
                author: {type: 'string', description: 'Author name if the feed supplies one'},
                excerpt: {type: 'string', description: 'One-sentence summary of the post'},
                date_source: {type: 'string', description: '\'feed\', \'sitemap_lastmod\' or \'page\''}
              }
            }
          }
        },
        domains: ['clay.com', 'instantly.ai'],
        limit: 25,
        unique_by: ['post_url'],
        unique_match: 'all'
      }
    }
  })
};

fetch('https://api.pipe0.com/v1/search/run', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
import requests

url = "https://api.pipe0.com/v1/search/run"

payload = { "search": {
        "search_id": "research:agent@1",
        "config": {
            "prompt": {
                "template": "Find every blog post published on the monitored sites in the last 14 days.

{% output post_title, type: \"string\", description: \"Exact headline of the post\" %}
{% output post_url, type: \"string\", format: \"url\", description: \"Canonical URL of the post\" %}
{% output published_at, type: \"string\", format: \"date\", description: \"Publish date (YYYY-MM-DD) as supplied by the publisher's feed. Null if no publisher date exists — never infer one from the page.\" %}
{% output post_meta, type: \"json\", schema: \"meta\", description: \"Author, one-sentence excerpt, and where the date came from\" %}",
                "json_schemas": { "meta": {
                        "type": "object",
                        "properties": {
                            "author": {
                                "type": "string",
                                "description": "Author name if the feed supplies one"
                            },
                            "excerpt": {
                                "type": "string",
                                "description": "One-sentence summary of the post"
                            },
                            "date_source": {
                                "type": "string",
                                "description": "'feed', 'sitemap_lastmod' or 'page'"
                            }
                        }
                    } }
            },
            "domains": ["clay.com", "instantly.ai"],
            "limit": 25,
            "unique_by": ["post_url"],
            "unique_match": "all"
        }
    } }
headers = {
    "content-type": "application/json",
    "authorization": "Bearer <TOKEN>"
}

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

print(response.text)
curl --request POST \
     --url https://api.pipe0.com/v1/search/run \
     --header 'authorization: Bearer <TOKEN>' \
     --header 'content-type: application/json' \
     --data @- <<EOF
{
  "search": {
    "search_id": "research:agent@1",
    "config": {
      "prompt": {
        "template": "Find every blog post published on the monitored sites in the last 14 days.\n\n{% output post_title, type: \"string\", description: \"Exact headline of the post\" %}\n{% output post_url, type: \"string\", format: \"url\", description: \"Canonical URL of the post\" %}\n{% output published_at, type: \"string\", format: \"date\", description: \"Publish date (YYYY-MM-DD) as supplied by the publisher's feed. Null if no publisher date exists — never infer one from the page.\" %}\n{% output post_meta, type: \"json\", schema: \"meta\", description: \"Author, one-sentence excerpt, and where the date came from\" %}",
        "json_schemas": {
          "meta": {
            "type": "object",
            "properties": {
              "author": {
                "type": "string",
                "description": "Author name if the feed supplies one"
              },
              "excerpt": {
                "type": "string",
                "description": "One-sentence summary of the post"
              },
              "date_source": {
                "type": "string",
                "description": "'feed', 'sitemap_lastmod' or 'page'"
              }
            }
          }
        }
      },
      "domains": [
        "clay.com",
        "instantly.ai"
      ],
      "limit": 25,
      "unique_by": [
        "post_url"
      ],
      "unique_match": "all"
    }
  }
}
EOF
package main

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

func main() {

	url := "https://api.pipe0.com/v1/search/run"

	payload := strings.NewReader("{\"search\":{\"search_id\":\"research:agent@1\",\"config\":{\"prompt\":{\"template\":\"Find every blog post published on the monitored sites in the last 14 days.\\n\\n{% output post_title, type: \\\"string\\\", description: \\\"Exact headline of the post\\\" %}\\n{% output post_url, type: \\\"string\\\", format: \\\"url\\\", description: \\\"Canonical URL of the post\\\" %}\\n{% output published_at, type: \\\"string\\\", format: \\\"date\\\", description: \\\"Publish date (YYYY-MM-DD) as supplied by the publisher's feed. Null if no publisher date exists — never infer one from the page.\\\" %}\\n{% output post_meta, type: \\\"json\\\", schema: \\\"meta\\\", description: \\\"Author, one-sentence excerpt, and where the date came from\\\" %}\",\"json_schemas\":{\"meta\":{\"type\":\"object\",\"properties\":{\"author\":{\"type\":\"string\",\"description\":\"Author name if the feed supplies one\"},\"excerpt\":{\"type\":\"string\",\"description\":\"One-sentence summary of the post\"},\"date_source\":{\"type\":\"string\",\"description\":\"'feed', 'sitemap_lastmod' or 'page'\"}}}}},\"domains\":[\"clay.com\",\"instantly.ai\"],\"limit\":25,\"unique_by\":[\"post_url\"],\"unique_match\":\"all\"}}}")

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

	req.Header.Add("content-type", "application/json")
	req.Header.Add("authorization", "Bearer <TOKEN>")

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

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

	fmt.Println(string(body))

}
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.pipe0.com/v1/search/run', [
  'body' => '{"search":{"search_id":"research:agent@1","config":{"prompt":{"template":"Find every blog post published on the monitored sites in the last 14 days.\\n\\n{% output post_title, type: \\"string\\", description: \\"Exact headline of the post\\" %}\\n{% output post_url, type: \\"string\\", format: \\"url\\", description: \\"Canonical URL of the post\\" %}\\n{% output published_at, type: \\"string\\", format: \\"date\\", description: \\"Publish date (YYYY-MM-DD) as supplied by the publisher\'s feed. Null if no publisher date exists — never infer one from the page.\\" %}\\n{% output post_meta, type: \\"json\\", schema: \\"meta\\", description: \\"Author, one-sentence excerpt, and where the date came from\\" %}","json_schemas":{"meta":{"type":"object","properties":{"author":{"type":"string","description":"Author name if the feed supplies one"},"excerpt":{"type":"string","description":"One-sentence summary of the post"},"date_source":{"type":"string","description":"\'feed\', \'sitemap_lastmod\' or \'page\'"}}}}},"domains":["clay.com","instantly.ai"],"limit":25,"unique_by":["post_url"],"unique_match":"all"}}}',
  'headers' => [
    'authorization' => 'Bearer <TOKEN>',
    'content-type' => 'application/json',
  ],
]);

echo $response->getBody();
POST /v1/search/run HTTP/1.1

Content-Type: application/json

Authorization: Bearer <TOKEN>

Host: api.pipe0.com

Content-Length: 1083



{"search":{"search_id":"research:agent@1","config":{"prompt":{"template":"Find every blog post published on the monitored sites in the last 14 days.\n\n{% output post_title, type: \"string\", description: \"Exact headline of the post\" %}\n{% output post_url, type: \"string\", format: \"url\", description: \"Canonical URL of the post\" %}\n{% output published_at, type: \"string\", format: \"date\", description: \"Publish date (YYYY-MM-DD) as supplied by the publisher's feed. Null if no publisher date exists — never infer one from the page.\" %}\n{% output post_meta, type: \"json\", schema: \"meta\", description: \"Author, one-sentence excerpt, and where the date came from\" %}","json_schemas":{"meta":{"type":"object","properties":{"author":{"type":"string","description":"Author name if the feed supplies one"},"excerpt":{"type":"string","description":"One-sentence summary of the post"},"date_source":{"type":"string","description":"'feed', 'sitemap_lastmod' or 'page'"}}}}},"domains":["clay.com","instantly.ai"],"limit":25,"unique_by":["post_url"],"unique_match":"all"}}}