From b7e76c34e3388101bae7110353ee7345eeac31e7 Mon Sep 17 00:00:00 2001 From: Kevin Wang Date: Fri, 4 Sep 2026 12:59:22 -0700 Subject: [PATCH 1/2] Add AnyAPI integration Co-Authored-By: Claude Opus 5 (1M context) --- integrations/anyapi.md | 171 +++++++++++++++++++++++++++++++++++++++++ logos/anyapi.png | Bin 0 -> 17307 bytes 2 files changed, 171 insertions(+) create mode 100644 integrations/anyapi.md create mode 100644 logos/anyapi.png diff --git a/integrations/anyapi.md b/integrations/anyapi.md new file mode 100644 index 00000000..6286884c --- /dev/null +++ b/integrations/anyapi.md @@ -0,0 +1,171 @@ +--- +layout: integration +name: AnyAPI +description: One key and one USD wallet for hundreds of data and scraping APIs, with free discovery components and five agent tools. +authors: + - name: AnyAPI + socials: + github: getanyapi-com +repo: https://github.com/getanyapi-com/integrations/tree/main/anyapi-haystack +report_issue: https://github.com/getanyapi-com/integrations/issues +type: Tool Integration +logo: /logos/anyapi.png +version: Haystack 2.0 +toc: true +--- + +### Table of Contents + +- [Overview](#overview) +- [Installation](#installation) +- [Usage](#usage) + - [Components](#components) + - [In a pipeline](#in-a-pipeline) + - [In an agent](#in-an-agent) + - [Pricing](#pricing) + - [Errors](#errors) +- [License](#license) + +## Overview + +[AnyAPI](https://getanyapi.com) is a marketplace for data and scraping APIs behind one key and +one USD wallet: Reddit, Instagram, TikTok, YouTube, X, LinkedIn, Facebook, Google search results, +Google Maps, Amazon, and clean JSON out of pages that block a plain fetch. Every API publishes a +normalized input and output JSON Schema, billing is pay per request in USD with no subscription, +and the provider is reported as AnyAPI. + +`anyapi-haystack` is a thin adapter over the official +[`getanyapi`](https://pypi.org/project/getanyapi/) Python SDK. HTTP, authentication, retries, +pricing, and schema handling belong to that SDK and to the gateway behind it, so this package +adds no second source of truth for a price. + +AnyAPI publishes hundreds of APIs. One component per API would exhaust an agent's context window +before it asked its first question, so this integration instead exposes the five that make up the +AnyAPI MCP server's discovery-then-run loop: search or list to find an API, describe it to read +its strict input schema, then run it. + +Documentation lives at [getanyapi.com/docs](https://getanyapi.com/docs). Get a key at +[getanyapi.com](https://getanyapi.com) and set it once: + +```bash +export ANYAPI_API_KEY="..." +``` + +## Installation + +The package is not on PyPI yet. Install it from its directory in the source repository: + +```bash +pip install "git+https://github.com/getanyapi-com/integrations.git#subdirectory=anyapi-haystack" +``` + +It requires Python 3.10 or newer and installs `haystack-ai` and the `getanyapi` SDK. + +## Usage + +### Components + +Five components, imported from `haystack_integrations.components.connectors.anyapi`. Only +`AnyAPIRunAPI` spends anything. + +| Component | Tool name | Charges? | +| --- | --- | --- | +| `AnyAPISearchAPIs` | `anyapi_search_apis` | no | +| `AnyAPIListAPIs` | `anyapi_list_apis` | no | +| `AnyAPIGetAPI` | `anyapi_get_api` | no | +| `AnyAPIRunAPI` | `anyapi_run_api` | yes | +| `AnyAPIGetBalance` | `anyapi_get_balance` | no | + +Each one publishes its result as separate output sockets rather than one blob, so a pipeline can +wire each part where it belongs. `AnyAPIGetAPI` publishes `api`, plus `input_schema` (the input to +the next step of the loop) and `pricing` (what you read to bound spend). `AnyAPIRunAPI` publishes +`data`, `found`, `cost_usd`, `items`, `provider`, `result_id`, and `error`. + +Every component takes an optional `api_key` as a Haystack `Secret`, defaulting to +`Secret.from_env_var("ANYAPI_API_KEY")`. Every component also implements `run_async` on the SDK's +async client, and `to_dict` / `from_dict`, so a pipeline containing them serializes to YAML with +the key kept as a `Secret` reference rather than a value. + +### In a pipeline + +Read the strict input schema and the price ceiling first, then run the API and hand its payload +straight to a downstream component. Input schemas are strict, so an unknown field is rejected +rather than ignored, and an input built from a description instead of a schema usually fails. + +```python +import json + +from haystack import Pipeline +from haystack.components.converters import OutputAdapter + +from haystack_integrations.components.connectors.anyapi import AnyAPIGetAPI, AnyAPIRunAPI + +SLUG = "reddit.trending_posts" + +described = AnyAPIGetAPI().run(slug=SLUG) +if described["error"] is not None: + raise SystemExit(f"could not describe {SLUG}: {described['error']}") +print("input schema:", json.dumps(described["input_schema"], indent=2)) +print("ceiling for any run, USD:", described["pricing"]["failoverMaxUsd"]) + +pipe = Pipeline() +pipe.add_component("anyapi", AnyAPIRunAPI()) +pipe.add_component("titles", OutputAdapter("{{ data.posts | map(attribute='title') | list }}", list)) +pipe.connect("anyapi.data", "titles.data") + +result = pipe.run({"anyapi": {"slug": SLUG, "input": {"limit": 2}}}) +run = result["anyapi"] +if run["error"] is not None: + raise SystemExit(f"run failed: {run['error']}") + +print("provider:", run["provider"], "items:", run["items"], "costUsd:", run["cost_usd"]) +print("titles:", result["titles"]["output"]) +``` + +### In an agent + +`anyapi_tools()` returns the same five as `ComponentTool`s carrying the AnyAPI MCP server's own +tool descriptions, and `ANYAPI_INSTRUCTIONS` is the system prompt that teaches the loop. + +```python +from haystack.components.agents import Agent +from haystack.components.generators.chat import OpenAIChatGenerator +from haystack.dataclasses import ChatMessage + +from haystack_integrations.tools.anyapi import ANYAPI_INSTRUCTIONS, anyapi_tools + +agent = Agent( + chat_generator=OpenAIChatGenerator(model="gpt-4o-mini"), + tools=anyapi_tools(), + system_prompt=ANYAPI_INSTRUCTIONS, +) + +result = agent.run(messages=[ChatMessage.from_user("What is trending on r/python right now?")]) +print(result["messages"][-1].text) +``` + +Each tool is also importable on its own, as `AnyAPISearchAPIsTool`, `AnyAPIListAPIsTool`, +`AnyAPIGetAPITool`, `AnyAPIRunAPITool`, and `AnyAPIGetBalanceTool`. + +### Pricing + +Prices are USD and are never scaled by this package. `AnyAPIGetAPI` publishes `pricing`, where +`pricing.from.maxUsd` is the most a first-choice run is billed and `pricing.failoverMaxUsd` is the +ceiling for any run, so spend is bounded before the call. A completed call reports its actual +charge on the `cost_usd` socket, and `AnyAPIGetBalance` reports the remaining wallet balance in +USD. Response shaping through `fields`, `max_items`, or `summary` never changes the charge. + +### Errors + +Every AnyAPI failure is caught at the component boundary and returned on the `error` socket as +`{"error": ..., "status": ..., "code": ..., "requestId": ...}`, so a failed call gives the agent +something recoverable instead of aborting the run. On that path the unknowable sockets are `None` +rather than a fabricated zero. Anything that is not an AnyAPI error propagates. + +## License + +`anyapi-haystack` is licensed under the +[MIT License](https://github.com/getanyapi-com/integrations/blob/main/LICENSE). + +Questions or problems: [support@getanyapi.com](mailto:support@getanyapi.com), or open an issue at +[getanyapi-com/integrations](https://github.com/getanyapi-com/integrations/issues). diff --git a/logos/anyapi.png b/logos/anyapi.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1431e5068567c0841bb97b2f1824df89a2c4e1 GIT binary patch literal 17307 zcmY*>2{@F|_y0R~k$p{;?3D}&rDc$0jZ~KGgtC{N7?MmV`@ZiYOG&Z}Doe6u&pM(o z)`qc-G4sFE_xt@n&#&j{srNniJ@?#m?>Xn*bI)g98s55j{Md^UWk`?f73V~)txKVt^PwJSL>e6`mD&LGhggW zD$igI3Y+X>8VL(w6I_T`(Ll=vZ8(@SRdhDy=pYxVqZZkq_sv0( zux4aHe&bK3k#kmMIXmignxtQ0s7Iq$!kZ1RE<`xL2~avn9?V}fbI36p8qkN9SytCF5OQad>O(v(=m5hqn(|(z*k}U2WtUm$w|}N zaJ-j*&6lU%zDHz*8H*Bg3~PZJE|ZCUkbA+&5&wHc#BXv$WKSNubV*h128L;*+p0{c za9K>0=d;KOJk<^gd*jH|VFsa#Sc1)lo1{+-KkeEIFViJDs%hwzS(OD6AzG(Nu))><+YK2+%xrwiX*TxZ(tusfr2z&^`WZ`B5s7`Z50S!}$^l_3iLEd| zbtB5K6bKy25k7bahdzHFurfQNH+5a(!|1ZMLUG&xwOoKBmUUmv`-8A%b&vH=6v{MC z4L|uIYDKJ1!J;uH)J0}!bNiV^GH+RZ2mFDCMpm3vo@n*?dXYQD7`UZzTOi)IYU@G@Zsk&q63dWaa zS^P5!h_`(r?Z~2F+ppq2&Tq(pDeA**)?or0`#VFlA^LZpac+E-wcKqU>|T0(2;2}o z#LFov+UPjq5lC&S@lD=03q855zLQ3zeU3uOuF|eN@^E**iEX5#wMqHA^R?^-p+HTe z{lRjCbGS+V>$ob9xXATAHzI1H#Dt(up#Wnd#P(N_>9K+I=5oaajwQkx)jHNEQK&Rm zAb?#-lJ5A`pC1Y^Fz*8~QM*eB#(mqnr!C1wF|++lUQP#U7o>ybMMUi;V_x(=*;w z$^A=JTx6gmDmowZYNe#_&8%hPElCdeUF#jHQAuP1_+(TmFn@B{MB`9*yhr0#H|1g!DcoGV=9HVw&E@H(LOTbqwmL}P4tOc9hxiX;9y(?!6 zyoy#UM*Z_u?h(aLiHg1`mLt6O&aUG?#Jrxo@KBvV174PM@EuQ2cN^LnYYZU8?B3L9 zZx_&@e#=?IkBDh`z;lZYaT>+wH}=wpP^3F18Wn)Qp-+hO8eg7Z62K#aYj2ScZ`TDb zs$IebeTCOL+Fpi#TTj$hu*&n@rW!pHe4Z_FBLq`EzN*ap5SrrS8@aEzyBcY|HZ(r{ zPA%7KR3-Sw#H*LAbXH|bdWLR{CvO#@p4pP;R#)N%Cn%Nv42@aDn7>XzW} zYeae%4t|Da)f*J=l&j4toNY;F1->uY{b_qqPbNY<;^VH`QPbh%&Sxj(l}E{2dnwj3 z;maMA#iJ$3O|if5Wm%l&O}$TCNUbvsibn*e`VSoo3`Ls?tqg%-gv2+m(u)@82P1}F zy-M@O?nYjayI8an4)?}JZC*fOyh!3Z>ONMI-TukWO2bENx@S9thrV(4H2M5Ve>K0C zi@3co$tM`6EqeLnCub>5qF9P?|P4q4ll{A|r!ah3ObIZ-yLo3ejl_GAT z4J}i(sjMPY)Enj56Jn zC3 zKBU71HLxw*KcNxyAj>9&6e_IQQzUR){-qHS7S(keIa^kGxu!alx9m@ltUoTCe+mRT z3v8#lUcu9Cdg*IO|FW5veG#BjWqXC;vnI%C)&g1V3w6DW<^$@a*Q=Wo(jl?2kJxu0n19$YhKgFfOac$83p`Km|{k=z{ln zS$bI*3JMjJfI%V%wj(mLawx_pt-~kw7g-H83G^@UCwu(3@KmE8D6TT|9WC6@L`(UY z-BuJi55LVO;&b7`-l~D{Z7~uv-^_AC%<=u&Ld&%6Sko(~NznT%c=gm#1?pzioeZ@- zrRF2@jYfI4M9~i6HWt~&{#~`O!R#*`i2B&4Vj_~)TMnpyUbiO4&F+l^;+DQVyv0

