> For the complete documentation index, see [llms.txt](https://ai-os-and-trend-finder.gitbook.io/ai-os-and-trend-finder-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ai-os-and-trend-finder.gitbook.io/ai-os-and-trend-finder-docs/docs/sources/source-compliance-producthunt.md).

# Source Compliance: Product Hunt

> Implementation-time review completed 2026-05-17. Trend Finder has a configured Apify source declaration for public Product Hunt launch metadata. No direct Product Hunt API adapter is implemented in this session.

***

## Source Overview

| Field             | Value                                                                |
| ----------------- | -------------------------------------------------------------------- |
| Source Name       | Product Hunt                                                         |
| API Base URL      | `https://api.producthunt.com/v2/api/graphql`                         |
| API Documentation | <https://www.producthunt.com/v2/docs>                                |
| Rate Limit Docs   | <https://api.producthunt.com/v2/docs/rate\\_limits/headers>          |
| Authentication    | Access token; OAuth client-only token can read public endpoints      |
| Data Format       | GraphQL JSON                                                         |
| Adapter Status    | Configured Apify source declaration; reviewed metadata-only boundary |

***

## Phase 06 Candidate Declaration

| Field                   | Value                                                                                |
| ----------------------- | ------------------------------------------------------------------------------------ |
| Source ID               | `producthunt-ai-launches`                                                            |
| Primary Apify candidate | `muzafferkadir/product-hunt-leaderboard`                                             |
| Fallback candidate      | `thirdwatch/producthunt-scraper`                                                     |
| Validation status       | Fixture-backed and live tiny-validated on 2026-05-17; rerun is credential-gated      |
| Direct adapter status   | Deferred; non-commercial scope or Product Hunt permission required before direct use |

## 2026-05-27 Alternative Review

The Product Hunt replacement follow-up did not change the active source declaration. Keep `muzafferkadir/product-hunt-leaderboard` as the primary and `thirdwatch/producthunt-scraper` as the declared fallback until a capped tiny validation run proves a replacement normalizes into the same public launch metadata boundary.

Reviewed alternative notes:

* `thirdwatch/producthunt-scraper` exposes `scrapeType`, `startDate`, `endDate`, and `maxPerDay` for leaderboard-style historical ranges, but it also documents broader launches/products modes and a residential-proxy default. Validate it privately before switching the runtime Actor.
* `logiover/product-hunt-daily-launches-scraper` exposes `mode`, `date`, `dateFrom`, `dateTo`, `topic`, `sortBy`, `maxPosts`, and `scrapeComments`. Comments default off, but advertised maker profiles, media, and optional comments remain excluded fields.
* `crawlerbros/producthunt-scraper` has a no-token `dailyLeaderboard` path, but richer topic/user/product modes require a Product Hunt API token and can include maker, hunter, and media fields. Treat it as research-only unless token use and field exclusions are separately approved.

Do not add a new Product Hunt Actor to starter config or private demo config without fixture-backed normalization, redaction tests, capped tiny validation, and this compliance doc being updated with the selected input and output shape.

## 2026-06-18 Direct Atom Feed Decision

TrendHustler uses `https://www.producthunt.com/feed` as a no-token Atom feed. Trend Finder is not adopting that direct feed in this session.

Decision: decline the direct Product Hunt feed adapter and keep Product Hunt on the reviewed Apify path until Product Hunt grants permission or a separate terms review approves automated feed use for this project.

Rationale:

* Product Hunt's public Terms of Service restrict non-commercial/internal use and prohibit crawling, scraping, or spidering Product Hunt pages, data, or service content by manual or automated means.
* The existing Trend Finder Product Hunt review already treats direct API work as deferred until non-commercial scope or Product Hunt permission is confirmed.
* The public Atom feed exposes useful launch metadata, but the compliance boundary is not clear enough to make it a default direct adapter.

The reviewed `producthunt-ai-launches` Apify source remains the active Product Hunt path. It stays capped, metadata-only, and subject to the existing normalizer tests and historical-window limits.

***

## Terms of Service

Product Hunt API 2.0 provides GraphQL access to Product Hunt data with token-based authentication. The official API docs state that the API must not be used for commercial purposes by default and asks business users to contact Product Hunt. Product Hunt also asks projects to include attribution linking back to Product Hunt.

**Key obligations for the configured source and any future direct adapter**:

* Use the official GraphQL API; do not scrape launch pages.
* Store API tokens only in `.env.local` or the shell environment.
* Keep the adapter read-only and public-data-only.
* Do not use the API for commercial purposes unless Product Hunt grants permission.
* Attribute Product Hunt and link to canonical Product Hunt launch pages.
* Keep GraphQL queries small enough to remain within complexity limits.

***

## Rate Limits

| Parameter                   | Value                                                                |
| --------------------------- | -------------------------------------------------------------------- |
| GraphQL complexity limit    | 6,250 complexity points every 15 minutes                             |
| Other `/v2/*` request limit | 450 requests every 15 minutes                                        |
| Limit response              | `429 Too Many Requests` until reset                                  |
| Required headers            | `X-Rate-Limit-Limit`, `X-Rate-Limit-Remaining`, `X-Rate-Limit-Reset` |
| Required implementation     | Header-aware pacing, query complexity budget, stop-on-limit behavior |

A future adapter must avoid broad nested GraphQL queries. Query only the fields needed for trend evidence and source summaries.

***

## Data Collection Boundary

Approved for the current configured metadata-only source boundary:

| Data Element  | GraphQL Field            | Stored As        | PII Risk |
| ------------- | ------------------------ | ---------------- | -------- |
| Product name  | post/product name fields | Evidence title   | None     |
| Tagline       | post tagline field       | Evidence summary | Low      |
| Launch URL    | Product Hunt URL field   | Evidence URL     | None     |
| Launch date   | post date field          | `publishedAt`    | None     |
| Vote count    | votes/upvotes field      | Relevance input  | None     |
| Comment count | comments count field     | Relevance input  | None     |
| Topics        | topic fields             | Topic hints      | None     |

**Not approved**: comment bodies, voter identities, maker profile details, user emails, private user data, write scopes, or any non-public Product Hunt data.

***

## Data Retention

| Policy               | Value                                                                                             |
| -------------------- | ------------------------------------------------------------------------------------------------- |
| Storage location     | `src/data/live-data.json`, private snapshots, and explicit private backtest archives              |
| Retention period     | `live-data.json` overwritten on each collection run; private cache retained locally until deleted |
| Historical retention | Supported only through script-side backtest archives for reviewed bounded windows                 |
| Deletion path        | Delete generated Trend Finder data, snapshots, and backtest archives                              |
| Backup               | None                                                                                              |

***

## Phase 14 Historical Window Stance

| Field                  | Value                                      |
| ---------------------- | ------------------------------------------ |
| Historical support     | Supported for bounded launch-date windows  |
| Source ID              | `producthunt-ai-launches`                  |
| Safe override fields   | `dateFrom`, `dateTo`                       |
| Reviewed bounds        | 1 to 31 inclusive days                     |
| Compliance declaration | `historicalWindowSupport.supported = true` |

The reviewed Apify input already contains explicit `dateFrom` and `dateTo` fields for Product Hunt launch metadata. Historical collection may override only those two fields after the requested UTC window passes the reviewed bounds. It may not override query terms, topics, product URLs, delivery settings, webhooks, limits, dry-run flags, or any identity/comment/maker fields.

This stance approves only bounded source input for script-side collection. The backtest CLI may write private archives under `.cache/extensions/trend-finder/backtests/` and may publish only a bounded aggregate summary when explicitly requested. It does not approve direct API backfill or browser-visible historical evidence output.

***

## Privacy and GDPR Assessment

| Criterion                 | Status               | Notes                                     |
| ------------------------- | -------------------- | ----------------------------------------- |
| PII collected             | Planned no           | Avoid users, makers, voters, and comments |
| User consent needed       | No app users         | Public launch metadata only               |
| Data subject rights       | Deletion path exists | Delete generated Trend Finder data/cache  |
| Cross-border transfer     | N/A                  | Data remains local                        |
| Data processor agreements | N/A                  | No third-party processing by Trend Finder |
| Legitimate interest basis | Needs review         | API commercial-use restriction may matter |

***

## Attribution

When Product Hunt-sourced evidence is displayed, the UI must show:

* Source identifier: `producthunt-ai-launches`
* Source name: "Product Hunt AI launches"
* Link to the original Product Hunt launch page
* Product name and launch date when stored

***

## Implementation Notes

* Phase 06 Session 01 declares `producthunt-ai-launches` with reviewed primary and fallback Apify Actor candidates.
* Phase 06 Session 02 adds fixture-backed normalizer coverage for launch URLs, names, taglines, upvotes, comments, categories, launch dates, and profile field exclusion. The 2026-05-17 live tiny validation returned 5 items and 5 public URLs for the configured source.
* The Apify source JSON file or inline override may provide an Actor for this source, but collection still requires `APIFY_TOKEN` in the script environment and must avoid known unresolved placeholder Actor IDs.
* Direct Product Hunt API work still requires non-commercial scope confirmation or Product Hunt permission.
* Normalized evidence must link to canonical Product Hunt launch or product URLs, not Apify Actor or Dataset URLs.

***

## Compliance Checklist

* [x] API docs and rate-limit docs reviewed
* [x] Rate limits documented
* [x] Data retention policy drafted
* [x] PII minimization boundary drafted
* [x] Attribution requirements documented
* [x] Implementation-time terms re-review completed on 2026-05-17
* [x] Configured source compliance gate documented
* [x] Phase 06 primary and fallback Apify candidates recorded
* [x] Phase 06 fixture-backed normalizer validation completed
* [x] Live tiny capped Phase 06 Actor/Dataset validation completed on 2026-05-17
* [x] Phase 14 historical-window stance recorded with safe fields and bounds
* [x] 2026-06-18 direct Atom feed decision recorded as declined pending permission
* [ ] Commercial-use approval or non-commercial scope confirmed for direct API use
* [ ] Direct adapter enforces rate limits
* [ ] Direct adapter tests prove PII exclusions

***

*This document must be reviewed again before adding a direct Product Hunt API adapter or broadening collected fields.*


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://ai-os-and-trend-finder.gitbook.io/ai-os-and-trend-finder-docs/docs/sources/source-compliance-producthunt.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
