Partner & site integrations
Developers
Embed Handyman.com widgets and forms on your own site. Use our public JSON endpoints for live content—no API key required. Forms can link out or load in an iframe.
Early access
This page is a living integration guide. Widget payloads and form endpoints will expand over time. Questions? Contact us or apply via the partner program.
Overview
- Widgets —
GET /api/public/*returns JSON withAccess-Control-Allow-Origin: *. Call from any domain withfetch. - Forms — Post a project or contact us by linking to Handyman.com or embedding our hosted pages in an iframe (recommended for account creation + Turnstile).
- Base URL —
https://www.handyman.com
Widgets (live JSON)
Fetch these endpoints from your site and render the response. Responses are cached briefly at the edge; poll every few minutes for a “live” feel.
| Endpoint | Use for |
|---|---|
| GET /api/public/projects?limit=6 | Latest open homeowner projects |
| GET /api/public/questions?limit=8 | Community Q&A threads |
| GET /api/public/contractors?limit=6 | Featured paid contractors |
| GET /api/public/posts?limit=3 | Latest blog articles |
Example — latest projects list
Vanilla JS; swap the container id and styling to match your site.
<!-- Container on your page -->
<div id="handyman-projects"></div>
<script>
fetch("https://www.handyman.com/api/public/projects?limit=6")
.then(function (res) { return res.json(); })
.then(function (data) {
var el = document.getElementById("handyman-projects");
if (!el || !data.projects) return;
el.innerHTML = data.projects.map(function (p) {
var loc = [p.city, p.budget].filter(Boolean).join(" · ");
return '<article style="margin-bottom:12px">' +
'<a href="https://www.handyman.com/projects/' + p.project_id + '">' +
'<strong>' + (p.title || p.projectType || "Project") + '</strong></a>' +
(loc ? '<div style="font-size:12px;color:#666">' + loc + '</div>' : '') +
'</article>';
}).join("");
})
.catch(function () {
document.getElementById("handyman-projects").textContent = "Projects unavailable.";
});
</script>Example — community questions
fetch("https://www.handyman.com/api/public/questions?limit=5")
.then(function (r) { return r.json(); })
.then(function (data) {
console.log(data.questions);
// Each item: question_id, question_text, category, answer_count, votes, date_posted
});Example — featured contractors
fetch("https://www.handyman.com/api/public/contractors?limit=4")
.then(function (r) { return r.json(); })
.then(function (data) {
console.log(data.contractors);
// Each item: ContractorId, Name, City, State, AboutBusiness, slug, …
});Forms & embeds
Homeowner project posting includes free account creation (email or Google). The simplest integration is an iframe or button that opens our hosted flow—no backend on your side.
Post a project — iframe embed (recommended)
Pre-fill trade and ZIP with query params. User completes the form on Handyman.com.
<iframe
src="https://www.handyman.com/projects/post?projectTypeId=1&zipcode=33432"
title="Post a home project on Handyman.com"
width="100%"
height="720"
style="border:0;border-radius:12px;max-width:640px"
loading="lazy"
></iframe>Post a project — link or button
<a href="https://www.handyman.com/projects/post?projectTypeId=1&zipcode=33432"
target="_blank"
rel="noopener noreferrer">
Post your project free →
</a>Ask a question — link out
Community Q&A lives on Handyman.com; link users to post or browse.
<a href="https://www.handyman.com/questions/post">Ask the community</a>
<a href="https://www.handyman.com/questions">Browse discussions</a>Contact form — hosted page
Use our contact page in an iframe, or link to it. Programmatic POST to /api/contact may require same-origin unless CORS is enabled for your domain (ask us).
<iframe
src="https://www.handyman.com/contact"
title="Contact Handyman.com"
width="100%"
height="520"
style="border:0;border-radius:12px;max-width:480px"
loading="lazy"
></iframe>Guidelines
- Do not expose homeowner emails, phone numbers, or street addresses from API data.
- Link project and question titles back to Handyman.com for the full experience.
- Cache widget responses reasonably; avoid hammering endpoints faster than once per minute.
- Attribute content: “Powered by Handyman.com” with a link is appreciated.