`ia$C`2gw>EV_m&Z)hO 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

x(*ZrY7aauD3rNcfsTRUu?!ok4R!FI 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 my=x!~oD+(2k#Xr Date: Fri, 4 Sep 2026 13:24:19 -0700 Subject: [PATCH 2/2] Add pypi field for anyapi-haystack now that 0.1.0 is published The package is live on PyPI, so the frontmatter carries pypi alongside repo and the installation section is a plain pip install instead of the git-subdirectory workaround. --- integrations/anyapi.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/integrations/anyapi.md b/integrations/anyapi.md index 6286884c..7d50f225 100644 --- a/integrations/anyapi.md +++ b/integrations/anyapi.md @@ -6,6 +6,7 @@ authors: - name: AnyAPI socials: github: getanyapi-com +pypi: https://pypi.org/project/anyapi-haystack/ repo: https://github.com/getanyapi-com/integrations/tree/main/anyapi-haystack report_issue: https://github.com/getanyapi-com/integrations/issues type: Tool Integration @@ -53,10 +54,8 @@ export ANYAPI_API_KEY="..." ## Installation -The package is not on PyPI yet. Install it from its directory in the source repository: - ```bash -pip install "git+https://github.com/getanyapi-com/integrations.git#subdirectory=anyapi-haystack" +pip install anyapi-haystack ``` It requires Python 3.10 or newer and installs `haystack-ai` and the `getanyapi` SDK.