# Building Permit Lead Finder — ProjectTrigger (`ayalalabs/projecttrigger`) Actor

Turns official public building-permit data into ranked, explainable opportunity signals for the service you sell.

- **URL**: https://apify.com/ayalalabs/projecttrigger.md
- **Developed by:** [Jocsan Ayala](https://apify.com/ayalalabs) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1,500.00 / 1,000 opportunity searches

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Building Permit Lead Finder — ProjectTrigger

*Project intelligence for businesses that sell into construction.*

**Find construction projects likely to need what you sell.**

ProjectTrigger analyzes official public building permits, matches projects against your service, and ranks them with explainable 0–100 opportunity relevance scores.

Instead of searching through hundreds of permits manually, tell ProjectTrigger what you sell and get the most relevant projects first.

***

### Example opportunity

Taken from a real run against City of Orlando public permit data:

> **Opportunity Relevance Score: 99/100 — Grade A**
>
> **Project:** Commercial new construction valued at $48.2M
> **Address:** Storey Park II — Apartments, Orange County
> **Permit activity:** 1 day ago
> **Contractor:** UES Professional Solutions, LLC — (407) 234-5187
> **Best match:** Construction progress photography
>
> **Why ProjectTrigger ranked it highly**
>
> - Strong drone/aerial match: new construction, multifamily
> - Estimated project value exceeds $48.2M
> - Permit activity occurred yesterday
> - Multifamily development
> - Contact details available: contractor name, phone, project owner

Every result carries its own reasons. There is no score you cannot account for.

***

### How ProjectTrigger is different from a permit scraper

| A generic permit scraper | ProjectTrigger |
|---|---|
| Returns permit rows | Asks what service you sell |
| You filter manually | Evaluates every project for **your** trade |
| Same results regardless of your business | Produces a 0–100 opportunity relevance score |
| No relevance score | Explains exactly why each project ranked where it did |
| No recommendation | Recommends the specific work to pitch |
| Arbitrary order | Ranks your strongest prospects first |

The same $48M apartment build scores **99 for a drone operator** and **39 for a solar installer**, because nothing in it mentions photovoltaics. That difference is the product.

***

### Building permit leads for roofing contractors

Roofing companies use ProjectTrigger to find **reroof, roof replacement and commercial roofing** permits days after they are filed — plus major renovations and new construction where a roof is part of the scope.

The roofing profile treats a $75,000 job as significant, because it is. Project value is scored on a curve tuned per trade rather than one generic scale, so a serious commercial reroof is not buried under a distribution centre it has nothing to do with.

### Building permit leads for HVAC companies

HVAC and mechanical contractors get **HVAC, mechanical, chiller, air-conditioning, rooftop unit, ductwork and ventilation** permits, alongside new commercial construction and major renovations where mechanical work is implied.

Permits from other trades are actively penalised — a reroof will not appear at the top of an HVAC search.

### Building permit leads for solar companies

Solar installers get **photovoltaic and solar installation** permits, plus electrical service upgrades and commercial development that plausibly precede a solar conversation.

Generic electrical work deliberately does **not** score as a solar lead. If a search returns very little, that is usually the honest answer for the month rather than a failure — Orlando processes few solar permits in a typical 30-day window.

### Construction leads for drone service providers

Drone and aerial service providers get **new construction, multifamily, warehouses, distribution centres, site work and major development** — the projects that commission construction-progress imaging and aerial documentation.

Recommendations are specific: a large new build returns *construction progress photography* and *development progress monitoring*, while a reroof returns *roof inspection imagery* instead.

### Post-construction cleaning leads

Commercial cleaning companies get **tenant buildouts, restaurant and retail openings, commercial renovations and new construction** — the stage where post-construction cleanup and opening preparation get contracted.

### Security and low-voltage project leads

Security and low-voltage installers get **access control, security camera, CCTV, alarm, structured cabling and low-voltage** permits, plus commercial buildouts and new construction where those systems are specified.

### Custom services

Not on the list? Choose **Custom Service**, describe what you do, and add keywords. Your keywords become the strong matching signals, and exclusions drop projects you never want to see.

***

### How scoring works

Scoring is **deterministic and rule-based**. There is no machine learning, no LLM and no black-box confidence anywhere in it. The same permit and the same settings always produce the same result, and every point is attributable to a rule you can read.

| Category | Max | The question it answers |
|---|---|---|
| **Service match** | 30 | Does the permit describe the work you sell? |
| **Project value** | 25 | Is it big enough to be worth pursuing? |
| **Recency** | 20 | Did this happen recently enough to still be actionable? |
| **Project attractiveness** | 10 | Is it the kind of property your trade sells to? |
| **Contactability** | 10 | Is there a named contractor, a phone number, an owner? |
| **Data completeness** | 5 | How much of the public record is actually filled in? |

Match tiers do not stack — a permit matching both strong and medium signals is a strong match worth 30, not 50. Explicit penalties then subtract: administrative paperwork (−15), a project that looks already completed (−20), a permit from a different trade (−12), and a relevance deduction when a permit shows only generic signals (−12) or none at all (−30) for your service. The final score is clamped to 0–100.

#### What the score actually means

This matters, so it is stated plainly.

**A score of 94 means:** *according to ProjectTrigger's published deterministic rules, this permit strongly matches the service you selected, across the six categories above.*

**A score of 94 does not mean:**

- a 94% chance the project will hire you
- a 94% chance anyone will answer the phone
- that the project is available, unawarded, or looking for bids
- that the data behind it is accurate or current

It is a **relevance** measure, not a probability. Nothing in it is derived from historical conversion data, because no such data exists — the score is arithmetic over what a public permit record says, nothing more. If ProjectTrigger ever does publish a conversion figure, it will be labelled as one and sourced.

The field is called `opportunityRelevanceScore` rather than "lead score" for exactly this reason: a lead score implies a prediction about a person's behaviour, and this predicts nothing.

#### What the grades mean

Grades are a shorthand for the score band, carrying the same meaning and the same limits.

| Grade | Score | Reading |
|---|---|---|
| **A** | 90–100 | Matches your service on several dimensions |
| **B** | 80–89 | Matches on most dimensions |
| **C** | 70–79 | Partial match |
| **D** | 60–69 | Weak match |
| **Low** | below 60 | Little or no match on the recorded signals |

***

### Current coverage

**Markets: Orlando FL and Brevard County FL.** Orlando is an official open-data API and answers in seconds; Brevard is read from a public permit portal and takes minutes. *Central Florida* searches both together and ranks them as one list.

This is **not** a nationwide permit database. Additional markets are added as reliable public permit sources are validated — most Central Florida jurisdictions publish permits only through interactive portals with no data feed, and ProjectTrigger names every one it could not search in each run's summary rather than quietly returning a short list.

| Jurisdiction | Status |
|---|---|
| Orlando, FL | Searched — official open-data API, refreshed daily |
| Brevard County, FL | Searched — public permit portal, one request per permit (slower) |
| Orange County (unincorporated), Osceola, Volusia, Seminole, Lake, Polk | No public permit data feed |

***

### Data source and trust

Records originate from **government and public permit datasets**:

- **City of Orlando Open Data**, dataset [`ryhf-m453`](https://data.cityoforlando.net/d/ryhf-m453), via the official Socrata API
- **Brevard County** public permit portal

Every result links back to the official record it came from.

What that means in practice:

- **Source fields vary in completeness.** Missing data is flagged, never invented or guessed.
- **Project value is declared or estimated**, not final cost. Orlando records "not stated" as `0` or `1`; ProjectTrigger treats those as unknown rather than as cheap.
- **Contractor information is sometimes missing.** Where a contractor is named but their phone is not, ProjectTrigger looks up the number that contractor published on their *other* permits in the same official dataset — raising phone coverage on recent Orlando permits from roughly 46% to 65%. Every recovered number is labelled with the date it was last published.
- **Permit activity does not guarantee an available contract.**

ProjectTrigger publishes companies, contractors and project entities. It does not surface private individuals' names or personal email addresses, and there is no email discovery, no third-party enrichment and no automated outreach.

***

### Limitations

**ProjectTrigger identifies business signals, not guaranteed customers.**

A high opportunity relevance score does **not** guarantee that:

- the project needs your service
- the contractor is seeking vendors
- a contract is available
- the project is still active
- outreach will succeed

Other limits worth knowing:

- **Coordinates are almost always missing.** Orlando has geocoded about 6% of its archive and none of the last 30 days. Do not build map workflows on latitude/longitude yet.
- **Orlando publishes no project description field.** Matching runs against project name, work type and application type combined.
- **A trade permit can stand in for its project.** A large new build sometimes reaches you as its plumbing or electrical permit, because that is the filing the city processed most recently.
- **The permit number's year is not the project's age.** Use `signalAgeDays`.
- **Some work types are coarse.** Orlando files most roof work as simply "Roof", which does not distinguish a repair from a replacement — so ProjectTrigger says "Roofing opportunity" rather than asserting which.

***

### Example inputs

**Roofing**

```json
{
  "market": "orlando_fl",
  "serviceType": "roofing",
  "lookbackDays": 30,
  "minimumProjectValue": 25000,
  "propertyType": "all",
  "minimumScore": 60,
  "maxResults": 100
}
```

**Drone / aerial**

```json
{
  "market": "orlando_fl",
  "serviceType": "drone_aerial",
  "lookbackDays": 30,
  "minimumProjectValue": 100000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 100
}
```

**HVAC**

```json
{
  "market": "orlando_fl",
  "serviceType": "hvac",
  "lookbackDays": 30,
  "minimumProjectValue": 25000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 100
}
```

**Commercial cleaning**

```json
{
  "market": "orlando_fl",
  "serviceType": "commercial_cleaning",
  "lookbackDays": 45,
  "minimumProjectValue": 50000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 100
}
```

**Solar**

```json
{
  "market": "orlando_fl",
  "serviceType": "solar",
  "lookbackDays": 60,
  "minimumProjectValue": 0,
  "propertyType": "all",
  "minimumScore": 50,
  "maxResults": 100
}
```

**Security / low voltage**

```json
{
  "market": "orlando_fl",
  "serviceType": "security_low_voltage",
  "lookbackDays": 30,
  "minimumProjectValue": 25000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 100
}
```

**Custom service**

```json
{
  "market": "orlando_fl",
  "serviceType": "custom",
  "customService": "commercial fencing and perimeter security",
  "includeKeywords": ["security fence", "site development", "warehouse"],
  "excludeKeywords": ["interior renovation"],
  "lookbackDays": 30,
  "minimumProjectValue": 25000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 100
}
```

### Example output

The fields you will actually use, in the order the table shows them:

```json
{
  "opportunityRelevanceScore": 99,
  "opportunityGrade": "A",
  "primaryOpportunity": "Construction progress photography",
  "projectSummary": "Commercial new construction valued at $48.2M",
  "estimatedCost": 48211142,
  "permitAddress": "9525 STOREY PARK BLVD",
  "contractorName": "UES PROFESSIONAL SOLUTIONS, LLC.",
  "contractorPhone": "(407) 234-5187",
  "signalAgeDays": 1,
  "workType": "New",
  "projectClassification": "commercial",
  "permitNumber": "BLD2026-17362",
  "jurisdiction": "Orlando",
  "scoreReasons": [
    "Strong Drone / aerial photography & inspection match: new construction",
    "Estimated project value exceeds $48.2M",
    "Permit activity occurred yesterday",
    "Commercial project",
    "Contact details available: contractor name, phone, project owner"
  ],
  "sourceUrl": "https://data.cityoforlando.net/d/ryhf-m453?permit_number=BLD2026-17362"
}
```

Each item also carries the full scoring breakdown, all recommended opportunity types, matched signals, penalties, data-quality flags, dates and source provenance. Switch the dataset view to **All fields** to see them.

***

### Business enrichment (optional)

ProjectTrigger can optionally resolve a permit's contractor to its public business listing and read that business's own website for public contact details. It is **off by default**, because it calls a paid Google Maps Actor and adds cost to every run.

Two fields are kept strictly apart, and this distinction matters:

| Field | Means |
|---|---|
| **Permit contractor** | Exactly what the city published on the permit. Never overwritten. |
| **Matched business** | The public listing we matched the contractor to, with its own website, phone, rating and categories. A match, not a verification. |

#### Match statuses

| Status | Meaning |
|---|---|
| **HIGH CONFIDENCE** | Strong evidence — typically an exact name and an exact published phone. Business fields are filled in. |
| **PROBABLE** | Good evidence, clearly ahead of any alternative. Business fields are filled in. |
| **AMBIGUOUS** | A listing was found but could not be confirmed, or two candidates were too close to separate. **No business fields are published.** |
| **NOT FOUND** | No listing matched well enough. |

**A wrong company is worse than a blank column**, so matching is deliberately conservative: a candidate whose name barely resembles the contractor is rejected however well its phone or address happens to agree, and below HIGH CONFIDENCE a runner-up within 10 points makes the result AMBIGUOUS rather than a guess.

Expect **NOT FOUND often.** In live Orlando testing, 3 of 10 top contractors resolved. Many permit contractors are B2B subcontractors with no Google Maps presence at all, which is a fact about the world rather than a fault in the matching.

#### What enrichment adds

Business website, business phone, address, Google rating and review count, categories, Google Maps link, public role emails such as `info@` or `estimating@` where the business publishes them, and social profiles.

Emails are labelled **Public Business Email**, not "verified email" — they are addresses a company publishes for public contact, and no verification is performed. Personal addresses are never collected, never inferred, and never constructed from anyone's name.

#### Cost

Enrichment calls a downstream Actor, so it adds run cost. Observed in live testing: **about $0.003 per business looked up**, or roughly $0.01–0.02 for five. `maxEnrichmentSpendUsd` is a hard ceiling passed to the provider, and only the highest-scoring opportunities are enriched.

#### Lead readiness

When a business resolves, `leadReadinessScore` blends opportunity quality (70%), match confidence (20%) and business contactability (10%). When enrichment did not resolve it is **null, never low** — a strong permit whose contractor is not in Google Maps is still a strong permit.

`opportunityRelevanceScore` is never affected by enrichment.

### Closing the loop: reporting outcomes

Tell ProjectTrigger what happened to the opportunities it surfaced and the next run is better for it. Outcomes are stored against your Apify account and persist between runs.

```json
{
  "feedback": [
    { "permitNumber": "ENG2025-11408", "outcome": "won",
      "contractorName": "BLUE OX ENTERPRISES LLC", "valueUsd": 4200 },
    { "permitNumber": "BLD2025-21027", "outcome": "no_fit" }
  ]
}
```

Outcomes are `won`, `quoted`, `contacted`, `no_fit` or `unreachable`. Three things follow:

- **Actioned opportunities stop reappearing.** Anything marked won, quoted, no\_fit or unreachable is hidden from later runs. Something marked only `contacted` keeps showing, because that conversation is still live.
- **Contractors you have won with rank higher**, worth a visible +5 with its own line in the reasons. Only `won` counts.
- **The grades get graded.** Every run writes a `FEEDBACK_REPORT` comparing outcomes against the score each permit was given — and says plainly when there is not yet enough data to read anything into.

***

### What it costs

**Your first 3 searches are free**, within 14 days of your first run. Nothing is held back during the trial — every jurisdiction and business enrichment included — because a crippled trial would tell you nothing useful about the product.

After that, three charges, priced so the cost tracks what a search actually takes to produce:

| Event | Price | When |
|---|---|---|
| `opportunity-search` | **$1.50** | Once per run. One question asked, one ranked answer, however many jurisdictions that took. |
| `opportunity-returned` | **$0.06** | Per opportunity delivered. A search that finds nothing costs only the search. |
| `portal-jurisdiction` | **$0.50** | Per county read from an interactive portal instead of a data API. |

A typical Orlando search returning 40 opportunities costs **$3.90**. Adding Brevard, which has no data API and must be read page by page, adds $0.50.

A fourth line, Apify's standard `apify-actor-start`, appears on your invoice at **$0.00005** per run — a twentieth of a hundredth of a cent, kept because declaring it waives the first five seconds of run cost. It is listed here for completeness rather than because it will ever be noticeable.

Two things worth knowing. `portal-jurisdiction` exists so that portal counties do not quietly subsidise themselves out of existence — reading Brevard is roughly 250× the work of an Orlando query, and a flat fee healthy on Orlando alone would lose money the moment you added it. And because results are charged as they are delivered, **your Apify spending limit is respected mid-run**: if the budget runs out, you get fewer opportunities rather than a failed run or a charge you did not agree to.

Business enrichment calls a downstream Actor and is billed separately by Apify — see [Cost](#cost) above.

***

### Run summary

Every run writes `RUN_SUMMARY` to the key-value store: records fetched, matched, above the minimum score and returned; average and highest opportunity relevance score; grade distribution; which jurisdictions were searched and which were skipped and why; source errors and warnings; and run timings.

***

### Development

```bash
python -m venv .venv
.venv/Scripts/python -m pip install -r requirements-dev.txt
python -m pytest tests/ && python -m ruff check . && python -m mypy
apify run
```

#### Architecture

```
src/
  main.py               Actor entrypoint
  pipeline.py           Stage order from deduplication to formatted output
  collect.py            Fan-out across jurisdictions, merged and re-ranked
  markets.py            Coverage registry: what is searchable and what is not
  config.py             Input parsing, validation, clamping
  models.py             PermitRecord — the source-agnostic domain model
  billing.py            Pay-per-event charging
  feedback.py           Outcome history, suppression and grade calibration
  sources/              base.py, orlando.py (Socrata), accela.py (Brevard)
  services/             profiles.py (keywords as data), matcher.py
  scoring/              rules.py (one function per category), engine.py
  processing/           normalize, text, classify, filters, deduplicate, privacy
  output/               formatter, summarize, summary, debug
```

Adding a service means editing a keyword list in `profiles.py`, never a branch in the engine. Adding a market means one adapter plus one registry entry — see [`docs/adapters.md`](docs/adapters.md) for the contract every adapter must honour, which `tests/test_adapter_conformance.py` enforces automatically against all of them.

#### The pipeline

```text
fetch → normalize → deduplicate → filter → classify
  → match → score → minimum-score filter → sort → limit → format
```

Property-type filtering happens after classification, not on the city's raw label, because Orlando files a warehouse and a hospital under the same word. Multi-permit projects collapse after scoring, so the permit that survives is the one most relevant to *your* service.

***

### Attribution

Permit data from the [City of Orlando Open Data Portal](https://data.cityoforlando.net/d/ryhf-m453) (dataset `ryhf-m453`, official Socrata API) and the Brevard County public permit portal.

Permit data is published by those authorities as-is. It may be incomplete, outdated or inaccurate, is not legally binding, and remains subject to each authority's own terms — including any restriction on redistribution. ProjectTrigger reports what a record says and flags what it does not.

ProjectTrigger is not affiliated with, endorsed by, or sponsored by the City of Orlando, Brevard County, Apify, or Google.

***

### Legal

- **[Terms of Use](#terms-of-use)** — acceptable and prohibited uses, data accuracy, warranty disclaimer, limitation of liability, arbitration
- **[Privacy Policy](#privacy-policy)** — what inputs are received, what is stored and where, retention, subprocessors, deletion

Both are reproduced in full at the end of this page, so they travel with the listing rather than living behind a link.

Two points worth reading before you run it:

**Runs happen in your Apify account.** Your inputs, results, logs and stored history stay there. The operator receives commercial usage figures from Apify, not the contents of your runs.

**Outreach is yours.** ProjectTrigger contacts no one and has no capability to. If you contact a business found through it, you are the sender, and compliance with telemarketing, anti-spam and data-protection law is your responsibility.

***

### Terms of Use

**Product:** ProjectTrigger — Building Permit Lead Finder (the "Actor")
**Operator:** Jocsan Ayala, an individual, operating as ProjectTrigger (the "Operator", "we", "us")
**Contact:** **Dronereelstudios@gmail.com**
**Effective date:** 1 September 2026
**Version:** 1.0

By running the Actor, you ("you", "the User") agree to these Terms. If you do not agree, do not run it.

***

#### 1. What this product is

The Actor is a **research and prospecting tool**. It reads building-permit records that government bodies publish openly, scores each record against a service you describe, and returns a ranked list with the reasoning attached.

It is provided for lawful business research: identifying construction projects that may plausibly require services you sell, and deciding for yourself which are worth investigating.

The Actor does not act on your behalf. It contacts no one, represents nothing, and makes no arrangement with any party named in its output.

##### 1.1 Business users only

**The Actor is offered solely to businesses and to individuals acting for business purposes.** It is not offered to consumers, and it is not intended for personal, family, or household use.

By running it you represent that you are at least 18 years old, are acting in the course of a trade, business, craft or profession, and are not a consumer for the purposes of any consumer-protection law.

This is a material term. Consumer-protection statutes impose obligations and non-waivable rights that do not apply to business-to-business dealings, and the pricing, disclaimers and dispute terms below are set on the basis that you are a business user.

##### 1.2 No professional advice

The Actor provides research data and a relevance score. It does **not** provide legal, financial, investment, tax, insurance, engineering, construction, valuation, or professional advice of any kind, and nothing it outputs should be treated as such.

No professional relationship is created between you and the Operator. Where a decision calls for professional judgement, obtain it from a qualified professional.

***

#### 2. Data accuracy

Permit data comes from third-party government sources. **We do not create it, verify it, correct it, or control it.**

You acknowledge that permit records may be:

- incomplete, outdated, superseded, or withdrawn
- entered with clerical errors by the issuing authority
- delayed, so that a record does not reflect the current state of a project
- unavailable, changed in structure, or discontinued without notice
- subject to the issuing authority's own disclaimers

The City of Orlando's open-data terms, for example, state that its information is supplied as-is, may be incomplete or inaccurate, is not legally binding, and may include material copyrighted by third parties that is not freely redistributable. Equivalent limitations apply to every source.

The Actor reports what a record says. Where a value is missing it is flagged as missing, never inferred or filled in. A stated project value is **what the permit declares**, not an audited or final cost.

**You are responsible for independently verifying any fact before you act on it.**

***

#### 3. Scores are relevance measures, not predictions

The Actor produces an `opportunityRelevanceScore` from 0 to 100 using published, deterministic rules.

A score expresses **how strongly a permit record matches the service you selected**. That is all it expresses.

A score is **not**:

- a probability that you will win work
- a probability that anyone will respond to you
- a statement that a project is available, unawarded, or accepting bids
- a statement that the underlying data is accurate or current
- a valuation, an appraisal, or a financial projection

No score is derived from historical conversion data. **No leads, results, revenue, response rates or outcomes of any kind are promised, projected, or guaranteed.** Any commercial result you obtain depends on your own offering, pricing, timing, diligence and effort.

***

#### 4. Acceptable use

You may use the Actor to research construction projects and identify businesses to approach about services you lawfully provide.

You agree that you will:

- comply with all laws applicable to you, including marketing, telemarketing, anti-spam, data-protection and unfair-competition laws
- comply with the terms of every underlying data source
- comply with the Apify Terms of Service, which govern the platform the Actor runs on
- verify information before relying on it or repeating it to a third party
- take sole responsibility for every communication you send

***

#### 5. Prohibited uses

You must **not** use the Actor, or its output, to:

- make or inform any decision about a person's eligibility for **credit, insurance, employment, housing, tenancy, or education**. The output is not a consumer report and the Operator is not a consumer reporting agency within the meaning of the US Fair Credit Reporting Act or any analogous law
- assess, score, profile, screen, or investigate an **individual person**, as opposed to a business
- build, augment, sell, or license a database of individuals, their contact details, or their property ownership
- infer, guess, derive or purchase private personal contact details, or attempt to identify private individuals connected to a property
- harass, stalk, defraud, threaten, or endanger anyone
- support any decision affecting **health, safety, legal status, immigration status, or civil rights**
- engage in unlawful discrimination, including targeting or excluding by any protected characteristic
- conduct or facilitate unlawful surveillance
- resell, redistribute, sublicense, or republish the Actor's output as a standalone data product
- circumvent usage limits, charging, rate limits, or trial restrictions, or misrepresent your identity to obtain free usage
- reverse engineer, decompile, or attempt to extract the Actor's source code or scoring rules beyond what is published

These prohibitions are material terms. Using the Actor for any of them terminates your licence immediately.

***

#### 6. Your responsibility for outreach

The Actor performs **no outreach of any kind**. It sends no email, places no call, and delivers no message. It has no such capability.

If you contact any business or person identified through the Actor, **you are the sole sender** of that communication. You alone are responsible for:

- the lawfulness of the communication, including consent, opt-out, do-not-call, calling-hours, disclosure and record-keeping obligations
- the accuracy of anything you assert in it
- checking numbers against applicable do-not-call registries
- compliance with the TCPA, CAN-SPAM, state telemarketing statutes, the GDPR and ePrivacy rules, CASL, and any other regime that applies to you
- every consequence, complaint, penalty, or claim arising from it

The Operator has no involvement in, control over, knowledge of, or responsibility for your outreach.

***

#### 7. Intellectual property

The Actor's source code, scoring rules, service profiles, matching logic, documentation and presentation are the Operator's property, protected by copyright and other laws. These Terms grant you a limited, non-exclusive, non-transferable, revocable licence to run the Actor and use its output **for your own internal business purposes**. No other rights are granted.

Underlying permit data belongs to the issuing government authorities and is subject to their terms. The Operator claims no ownership of it and grants you no rights in it. Where a source restricts redistribution or commercial use, those restrictions bind you.

Third-party names, marks and listings appearing in output belong to their respective owners. Their appearance is not affiliation, endorsement, or sponsorship.

The Operator is **not affiliated with, endorsed by, or sponsored by** the City of Orlando, Brevard County, Apify, Google, or any other data source or platform named in the output.

You may keep and use output internally. You may not resell or redistribute it as a data product.

***

#### 8. Disclaimer of warranties

**THE ACTOR AND ALL OUTPUT ARE PROVIDED "AS IS" AND "AS AVAILABLE", WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND.**

To the fullest extent permitted by law, the Operator disclaims all warranties, express, implied, statutory or otherwise, including any implied warranty of **merchantability, fitness for a particular purpose, title, accuracy, quiet enjoyment, and non-infringement**.

Without limiting that, the Operator does not warrant that:

- output will be accurate, complete, current, or error-free
- the Actor will be uninterrupted, available, secure, or free of defects
- any data source will remain available, stable, or unchanged
- any result, lead, contact, response, sale or revenue will be obtained
- the Actor will meet your requirements or expectations
- defects will be corrected

No statement, whether oral or written, obtained from the Operator or through the Actor creates any warranty not expressly stated here.

Some jurisdictions do not allow the exclusion of implied warranties, so parts of this section may not apply to you.

***

#### 9. Limitation of liability

**To the maximum extent permitted by law, the Operator is not liable to you or to anyone else for any loss or damage arising out of or relating to the Actor or its output.**

This includes, without limitation, liability for:

- lost profits, lost revenue, lost business, lost opportunities, or lost goodwill
- wasted expenditure, wasted time, or wasted effort
- inaccurate, incomplete, outdated, or missing data
- decisions made or actions taken in reliance on output
- any communication you send to any party
- claims, penalties, or regulatory action arising from your use
- unavailability, interruption, defect, or discontinuation of the Actor or any data source
- acts or omissions of Apify, any data source, or any third-party provider Actor
- indirect, incidental, special, consequential, exemplary, or punitive damages

This applies regardless of the theory of liability — contract, tort, negligence, strict liability, statute or otherwise — and **even if the Operator has been advised of the possibility of such damages**, and even if a limited remedy fails of its essential purpose.

**Aggregate cap.** Where liability cannot be excluded entirely, the Operator's total aggregate liability for all claims is limited to the **greater of (a) the total amount you actually paid to run the Actor in the three (3) months immediately preceding the event giving rise to the claim, or (b) US $50.00.**

**What cannot be excluded.** Nothing in these Terms excludes or limits liability that cannot lawfully be excluded — which in most jurisdictions includes liability for fraud, fraudulent misrepresentation, death or personal injury caused by negligence, and certain statutory consumer rights. Some jurisdictions do not permit the exclusion of incidental or consequential damages, so parts of this section may not apply to you.

**Sole remedy.** If you are dissatisfied with the Actor for any reason, **your sole and exclusive remedy is to stop using it.** No refund of amounts already charged is offered or implied.

**Your responsibility.** You accept full responsibility for your use of the Actor, for verifying its output, and for every decision and communication you base on it.

***

#### 10. Assumption of risk and no reliance

**You use the Actor at your own risk, and you assume that risk knowingly.**

You acknowledge and agree that:

- you have been told plainly, in Sections 2 and 3, that the data may be wrong and that a score predicts nothing
- you are capable of evaluating the output for yourself, and you will independently verify anything before acting on it
- you are **not relying** on any statement, representation, demonstration, example, screenshot, sample output, or marketing material of the Operator in deciding to use the Actor or in deciding what to do with its output
- any example figures, sample results or illustrative outputs shown in documentation are illustrative only and are not a representation of the results you will obtain
- you accept the risk that a permit record is inaccurate, that a business is misidentified, that a project is unavailable, or that outreach produces nothing

This section records the basis on which the Actor is offered at its stated price. Without it, the Actor would not be offered on these terms.

***

#### 11. Indemnity

You will indemnify, defend and hold harmless the Operator and its officers, employees, contractors and agents against any claim, demand, loss, liability, penalty, cost or expense (including reasonable legal fees) arising from:

- your use of the Actor or its output
- any communication or outreach you undertake
- your breach of these Terms, of any law, or of any data source's terms
- your infringement of any third party's rights

***

#### 12. Termination

You may stop using the Actor at any time.

The Operator may suspend or terminate your access **at any time, with or without notice or cause**, including where the Operator believes you have breached these Terms, misused the Actor, or created legal or reputational risk.

The Operator may also modify, suspend, or discontinue the Actor, any market, or any feature at any time, **without notice and without liability**. No continued availability of any data source, jurisdiction, or capability is promised.

Sections 2, 3, 5, 6, 7, 8, 9, 10, 11, 13, 14 and 15 survive termination.

***

#### 13. Notice, cure, and time limit on claims

**Raise it first.** Before starting any proceeding, you must send a written notice to **Dronereelstudios@gmail.com** describing the problem, what you want, and the amount claimed. The Operator has **thirty (30) days** from receipt to resolve it. Many disputes end here, and no claim may be filed until that period has run.

**One year to bring a claim.** Any claim arising out of or relating to the Actor must be brought **within one (1) year** after the claim first arose. A claim brought later is permanently barred, to the fullest extent the law allows. If your jurisdiction does not permit a shortened limitations period, this clause does not apply to you.

***

#### 14. Dispute resolution — arbitration and class action waiver

**Please read this section carefully. It affects how disputes are resolved and limits the ways you can seek relief.**

**Binding individual arbitration.** Except as stated below, any dispute arising out of or relating to these Terms or the Actor will be resolved by **final and binding arbitration** administered by the American Arbitration Association under its Commercial Arbitration Rules, before a single arbitrator, seated in **Orange County, Florida**, in English. Judgment on the award may be entered in any court of competent jurisdiction.

**Class action waiver.** **Disputes will be arbitrated only on an individual basis.** You and the Operator each waive any right to bring or participate in a class, collective, consolidated, coordinated, private attorney general, or representative proceeding. The arbitrator may not consolidate claims or preside over any form of representative action, and may award relief only to the individual party seeking it, and only to the extent needed to satisfy that party's own claim.

If this class action waiver is held unenforceable as to any claim, then this entire Section 14 does not apply to that claim, and that claim proceeds in the courts identified in Section 15 — but the waiver remains in force for all other claims.

**Jury trial waiver.** To the fullest extent permitted by law, **you and the Operator each waive any right to a trial by jury** in any proceeding arising out of or relating to these Terms or the Actor.

**Carve-outs.** Either party may (a) bring an individual claim in small claims court if it qualifies, and (b) seek injunctive or equitable relief in court to protect intellectual property or to stop unauthorised use — neither requires arbitration.

***

#### 15. General

**How this agreement is formed.** These Terms are accepted when you run the Actor. Running it is your affirmative agreement to be bound. If you do not agree, do not run it. The Operator may rely on platform run records as evidence of acceptance.

**Changes.** These Terms may be updated. The current version governs each run. Continued use after a change constitutes acceptance. Material changes will be reflected in the version and effective date above.

**Governing law.** These Terms are governed by the laws of the **State of Florida, United States**, excluding its conflict-of-laws rules. Subject to Section 14, the exclusive venue for any dispute is the state or federal courts located in **Orange County, Florida**, and you consent to that jurisdiction and venue.

**Force majeure.** The Operator is not liable for any failure or delay caused by anything beyond its reasonable control, including a data source changing, restricting, or withdrawing access; platform or hosting outages; network failures; changes in law; acts of government; natural events; illness; or labour conditions.

**No third-party beneficiaries.** These Terms benefit only you and the Operator. No other person has any right to enforce them.

**No partnership.** Nothing here creates a partnership, joint venture, agency, employment, or fiduciary relationship between you and the Operator.

**Compliance and sanctions.** You represent that you are not located in, and will not use the Actor from, any country or by any person subject to applicable trade sanctions or export restrictions.

**Severability.** If any provision is held unenforceable, it is limited or severed to the minimum extent necessary and the remainder stays in force.

**No waiver.** A failure to enforce any provision is not a waiver of it.

**Entire agreement.** These Terms, together with the [Privacy Policy](#privacy-policy) and the Apify Terms of Service, are the entire agreement between you and the Operator regarding the Actor, and supersede any prior understanding.

**Platform terms.** The Actor is distributed through Apify. Apify's own terms, pricing rules and privacy practices apply to your use of the platform and are not controlled by the Operator.

**Assignment.** You may not assign these Terms. The Operator may assign them freely.

**Contact.** **Dronereelstudios@gmail.com**

***

### Privacy Policy

**Product:** ProjectTrigger — Building Permit Lead Finder (the "Actor")
**Operator:** Jocsan Ayala, an individual, operating as ProjectTrigger (the "Operator", "we", "us")
**Contact:** **Dronereelstudios@gmail.com**
**Effective date:** 1 September 2026
**Version:** 1.0

***

#### 1. The most important fact

**The Actor runs inside your own Apify account, not ours.**

When you run the Actor, Apify executes it under your account. The inputs you provide, the results produced, the run log and every storage the run creates all belong to **your** Apify account and remain there.

The Operator does **not** receive, collect, store, or have access to:

- the search inputs you submit
- the results any run produces
- your run logs
- your feedback history
- your Apify account contents

What the Operator receives from Apify is limited to **commercial and aggregate information** about Actor usage — such as run counts, compute consumption, charged events and revenue. This is how Apify reports usage to developers. It does not include the content of your runs.

If you need the Operator to see a run — for support, for example — you would have to share it deliberately.

***

#### 2. What inputs the Actor receives

The Actor processes only what you enter as run input:

| Input | Purpose |
|---|---|
| Service type, custom service description, keywords, exclusions | Deciding which permits match what you sell |
| Market/jurisdiction selection | Which public dataset to query |
| Filters — lookback days, minimum value, property type, minimum score, result limit | Narrowing the search |
| Enrichment settings and spend ceiling | Whether to look up business listings, and how much to spend |
| Feedback array — permit numbers and outcomes such as `won`, `no_fit` | Suppressing opportunities you have actioned and ranking repeat contractors higher |

**Do not enter personal data as input.** The input fields exist to describe a service and filter permits. There is no field that requires anyone's personal information, and none should be supplied.

***

#### 3. What the Actor produces and where it is stored

Everything below is written to **your** Apify account:

| Storage | Contents | Kind |
|---|---|---|
| Default dataset | Ranked opportunities: permit details, scores, reasons, contractor business details | Per run |
| `RUN_SUMMARY` (key-value store) | Counts, score distribution, jurisdictions searched and skipped, errors, timings | Per run |
| `FEEDBACK_REPORT` (key-value store) | How past grades performed against outcomes you reported | Per run |
| `projecttrigger-feedback` (named key-value store) | Outcomes you reported, so they persist between runs | Persistent |
| `projecttrigger-trial` (named key-value store) | Count and start date of your introductory free runs | Persistent |

The two named stores persist across runs by design — that is what lets feedback improve later runs and lets the free trial be counted. They live in your account and you can delete them at any time.

***

#### 4. Logging

The Actor writes a run log through Apify's standard logging: progress, counts, jurisdictions searched, warnings, and errors. The log is stored with the run in your account.

The Actor does not log your input verbatim, and does not transmit logs anywhere outside your Apify account.

***

#### 5. Personal data and the permit sources

Building permits are public records that frequently contain personal data — most commonly a property owner's name, and sometimes an individual's contact details.

**The Actor is deliberately designed to publish business entities, not individuals.** Specifically:

- **Property owner names are filtered.** Only names identifiable as organisations are published. Private individuals' names are dropped at the point of parsing, before anything downstream sees them. On live Orlando data roughly half of all owner names are suppressed by this rule.
- **Revocable trusts and life estates are treated as individuals**, not organisations, because they typically carry a private person's name.
- **Named individuals are never published as the contractor.** Where a source publishes both a company and a person, as Brevard's detail pages do, only the company survives.
- **Personal email addresses and direct personal phone numbers found in source records are discarded** at parse time. Brevard's permit detail pages contain them; they never reach output.
- **No personal email is ever guessed, inferred, or constructed** from anyone's name.

This behaviour is enforced by automated tests that run against every market adapter, so a newly added jurisdiction cannot reintroduce it.

##### Reporting personal data in output

If you believe personal data has appeared in output despite these filters — whether you are a user, or a person named in a permit record — write to **Dronereelstudios@gmail.com** with enough detail to locate it: the permit number, the market, and the field concerned.

We will acknowledge within **five (5) business days** and, where the report is substantiated, correct the filtering so the data stops appearing in future runs. Corrections are made at the source of the problem, so a fix applies to every subsequent run rather than a single record.

Two limits, stated honestly:

- **The underlying record is not ours.** Permit data is published by government authorities. We can stop republishing something; only the issuing authority can change or remove its own record. Requests to correct the official record must go to that authority.
- **Results already delivered live in users' own Apify accounts**, which we cannot reach. We can prevent future appearances, not retrieve past ones.

***

#### 6. Business enrichment (optional, off by default)

Enrichment is **disabled unless you turn it on**. When enabled, the Actor attempts to match a permit's contractor to that company's public business listing.

It collects, for businesses only:

- business name, address, phone, website
- Google rating, review count, categories, Maps link
- **role mailboxes** the business publishes on its own site, such as `info@` or `estimating@`
- public social profile links belonging to the business

It does **not** collect: personal email addresses, personal phone numbers, individual employees' details, social profiles of individuals, or anything behind a login. Addresses matching a personal-name pattern are rejected by an allowlist that only admits role mailboxes.

Emails are labelled **Public Business Email** — never "verified" — because they are addresses a company publishes for public contact and no verification is performed.

A contractor is only resolved when the evidence is strong. An uncertain match is reported as `AMBIGUOUS` and left blank rather than guessed.

***

#### 7. Subprocessors and third parties

| Party | Role | Notes |
|---|---|---|
| **Apify** | Platform | Runs the Actor, stores all run data in your account, handles billing. Apify's own [privacy policy](https://apify.com/privacy-policy) and terms govern the platform. |
| **Government data sources** | Data origin | City of Orlando Open Data, Brevard County permit portal. The Actor sends them a query; it sends them nothing about you. |
| **`compass/crawler-google-places`** (Apify Store) | Business listing lookup | Called **only when you enable enrichment**. Runs under your Apify account and is billed to you. Subject to its own publisher's terms. |
| **Business websites** | Public contact details | When enrichment is on, the Actor may fetch a matched company's public website to read published role mailboxes. It identifies itself by user agent and reads only publicly served pages. |

The Operator does not sell, rent, share, or transfer your data to anyone — it does not hold your data in the first place.

***

#### 8. Retention

Because run data lives in your Apify account, **retention is governed by Apify's policies and your account plan**, not by the Operator. Apify applies its own retention periods to runs, datasets, key-value stores and logs, which vary by plan.

The two persistent stores (`projecttrigger-feedback`, `projecttrigger-trial`) remain until you delete them or Apify's retention removes them.

The Operator retains nothing about your runs, so there is nothing on our side to expire.

***

#### 9. Deleting your data

You control all of it:

1. **Delete a run's data** — remove the run, its dataset and its key-value stores from the Apify Console, or via the Apify API.
2. **Delete your feedback history** — delete the named key-value store `projecttrigger-feedback`.
3. **Reset trial state** — delete the named key-value store `projecttrigger-trial`.
4. **Delete everything** — remove the Actor from your account, or close your Apify account under Apify's process.

No request to the Operator is required, and the Operator cannot perform these deletions for you because we have no access to your account.

For anything Apify holds — billing records, account details, platform logs — contact Apify directly; the Operator cannot act on those.

***

#### 10. Your rights

Depending on where you live, you may have rights to access, correct, delete, port, or restrict processing of your personal data, and to object to it.

The Operator does not hold your personal data beyond what Apify provides for commercial administration (your Apify username and aggregate usage). Requests concerning platform-held data should go to Apify.

For anything within the Operator's control, contact **Dronereelstudios@gmail.com**. We will respond within the period required by applicable law.

***

#### 11. Children

The Actor is a business tool and is not directed to anyone under 18. It is not knowingly made available to children, and it collects nothing from them.

***

#### 12. Security

The Actor holds no credentials of yours and requires no account other than Apify's. It stores no secrets. Communication with data sources uses HTTPS.

Security of the platform, your account, and your stored run data is provided by Apify under its own security practices. Protecting your Apify account credentials is your responsibility.

***

#### 13. International use

The Actor is operated from the **United States** and runs on Apify's infrastructure, which may process data in other countries. If you use it from elsewhere, you are responsible for your own compliance with local law, including any restrictions on how you may use permit data or contact businesses in your jurisdiction.

***

#### 14. Changes

This policy may be updated. The version and effective date above indicate the current one. Material changes will be reflected there.

***

**Contact:** **Dronereelstudios@gmail.com**
**See also:** [Terms of Use](#terms-of-use)

# Actor input Schema

## `serviceType` (type: `string`):

Every project is scored for this service, so the same permit ranks differently depending on your trade.

## `market` (type: `string`):

Orlando is read from an official open-data API and answers in seconds. Brevard County is read from its public permit portal one permit at a time, so including it makes a run take a few minutes. Central Florida searches both together and ranks them as one list. Each run reports which jurisdictions were searched and which have no public data feed.

## `lookbackDays` (type: `integer`):

Only include permits filed or issued within this many days. Shorter is fresher; longer returns more.

## `minimumProjectValue` (type: `integer`):

Skip projects below this declared construction value. Set 0 to include projects where the city recorded no value.

## `propertyType` (type: `string`):

Commercial also covers multifamily buildings of 3+ units, which are commercial opportunities for most trades.

## `minimumScore` (type: `integer`):

Higher numbers return fewer but stronger matches. 60 is a good starting point; try 75 for a short, high-confidence shortlist.

## `maxResults` (type: `integer`):

The highest-scoring projects come first, so a smaller number still gives you the best ones.

## `customService` (type: `string`):

Only used when 'What do you sell?' is set to Custom Service. Example: parking lot striping and sealcoating for retail centers.

## `includeKeywords` (type: `array`):

Projects mentioning any of these rank higher. Required for Custom Service; optional otherwise. Example: warehouse, hotel, distribution.

## `excludeKeywords` (type: `array`):

Drop projects mentioning any of these. Example: fence, pool, shed.

## `feedback` (type: `array`):

Optional. Tell ProjectTrigger how earlier opportunities turned out and it stops showing them, favours contractors you have won work with, and reports how each grade actually performed. One object per permit; outcome is one of won, quoted, contacted, no\_fit, unreachable. Example: \[{"permitNumber": "BLD2026-17192", "outcome": "won", "valueUsd": 4200}]

## `hideActionedOpportunities` (type: `boolean`):

Keeps anything you marked won, quoted, no\_fit or unreachable off future lists. Anything marked only 'contacted' keeps appearing, since that conversation is still live.

## `backfillContactInfo` (type: `boolean`):

When a permit names a contractor but no phone, look up the number that contractor published on their other permits in the same official dataset. Results are labelled so you always know where a number came from and how recent it is.

## `enrichmentEnabled` (type: `boolean`):

Off by default because it calls a paid Google Maps Actor and adds cost to every run. When on, ProjectTrigger tries to match the top opportunities' contractors to their public business listing, adding website, business phone, rating, categories and public role emails such as info@ or estimating@. A contractor is only resolved when the evidence is strong; an uncertain match is reported as AMBIGUOUS and left blank rather than guessed.

## `maxEnrichmentCandidates` (type: `integer`):

Only the highest-scoring opportunities are looked up. This is the main cost lever.

## `minimumScoreForEnrichment` (type: `integer`):

Weak leads are not worth paying to research.

## `maxEnrichmentSpendUsd` (type: `integer`):

Hard ceiling passed to the business-lookup Actor. It cannot charge more than this in one run.

## `websiteEnrichmentEnabled` (type: `boolean`):

Reads up to four pages of a resolved business's own site to find its public contact email, contact page and social profiles. No personal addresses are collected.

## `enrichmentActorId` (type: `string`):

Override the Google Maps Actor used for business lookups. Leave blank to use the default.

## Actor input object example

```json
{
  "serviceType": "roofing",
  "market": "orlando_fl",
  "lookbackDays": 30,
  "minimumProjectValue": 25000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 50,
  "hideActionedOpportunities": true,
  "backfillContactInfo": true,
  "enrichmentEnabled": false,
  "maxEnrichmentCandidates": 20,
  "minimumScoreForEnrichment": 70,
  "maxEnrichmentSpendUsd": 1,
  "websiteEnrichmentEnabled": true
}
```

# Actor output Schema

## `opportunities` (type: `string`):

Permits scored against the service you selected, highest relevance first. Every row carries its own score reasons and a link to the official record.

## `opportunitiesCsv` (type: `string`):

The same ranked list as a spreadsheet, for importing into a CRM.

## `runSummary` (type: `string`):

What was searched and what was dropped: records fetched, matched and returned, score distribution, jurisdictions searched, jurisdictions with no public data feed and why, source warnings, charges, and the disclosure explaining what a relevance score does and does not mean.

## `feedbackReport` (type: `string`):

How the grades you were given compare against the outcomes you reported back. Says plainly when there is not yet enough data to read anything into.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "serviceType": "roofing",
    "market": "orlando_fl",
    "lookbackDays": 30,
    "minimumProjectValue": 25000,
    "propertyType": "commercial",
    "minimumScore": 60,
    "maxResults": 50,
    "maxEnrichmentCandidates": 20,
    "minimumScoreForEnrichment": 70,
    "maxEnrichmentSpendUsd": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("ayalalabs/projecttrigger").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "serviceType": "roofing",
    "market": "orlando_fl",
    "lookbackDays": 30,
    "minimumProjectValue": 25000,
    "propertyType": "commercial",
    "minimumScore": 60,
    "maxResults": 50,
    "maxEnrichmentCandidates": 20,
    "minimumScoreForEnrichment": 70,
    "maxEnrichmentSpendUsd": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("ayalalabs/projecttrigger").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "serviceType": "roofing",
  "market": "orlando_fl",
  "lookbackDays": 30,
  "minimumProjectValue": 25000,
  "propertyType": "commercial",
  "minimumScore": 60,
  "maxResults": 50,
  "maxEnrichmentCandidates": 20,
  "minimumScoreForEnrichment": 70,
  "maxEnrichmentSpendUsd": 1
}' |
apify call ayalalabs/projecttrigger --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ayalalabs/projecttrigger"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/bvUXVKxEZe70KDCjk/builds/rUVGP6KkKFO9fNqv1/openapi.json
