Spaces:
Running
Running
File size: 6,627 Bytes
f595ce3 86b8634 f595ce3 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 6a19827 fc0b9f5 6a19827 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 1c74866 fc0b9f5 1c74866 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 fc0b9f5 86b8634 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | ---
title: bbconnectapi
emoji: 🏆
colorFrom: indigo
colorTo: yellow
sdk: gradio
sdk_version: 6.31.0
python_version: '3.13'
app_file: app.py
pinned: false
---
# bbcollect · bbconnectapi
Collect public bug bounty programs, published reward ranges, scopes, exclusions, and program rules from **HackerOne, Bugcrowd, Intigriti, and YesWeHack**.
**No API key. No account. No Authorization header.** The hosted API is public and supports browser requests with CORS.
- [Interactive API documentation](https://wuhp-bbconnectapi.hf.space/api/docs) — try requests in your browser
- [API reference](https://github.com/Wuhpondiscord/bbcollect/blob/main/docs/API.md) — endpoints, parameters, responses, errors, limits
- [Usage recipes](https://github.com/Wuhpondiscord/bbcollect/blob/main/docs/EXAMPLES.md) — Python, JavaScript, curl, pagination, and exports
- [Gradio app](https://huggingface.co/spaces/wuhp/bbconnectapi) · [OpenAPI JSON](https://wuhp-bbconnectapi.hf.space/api/openapi.json)
## Quick start
Base URL: **`https://wuhp-bbconnectapi.hf.space/api/v1`**
```bash
curl 'https://wuhp-bbconnectapi.hf.space/api/v1/programs?platforms=hackerone,bugcrowd&limit=10'
```
```python
import requests
base = "https://wuhp-bbconnectapi.hf.space/api/v1"
response = requests.get(f"{base}/programs", params={
"platforms": "hackerone,bugcrowd",
"search": "", "bounty_only": True, "limit": 10,
}, timeout=180)
response.raise_for_status()
page = response.json()
for program in page["programs"]:
print(program["name"], program["max_bounty"], program["currency"])
# One program's complete live document: rewards, scopes and policies.
response = requests.get(f"{base}/programs/hackerone/security", timeout=180)
response.raise_for_status()
detail = response.json()
print(detail["targets"]["in_scope"])
print(detail["targets"]["out_of_scope"])
print(detail["rules"])
```
Install the Python example dependency with `pip install requests`. REST responses are ordinary JSON; no event IDs or streaming client are required.
## What can I do?
| Endpoint | Purpose |
| --- | --- |
| `GET /programs` | Search multiple platforms, filter by bounty/currency, sort, and paginate |
| `GET /programs/{platform}/{handle}` | Live bounty tables, scopes, exclusions, and full program rules |
| `GET /programs/{platform}/{handle}/assets` | Common asset identifiers/types, with native records and all exclusions retained |
| `POST /programs/batch` | Up to 20 detail lookups in one request |
| `GET /stats` | Directory counts by platform without crawling individual policies |
| `GET /sources` | Supported sources, capabilities, and cache settings |
| `GET /health` | Cheap application readiness check |
Paths above are relative to `/api/v1`. **REST listings return summaries by default.** Add `include_details=true` to include live scopes and rules for every program on the page. Start with `limit=5` or `10`: full policies and large scopes can take much longer than summaries.
## Understand the data
| Platform | Directory | Program details |
| --- | --- | --- |
| HackerOne | Public live GraphQL, with dataset fallback | Live public policy, reward table, and paginated scope |
| Bugcrowd | Public dataset | Live public engagement brief, reward tiers, target groups, rules, safe harbor |
| Intigriti | Public dataset | Live current versions of assets, reward tables, rules, FAQs, and testing requirements |
| YesWeHack | Public dataset | Live public rules, reward grids, scopes, exclusions, and vulnerability requirements |
Directory snapshots and fallbacks come from [arkadiyt/bounty-targets-data](https://github.com/arkadiyt/bounty-targets-data). Only public metadata is collected; no target scanning or authenticated/private program data is involved. HackerOne covers the public open-program directory rather than every promotion on its Opportunities page.
- Check `ok`, `partial`, `sources`, `details_source`, and `field_status`. A partial response may retain dataset scopes while live rules are unavailable.
- `null` means unknown/unpublished/unavailable, not zero. Advertised rewards are not payout guarantees. Currency is separate; amount filters require an explicit currency.
- Most directory reward/currency fields outside HackerOne come from snapshots. Reward filters run on directory metadata **before** live detail enrichment, so values may differ from a refreshed detail document.
- Source results are cached in memory for 15 minutes; failures for 60 seconds. `fetched_at` is retrieval time, not the platform's last edit. `source_updated_at` may be unavailable.
- Always check the linked program's current rules. Asset filters retain exclusions; program rules and group instructions still apply.
## Existing Gradio clients
The Gradio API remains available without a token:
```python
from gradio_client import Client
client = Client("wuhp/bbconnectapi")
page = client.predict(["hackerone"], "", False, 10, 0, api_name="/collect")
detail = client.predict("hackerone", "security", api_name="/details")
```
`/collect` keeps exactly **five** inputs and always includes full details. `/collect_options` adds a sixth `include_details` boolean. `/scope` remains an alias for `/details`; `/sources` takes no inputs. See the [compatibility reference](https://github.com/Wuhpondiscord/bbcollect/blob/main/docs/API.md#gradio-compatibility) for raw HTTP payloads.
## Run your own instance
```bash
git clone https://github.com/Wuhpondiscord/bbcollect.git
cd bbcollect
python -m venv .venv
# Activate .venv for your shell, then:
pip install -r requirements.txt
python app.py
```
Open `http://localhost:7860`, `http://localhost:7860/api/docs`, or `http://localhost:7860/api/v1/health`. `PORT` overrides port 7860. No runtime secrets are required. [Deployment guide](https://github.com/Wuhpondiscord/bbcollect/blob/main/docs/DEPLOYMENT.md).
The hosted Space may sleep or restart; there is no uptime guarantee or persistent database. Busy REST collection requests receive `429` and a `Retry-After` header. Prefer summary pages and batch only the details you need. Cache expiration can shift offset pagination; deduplicate program IDs during long crawls.
## Contribute
Run `python -m unittest discover -s tests -v` before submitting changes. Tests cover the REST contract, filters, normalization, partial failures, and the original five-input Gradio request. New providers should preserve scopes, exclusions, native policies, and source provenance. See [CONTRIBUTING.md](https://github.com/Wuhpondiscord/bbcollect/blob/main/CONTRIBUTING.md) and [CHANGELOG.md](https://github.com/Wuhpondiscord/bbcollect/blob/main/CHANGELOG.md).
|