💡How Pollenate Works
Pollenate helps you hear from the people who use your product, visit your website, or walk through your door. It collects their feedback — ratings, comments, survey responses — and organizes it all in one dashboard so you can spot patterns and take action.
Organizations & Brands
Your organization is your team's account — it holds everything. Inside it, you can create brands to separate feedback by product, department, or location. For example, a hospital group might have one brand per clinic.
Inboxes
Think of an inbox like a mailbox for feedback. You might have one inbox for your website, another for your mobile app, and a third for post-visit surveys. Each inbox has its own unique key so feedback gets routed to the right place.
Widgets
A widget is a small feedback prompt that appears on your website — like a "How did we do?" button or a row of star ratings. You add it by pasting a short snippet of code. No app installation or software download needed.
Feedback Pages
Feedback Pages are standalone survey forms with their own web address. Great when you want to ask multiple questions, share a link via email or text message, or print a QR code on a flyer for in-person events.
API Keys
An API key is like a password that lets your website talk to Pollenate securely. You create one in Settings → API Keys and give it to your widget so it has permission to send feedback to your account.
Dashboard & Reports
Everything your users submit shows up in your dashboard in real time. You can filter by date, score, or inbox, search by keyword, and watch trends over time — no spreadsheets required.
The big picture
🚀Quick Start
Get up and running with Pollenate in under 5 minutes. Collect your first piece of feedback today.
🗣️ In plain English: You paste a small snippet of code into your website. It adds a feedback button that visitors can click to rate their experience or leave a comment. Their responses appear in your Pollenate dashboard instantly. If you're not comfortable editing code, ask your web developer to add this — it only takes a minute.
<script
src="https://pollenate.dev/widget.js"
data-inbox-key="YOUR_INBOX_KEY"
data-api-key="YOUR_API_KEY"
data-type="emoji"
async
></script>That's it! The widget will automatically appear on your page. You'll need both an inbox key (from the Inboxes page) and an API key with the "collect" scope (from Settings → API Keys).
🔐Authentication
🗣️ In plain English: Authentication is how Pollenate knows the feedback is coming from your website and not someone else's. It uses special keys — kind of like a password — that you copy from your Pollenate settings and paste into your widget code. There are two kinds: one for your website's feedback widget, and one for managing your account through code.
Pollenate uses two authentication methods depending on your use case:
API Keys (for widgets & integrations)
Use API keys for server-to-server integrations and widget authentication. Pass your key in the X-Pollenate-Key header.
curl -X POST https://api.pollenate.dev/collect \
-H "X-Pollenate-Key: pk_live_xxx" \
-H "Content-Type: application/json" \
-d '{"type": "emoji", "score": 5, "comment": "Great!"}'JWT Bearer Token (for dashboard API)
Use JWT tokens for authenticated user sessions. Tokens are obtained via OTP email verification.
curl https://api.pollenate.dev/organizations \
-H "Authorization: Bearer eyJhbGc..."📦Embed Widget
🗣️ In plain English: A widget is a small interactive element that appears on your website — like a row of smiley faces or a star rating — asking visitors for their opinion. You add it by pasting one line of code into your website. It works on any website: WordPress, Squarespace, Wix, custom-built sites, and more. Your web developer can set it up in under a minute.
The Pollenate widget can be embedded in any website with a single script tag.
Script Attributes
| Attribute | Required | Description |
|---|---|---|
data-inbox-key | Yes | Your inbox's public key (from the Inboxes page) |
data-api-key | Yes | Your API key with "collect" scope (from Settings → API Keys) |
data-type | No | Widget type: emoji, stars, thumbs, nps, csat, text |
data-position | No | Position: bottom-right, bottom-left, top-right, top-left |
data-theme | No | Theme: light, dark, or custom theme ID |
data-prompt | No | Custom prompt text |
data-inline | No | Set to "true" for inline widget (no floating button, form shows directly on page) |
data-container | No | CSS selector for a container element to mount the widget into (e.g. "#feedback"). Implies inline mode. |
data-context | No | JSON object with custom context metadata (e.g. '{"page":"pricing","userId":"123"}') |
data-debug | No | Set to "true" for console logging (default: false) |
data-track-impressions | No | Set to "false" to disable page view / impression tracking (default: true) |
data-strip-query-params | No | Set to "true" to strip query parameters from tracked URLs for privacy (default: false). Only the domain and path are recorded. |
🎨Widget Types
Pollenate offers six different ways to ask for feedback. Choose the one that fits what you're trying to learn. Not sure which to pick? Emoji and Stars work great for most situations.
Emoji
5-point emoji scale for quick sentiment. Best for: getting a fast read on how people feel.
type="emoji"Stars
Classic 5-star rating. Best for: product reviews, service quality, anything people are used to rating out of 5.
type="stars"Thumbs
Simple up/down voting. Best for: "Was this helpful?" questions on docs, articles, or support pages.
type="thumbs"NPS
Net Promoter Score (0-10). Best for: measuring loyalty — "How likely are you to recommend us?"
type="nps"CSAT
Customer Satisfaction (1-5). Best for: measuring satisfaction after a specific interaction, like a support call or purchase.
type="csat"Text
Open-ended text feedback. Best for: collecting suggestions, bug reports, or detailed comments in the user's own words.
type="text"🎭Customization
🗣️ In plain English: You can change the colors, fonts, and shape of the widget to match your website's look. If you don't want to touch code, you can create custom themes in the Pollenate dashboard under Brand Settings instead.
Customize the widget appearance using CSS variables or create custom themes in the dashboard.
:root {
--pollenate-primary: #f59e0b;
--pollenate-primary-hover: #d97706;
--pollenate-bg: #ffffff;
--pollenate-text: #1e293b;
--pollenate-border: #e2e8f0;
--pollenate-radius: 12px;
}⚛️React Package
For React apps, install @pollenate/react for a fully typed, native React component — no script tags or DOM manipulation needed.
Installation
npm install @pollenate/react
# or
pnpm add @pollenate/react
# or
yarn add @pollenate/reactQuick Start
import { PollenateWidget } from '@pollenate/react';
export function App() {
return (
<PollenateWidget
inboxKey="YOUR_INBOX_KEY"
apiKey="YOUR_API_KEY"
type="stars"
theme="auto"
onSubmit={(event) => {
console.log('Feedback submitted:', event.detail);
}}
/>
);
}Inline Widget
Add inline to render the widget directly in your page flow instead of as a floating button:
<PollenateWidget
inboxKey="my-inbox"
apiKey="pk_live_xxx"
type="thumbs"
inline
prompt="Was this page helpful?"
/>Custom Themed
Override colors, border radius, fonts, and dark-mode colors:
<PollenateWidget
inboxKey="my-inbox"
apiKey="pk_live_xxx"
type="nps"
theme="auto"
primaryColor="#6366f1"
borderRadius={12}
buttonText="Submit Score"
darkPrimaryColor="#818cf8"
darkBgColor="#1e1b4b"
hideBranding
/>Props Reference
| Prop | Type | Default | Description |
|---|---|---|---|
| inboxKey | string | — | Your inbox key (required) |
| apiKey | string | — | Your API key with collect scope (required) |
| type | string | emoji | emoji, stars, thumbs, nps, csat, or text |
| theme | string | light | light, dark, or auto |
| inline | boolean | false | Render inline instead of floating |
| position | string | bottom-right | Floating position (bottom-right, bottom-left, top-right, top-left) |
| prompt | string | — | Custom prompt text above the rating |
| context | object | — | Metadata sent with each submission |
| primaryColor | string | — | Primary accent color (hex) |
| bgColor | string | — | Widget background color (hex) |
| onSubmit | function | — | Callback when feedback is submitted |
| onImpression | function | — | Callback on widget impression |
📦 Full props list: See all available props including dark-mode overrides, animation, and branding options in the npm package README.
🛠️Custom Widgets
Want complete control over your feedback UI? Build your own custom widget using our REST API. This allows you to match your brand perfectly and integrate feedback into any user flow. If you're using React, consider the @pollenate/react package first — it handles all the API calls and UI for you.
💡 When to use custom widgets: Use the API directly when you need a fully custom UI, want to embed feedback in specific flows (like checkout), or integrate with frameworks we don't support yet.
Basic Example
Here's a complete example of a custom feedback form using vanilla HTML/JavaScript:
<form id="custom-feedback">
<p>How would you rate your experience?</p>
<div class="rating-buttons">
<button type="button" data-score="1">😞</button>
<button type="button" data-score="2">😐</button>
<button type="button" data-score="3">🙂</button>
<button type="button" data-score="4">😄</button>
<button type="button" data-score="5">🤩</button>
</div>
<textarea name="comment" placeholder="Any additional feedback?"></textarea>
<button type="submit">Submit</button>
</form>
<script>
let selectedScore = null;
document.querySelectorAll('[data-score]').forEach(btn => {
btn.onclick = () => selectedScore = parseInt(btn.dataset.score);
});
document.getElementById('custom-feedback').onsubmit = async (e) => {
e.preventDefault();
const response = await fetch('https://api.pollenate.dev/collect', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Pollenate-Key': 'YOUR_API_KEY'
},
body: JSON.stringify({
inboxKey: 'YOUR_INBOX_KEY',
type: 'emoji',
score: selectedScore,
comment: e.target.comment.value,
context: {
page: window.location.pathname,
userAgent: navigator.userAgent
}
})
});
if (response.ok) {
alert('Thank you for your feedback!');
}
};
</script>React Example (DIY)
This shows how to build a completely custom feedback UI from scratch using the API directly. For a drop-in solution, see the React Package section above.
import { useState } from 'react';
export function CustomFeedback() {
const [score, setScore] = useState(null);
const [comment, setComment] = useState('');
const [submitted, setSubmitted] = useState(false);
const handleSubmit = async () => {
const response = await fetch('https://api.pollenate.dev/collect', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Pollenate-Key': process.env.POLLENATE_API_KEY
},
body: JSON.stringify({
inboxKey: 'YOUR_INBOX_KEY',
type: 'emoji',
score,
comment,
context: { page: window.location.pathname }
})
});
if (response.ok) setSubmitted(true);
};
if (submitted) return <p>Thanks for your feedback! 🎉</p>;
return (
<div className="feedback-widget">
<p>How was your experience?</p>
<div className="emojis">
{['😞', '😐', '🙂', '😄', '🤩'].map((emoji, i) => (
<button
key={i}
onClick={() => setScore(i + 1)}
className={score === i + 1 ? 'selected' : ''}
>
{emoji}
</button>
))}
</div>
<textarea
value={comment}
onChange={(e) => setComment(e.target.value)}
placeholder="Tell us more..."
/>
<button onClick={handleSubmit} disabled={!score}>
Submit Feedback
</button>
</div>
);
}API Request Format
| Field | Type | Required | Description |
|---|---|---|---|
inboxKey | string | Yes | Your inbox's public key |
type | string | Yes | emoji, stars, thumbs, nps, csat, or text |
score | number | No* | 0-10 for NPS, 1-5 for others, 0/1 for thumbs |
comment | string | No* | Text feedback (max 2000 chars) |
context | object | No | Custom metadata (page URL, user ID, etc.) |
* At least one of score or comment is required
Score Ranges by Type
emojiScore 1-5 (😞 to 🤩)
starsScore 1-5 (⭐ to ⭐⭐⭐⭐⭐)
thumbsScore 0 (👎) or 1 (👍)
npsScore 0-10
csatScore 1-5
textNo score, comment only
Using Context for Insights
The context field lets you attach metadata to each feedback submission. This enables powerful filtering and analysis in your dashboard.
// Example context object
{
"context": {
"page": "/checkout",
"userId": "user_abc123",
"plan": "pro",
"feature": "dark-mode",
"experiment": "new-pricing-v2",
"sessionId": "sess_xyz789"
}
}📋Feedback Pages
🗣️ In plain English: Feedback Pages are like online surveys. You build a form with questions, and Pollenate gives you a link you can share anywhere — by email, text message, on social media, or even printed as a QR code on a poster or business card. No website or coding required. Respondents just open the link and fill it out.
Feedback Pages are standalone, branded feedback forms that you create through the Pollenate dashboard. Unlike widgets (which embed into existing pages), Feedback Pages are hosted at their own URL and can collect multi-question surveys from users.
💡 When to use Feedback Pages vs. Widgets: Use widgets when you want to collect quick, single-question feedback inline on your existing website. Use Feedback Pages when you need a multi-question form, want to share via QR code or printed materials, or need a standalone survey that doesn't require embedding on an existing site.
Key Features
🛠️ Visual Form Builder
Drag-and-drop editor with 7+ question types. Add, edit, delete, and reorder questions with a live preview.
🎨 Custom Branding
Match your brand with custom accent colors, background colors, and brand association. Configurable thank-you messages.
📱 Multiple Sharing Options
Share via direct link, QR code (PNG/SVG), email signature button, embeddable iframe, or print-ready flyer.
📊 Built-in Analytics
View response counts, page views, conversion rates, daily trends, and per-question breakdowns with score distributions.
🔨Form Builder
The form builder lets you create multi-question feedback forms using a visual editor. Each question has a type, prompt, optional description, and can be marked as required.
Supported Question Types
| Type | API Value | Score Range | Description |
|---|---|---|---|
| ⭐ Star Rating | stars | 1–5 | Classic 5-star rating |
| 😄 Emoji | emoji | 1–5 | 5-point emoji sentiment scale |
| 👍 Thumbs | thumbs | 0–1 | Simple thumbs up/down |
| 📊 NPS | nps | 0–10 | Net Promoter Score |
| 😊 CSAT | csat | 1–5 | Customer Satisfaction score |
| 💬 Text | text | — | Open-ended text response (single-line or multi-line, with optional validation) |
| 🔘 Single Choice | single_choice | — | Select one option from a list |
| ☑️ Multiple Choice | multi_choice | — | Select multiple options from a list |
email | — | Email address input with built-in format validation | |
| 📞 Phone | phone | — | Phone number with automatic formatting (US, international, or any) |
| # Number | number | — | Numeric input with optional min/max, step, and unit label |
| 📅 Date | date | — | Date picker with optional time component |
| ▾ Dropdown | dropdown | — | Single selection from a dropdown list (compact for 5+ options) |
| 📝 Content Block | content_block | display only | Rich markdown content between questions (instructions, context) |
| — Section Header | section_header | display only | Section heading and divider to organize the form |
Page Settings
| Setting | Description |
|---|---|
| Title & Description | Shown at the top of the public feedback page |
| URL Slug | Custom URL path (e.g. /f/your-org/my-survey) |
| Status | Draft (private), Published (live), or Archived (closed) |
| Accent & Background Color | Customize the page's accent and background colors to match your brand |
| Thank You Message | Custom message shown after submission, with optional redirect URL |
| Require Contact Info | Ask respondents for name and email before submitting |
| Allow Anonymous | Let respondents skip contact info even if the field is shown |
| Single Submission | Limit to one response per browser using local storage |
🔗Sharing & Embedding
Once your Feedback Page is published, you have multiple ways to share it with respondents.
🔗 Direct Link
Share the URL directly via email, messaging apps, or social media.
https://pollenate.dev/f/your-org/your-page-slug📱 QR Code
Generate QR codes in PNG or SVG format at multiple sizes (128px to 1024px). Perfect for flyers, posters, table tents, and business cards.
GET https://api.pollenate.dev/qr?data=YOUR_PAGE_URL&size=256&format=png&margin=4
Parameters:
data - URL to encode (required)
size - Image size in pixels: 128, 256, 512, 1024 (default: 256)
format - Output format: png or svg (default: png)
margin - Quiet zone margin in modules (default: 4)📧 Email Signature Button
Copy an HTML snippet that renders a branded button in your email signature. The button uses your page's accent color.
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td style="padding: 10px 0;">
<a href="https://pollenate.dev/f/your-org/your-page"
style="display: inline-block; padding: 8px 16px;
background-color: #f59e0b; color: #ffffff;
text-decoration: none; border-radius: 6px;
font-family: Arial, sans-serif; font-size: 14px;">
Share Your Feedback
</a>
</td>
</tr>
</table>🖥️ Embed on Website
Embed the full feedback page on your website using an iframe. Add ?embed=true to remove the header and footer.
<iframe
src="https://pollenate.dev/f/your-org/your-page?embed=true"
width="100%"
height="600"
frameborder="0"
style="border: none; border-radius: 12px;"
title="Feedback Form"
></iframe>🖨️ Print Flyer
Generate a ready-to-print flyer with your page title, description, QR code, and a call-to-action. Uses the Print dialog for easy printing on any device. Great for clinics, restaurants, offices, and events.
⚙️Pages API
Manage Feedback Pages programmatically via the REST API. All endpoints require JWT Bearer token authentication.
/organizations/:orgId/feedback-pagesList all feedback pages. Supports filtering by status and brandId.
/organizations/:orgId/feedback-pagesCreate a new feedback page with title, description, slug, status, and settings.
/organizations/:orgId/feedback-pages/:pageIdGet a feedback page with its questions and submission count.
/organizations/:orgId/feedback-pages/:pageIdUpdate page settings (title, description, status, colors, submission settings, etc.).
/organizations/:orgId/feedback-pages/:pageId/questionsAdd a question to the page.
/organizations/:orgId/feedback-pages/:pageId/statsGet analytics: total responses, page views, conversion rate, daily trends, and per-question breakdowns.
/f/:orgSlug/:pageSlugPublic-facing feedback page (no auth required). Append ?embed=true for iframe mode.
Submit Responses (Public)
/f/:orgSlug/:pageSlug/submitSubmit responses to a published feedback page. Protected by Cloudflare Turnstile.
{
"answers": {
"question-id-1": { "score": 5 },
"question-id-2": { "textValue": "Great experience!" },
"question-id-3": { "multiValues": ["Search", "Referral"] }
},
"respondentName": "Jane Doe",
"respondentEmail": "[email protected]",
"turnstileToken": "CAPTCHA_TOKEN"
}⚡API Overview
🗣️ In plain English: The API is a way for other software (your app, your website's code, or third-party tools) to talk to Pollenate directly — sending feedback, pulling reports, or managing inboxes without going through the dashboard. This section is primarily for developers.
The Pollenate API is a RESTful API that uses JSON for request and response bodies.
https://api.pollenate.devhttp://localhost:8787For the complete API specification, see our OpenAPI 3.1 spec.
📥Feedback Collection
/collectSubmit feedback to an inbox. Requires API key authentication.
Request Body
{
"type": "emoji", // emoji, stars, thumbs, nps, csat, text
"score": 5, // 0-10 for nps, 1-5 for others
"comment": "Loving it!",// Optional text feedback
"context": { // Optional metadata
"page": "/checkout",
"userId": "user_123"
}
}Response
{
"id": "fb_abc123",
"createdAt": "2026-02-04T12:00:00Z"
}📬Inboxes
Inboxes are containers for feedback. Each inbox has a unique key used to submit feedback.
🗣️ In plain English: An inbox is like a labeled folder where feedback lands. You might have an inbox called "Website" for your homepage widget and another called "Post-Visit" for patient surveys. When you set up a widget or survey, you tell it which inbox to deliver feedback to using the inbox's unique key.
/organizations/:orgId/inboxesList all inboxes in an organization.
/organizations/:orgId/inboxesCreate a new inbox.
/organizations/:orgId/inboxes/:inboxId/feedbackGet all feedback for an inbox with pagination and filters.
🔍Semantic Search
🗣️ In plain English: Instead of searching for an exact word, you can describe what you're looking for in everyday language — like "people unhappy with wait times" — and Pollenate's AI will find the most relevant feedback, even if those exact words weren't used. You can use this in the dashboard's search bar too, not just the API.
Search feedback using natural language. Powered by AI embeddings for semantic understanding.
/organizations/:orgId/search{
"query": "users frustrated with checkout",
"limit": 20,
"filters": {
"inboxId": "inbox_123",
"minScore": 1,
"maxScore": 3
}
}🤖AI Agent Integration
🗣️ In plain English: If you use AI chatbots (like a support bot on your website), they can automatically send feedback to Pollenate when a user expresses happiness or frustration. This means you capture real sentiment without asking the user to fill out a separate survey.
AI agents can submit feedback during conversations with users — capturing satisfaction, sentiment, and product feedback in real-time without interrupting the flow.
How it works
When a user expresses satisfaction or frustration during a conversation, the AI agent can submit structured feedback to Pollenate using the same /collect endpoint used by widgets. The feedback appears in your dashboard alongside widget submissions.
Skill File Discovery
Pollenate publishes a skill.md file that AI agents and platforms can use to discover and learn the API. For deeper integration, see the MCP Server section below.
# Install the skill locally for your AI agent
mkdir -p ~/.agent/skills/pollenate
curl -s https://pollenate.dev/skill.md > ~/.agent/skills/pollenate/SKILL.md
curl -s https://pollenate.dev/skill.json > ~/.agent/skills/pollenate/skill.jsonMCP Server (Model Context Protocol)
Pollenate provides a built-in MCP server that allows AI agents and tools like Claude Desktop, Cursor, Windsurf, and other MCP-compatible clients to interact with your feedback data natively — no custom HTTP calls required.
Endpoint: https://api.pollenate.dev/mcp — Uses the Streamable HTTP transport (MCP spec 2025-03-26).
Available Tools
Claude Desktop Configuration
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"pollenate": {
"type": "streamableHttp",
"url": "https://api.pollenate.dev/mcp",
"headers": {
"Authorization": "Bearer pk_live_YOUR_API_KEY"
}
}
}
}Cursor / VS Code Configuration
Add this to your .cursor/mcp.json or VS Code MCP settings:
{
"servers": {
"pollenate": {
"type": "streamableHttp",
"url": "https://api.pollenate.dev/mcp",
"headers": {
"Authorization": "Bearer pk_live_YOUR_API_KEY"
}
}
}
}Authentication: Pass your Pollenate API key via the Authorization: Bearer pk_live_... header (or X-Pollenate-Key header) when configuring your MCP client. The key is automatically used by all tools. You can also pass an apiKey parameter to any tool to override the connection-level key.
Agent Examples
After resolving a support issue
curl -X POST https://api.pollenate.dev/collect \
-H "Content-Type: application/json" \
-H "X-Pollenate-Key: YOUR_API_KEY" \
-d '{
"inboxKey": "support-chat",
"type": "thumbs",
"score": 1,
"comment": "User confirmed their issue was resolved",
"context": {
"source": "ai-agent",
"agentName": "SupportBot",
"topic": "password-reset"
}
}'Capturing conversation sentiment
curl -X POST https://api.pollenate.dev/collect \
-H "Content-Type: application/json" \
-H "X-Pollenate-Key: YOUR_API_KEY" \
-d '{
"inboxKey": "sentiment-tracker",
"type": "emoji",
"score": 4,
"context": {
"source": "ai-agent",
"detectedSentiment": "positive",
"conversationTurns": 8,
"agentModel": "claude-sonnet-4"
}
}'Logging product feedback from conversation
curl -X POST https://api.pollenate.dev/collect \
-H "Content-Type: application/json" \
-H "X-Pollenate-Key: YOUR_API_KEY" \
-d '{
"inboxKey": "product-feedback",
"type": "text",
"comment": "User requested dark mode support — 3rd request this week",
"context": {
"source": "ai-agent",
"category": "feature-request",
"priority": "high"
}
}'Best Practices
- ✦Ask first — Always confirm with the user before submitting feedback on their behalf.
- ✦Use context — Include
source: "ai-agent"in the context so teams can filter agent-submitted feedback. - ✦Group with sessionId — Use the same
sessionIdfor all feedback from one conversation. - ✦Pick the right type — Use
thumbsfor quick yes/no,textfor qualitative feedback,npsfor loyalty scores. - ✦Handle rate limits — If you receive a 429 response, wait for the
retryAfterduration before retrying.
🛡️Content Security Policy (CSP)
🗣️ In plain English: Some websites have strict security rules that block outside tools from running. If your widget isn't working, this might be why. Ask your web developer to check if your site has a "Content Security Policy" — if so, they'll need to add Pollenate to the approved list. The instructions below show them exactly what to do.
If your website uses a Content Security Policy, you'll need to allow the Pollenate widget script and API endpoints. Without the correct CSP directives, the widget will load but fail to submit feedback or track impressions.
Common Error
If you see errors like the following in your browser console, your CSP is blocking the Pollenate widget:
Refused to connect to 'https://api.pollenate.dev/collect' because it violates the document's Content Security Policy.
[Pollenate] Error: TypeError: Failed to fetch. Refused to connect because it violates the document's Content Security Policy.Required CSP Directives
Add the following origins to your Content Security Policy to allow the Pollenate widget to function correctly:
| Directive | Value | Purpose |
|---|---|---|
script-src | https://pollenate.dev | Loads the widget script |
connect-src | https://api.pollenate.dev | Submits feedback and tracks impressions via the API |
style-src | 'unsafe-inline' | The widget injects inline styles for its UI |
Example: HTTP Header
If you set your CSP via an HTTP response header, add the Pollenate origins to the relevant directives:
Content-Security-Policy:
script-src 'self' https://pollenate.dev;
connect-src 'self' https://api.pollenate.dev;
style-src 'self' 'unsafe-inline';Example: HTML Meta Tag
If you set your CSP via a <meta> tag, include the Pollenate origins:
<meta http-equiv="Content-Security-Policy" content="
script-src 'self' https://pollenate.dev;
connect-src 'self' https://api.pollenate.dev;
style-src 'self' 'unsafe-inline';
">Example: Nginx
add_header Content-Security-Policy "
script-src 'self' https://pollenate.dev;
connect-src 'self' https://api.pollenate.dev;
style-src 'self' 'unsafe-inline';
" always;Example: Apache
Header set Content-Security-Policy " script-src 'self' https://pollenate.dev; connect-src 'self' https://api.pollenate.dev; style-src 'self' 'unsafe-inline';"Example: Next.js
In your next.config.js:
const securityHeaders = [
{
key: 'Content-Security-Policy',
value: [
"script-src 'self' https://pollenate.dev",
"connect-src 'self' https://api.pollenate.dev",
"style-src 'self' 'unsafe-inline'",
].join('; '),
},
];
module.exports = {
async headers() {
return [{ source: '/(.*)', headers: securityHeaders }];
},
};Tip: Custom API URL
If you use the data-api-url attribute to point the widget at a custom API endpoint, make sure to add that URL to your connect-src directive instead of (or in addition to) https://api.pollenate.dev.
How to Verify
- Open your browser's Developer Tools (F12 or Cmd+Opt+I).
- Go to the Console tab and look for CSP violation errors.
- Check the Network tab — blocked requests to
api.pollenate.devwill show as(blocked:csp). - After updating your CSP, hard-refresh the page (Ctrl+Shift+R / Cmd+Shift+R) and confirm the errors are gone.
- Submit a test feedback entry and verify it appears in your Pollenate dashboard.
Developer FAQ
Common questions about integrating and using the Pollenate API and widgets.
Do I need a build step to use the widget?
What is an inbox key vs. an API key?
How do I authenticate API requests?
Can I use Pollenate with React?
What widget types are available?
How does the semantic search API work?
Is there a rate limit on the collect endpoint?
Can I listen for widget events in my app?
How are Feedback Pages different from widgets?
Can I embed a Feedback Page on my website?
Why is my widget showing "Failed to fetch" errors?
Ready to start collecting feedback?
Create your free account and have your first widget live in minutes.