Integrate GetResponse with Bolt.new using their REST API v3 and a simple API key in the X-Auth-Token header. Manage contacts and lists, create email campaigns, and build automation funnels from Next.js API routes with your API key stored in a server-side environment variable. GetResponse API calls work in Bolt's WebContainer preview. Webhook notifications for subscriber actions require a deployed Netlify URL.
Add GetResponse Email Marketing to Your Bolt.new App
GetResponse positions itself as the all-in-one marketing platform — a pitch that holds up reasonably well. In addition to the email marketing and automation you would expect, GetResponse includes landing page builders, webinar hosting, e-commerce tools, and conversion funnels, all under one subscription. For Bolt developers building marketing-focused applications, this breadth means a single API integration can cover email collection, campaign sending, and funnel tracking without stitching together multiple tools.
The API integration story is straightforward. GetResponse's REST API v3 uses API key authentication — a single header `X-Auth-Token: api-key {YOUR_KEY}` is the only authentication requirement. There are no OAuth flows, no token exchange, and no signature generation. You include the API key in every request header from your Next.js API route, and GetResponse authenticates based on that key. The API follows standard REST conventions: contacts at `/contacts`, lists (called 'campaigns' in GetResponse's terminology) at `/campaigns`, and custom fields at `/custom-fields`.
The free plan is a notable differentiator: GetResponse offers a free tier with 500 contacts and unlimited email sends — one of the more generous free tiers among email platforms. This makes it practical for developers to build and test GetResponse integrations in Bolt without needing to commit to a paid subscription upfront. When you exceed 500 contacts, the Email Marketing plan starts at $15.58/month.
Integration method
GetResponse's REST API v3 uses a simple API key sent as the X-Auth-Token header in every request. API calls go through a Next.js API route with the key stored in a server-side environment variable. The API supports managing contacts, lists, campaigns, and automation workflows. GetResponse webhook notifications for subscriber events require a deployed Netlify URL to receive incoming POST requests.
Prerequisites
- A GetResponse account at getresponse.com — the free plan supports up to 500 contacts
- A GetResponse API key: go to Tools → Integrations and API → API → Generate API Key
- At least one GetResponse List (Campaign) created — find the list ID from the URL when viewing the list
- A Bolt.new account with a new Next.js project open
- A Netlify account for deployment if you plan to use GetResponse webhook notifications
Step-by-step guide
Get your GetResponse API key and list ID
Get your GetResponse API key and list ID
GetResponse authentication uses a single API key in the `X-Auth-Token` header. The header format is specific: it must be `api-key YOURKEY` with the literal string 'api-key' followed by a space and your actual key. Do not use 'Bearer' or 'Token' — only 'api-key'. This exact format is required for all GetResponse API v3 requests. To generate your API key: in GetResponse, go to Tools → Integrations and API (or Profile → Integrations & API in some versions) → API → Generate API Key. Give it a descriptive name and copy the generated key — it is only shown once. If you need to retrieve it later, you can regenerate a new key, but the old one will be invalidated. GetResponse calls email lists 'Campaigns' in their UI and API — which can be confusing since 'campaign' typically refers to a one-time email broadcast in other platforms. When the GetResponse API refers to `/v3/campaigns`, it means your contact lists, not your email broadcasts (which GetResponse calls 'newsletters'). Keep this terminology distinction in mind when reading the API documentation. To find your list (campaign) ID: in GetResponse, go to Lists → click on a list → the URL contains the ID, typically a short alphanumeric string (e.g., `https://app.getresponse.com/list/{listId}`). You can also retrieve all lists via the API: `GET /v3/campaigns` returns all your lists with their IDs. Store GETRESPONSE_API_KEY as a server-side variable (no NEXT_PUBLIC_ prefix). Store GETRESPONSE_LIST_ID as well — this can technically be public since list IDs are not secret, but server-side is cleaner.
Set up GetResponse API integration. Create .env.local with GETRESPONSE_API_KEY=your-api-key and GETRESPONSE_LIST_ID=your-list-id. Create lib/getresponse.ts with: a base getResponseRequest function that accepts path (string), method (GET|POST|PATCH|DELETE), and body (optional object). The function calls https://api.getresponse.com{path} with X-Auth-Token header as 'api-key {key}'. Add TypeScript interfaces for GetResponseContact (email, name, campaign: {campaignId}, tags as string arrays, dayOfCycle as number) and GetResponseList (campaignId, name, totalSubscribers). Export createContact, getContacts, updateContact, getLists, and getContactByEmail functions.
Paste this in Bolt.new chat
1// lib/getresponse.ts2const API_BASE = 'https://api.getresponse.com';34interface RequestOptions {5 method?: 'GET' | 'POST' | 'PATCH' | 'DELETE';6 body?: unknown;7 queryParams?: Record<string, string | number>;8}910export interface GetResponseContact {11 contactId?: string;12 name: string;13 email: string;14 campaign?: { campaignId: string };15 tags?: Array<{ tagId?: string; name?: string }>;16 customFieldValues?: Array<{ customFieldId: string; value: string[] }>;17 dayOfCycle?: number;18 createdOn?: string;19 subscriptionConfirmedOn?: string;20}2122export interface GetResponseList {23 campaignId: string;24 name: string;25 totalSubscribers?: number;26 description?: string;27}2829async function getResponseRequest<T>(path: string, options: RequestOptions = {}): Promise<T> {30 const apiKey = process.env.GETRESPONSE_API_KEY;31 if (!apiKey) throw new Error('GETRESPONSE_API_KEY is not set');3233 const url = new URL(`${API_BASE}${path}`);34 if (options.queryParams) {35 for (const [key, value] of Object.entries(options.queryParams)) {36 url.searchParams.set(key, String(value));37 }38 }3940 const response = await fetch(url.toString(), {41 method: options.method || 'GET',42 headers: {43 'X-Auth-Token': `api-key ${apiKey}`,44 'Content-Type': 'application/json',45 },46 ...(options.body ? { body: JSON.stringify(options.body) } : {}),47 });4849 if (response.status === 204) return null as T;50 const data = await response.json();5152 if (!response.ok) {53 const message = data.message || data.codeDescription || `GetResponse API error ${response.status}`;54 const error = new Error(message) as Error & { statusCode: number };55 error.statusCode = response.status;56 throw error;57 }5859 return data as T;60}6162export async function createContact(63 email: string,64 name: string,65 listId?: string,66 tags?: string[]67): Promise<void> {68 const campaignId = listId || process.env.GETRESPONSE_LIST_ID;69 if (!campaignId) throw new Error('GetResponse list ID is required');7071 const body: Record<string, unknown> = {72 email,73 name: name || email,74 campaign: { campaignId },75 dayOfCycle: 0,76 };7778 if (tags?.length) {79 body.tags = tags.map((name) => ({ name }));80 }8182 await getResponseRequest('/v3/contacts', { method: 'POST', body });83}8485export async function getContacts(86 listId?: string,87 page = 1,88 perPage = 5089): Promise<GetResponseContact[]> {90 const params: Record<string, string | number> = { page, perPage };91 if (listId) params['query[campaignId]'] = listId;9293 return getResponseRequest<GetResponseContact[]>('/v3/contacts', { queryParams: params });94}9596export async function getContactByEmail(email: string): Promise<GetResponseContact | null> {97 const contacts = await getResponseRequest<GetResponseContact[]>('/v3/contacts', {98 queryParams: { 'query[email]': email },99 });100 return contacts?.[0] || null;101}102103export async function updateContact(104 contactId: string,105 data: Partial<GetResponseContact>106): Promise<void> {107 await getResponseRequest(`/v3/contacts/${contactId}`, { method: 'PATCH', body: data });108}109110export async function getLists(): Promise<GetResponseList[]> {111 return getResponseRequest<GetResponseList[]>('/v3/campaigns');112}Pro tip: GetResponse's API documentation refers to contact lists as 'campaigns'. GET /v3/campaigns returns your lists — not your email campaigns. Email newsletters are at GET /v3/newsletters. Keep this naming convention in mind to avoid confusion when reading error messages and API responses.
Expected result: A lib/getresponse.ts helper with typed functions for contact management and list operations, with the API key configured in .env.local.
Build the contact subscribe API route
Build the contact subscribe API route
The subscribe route is the core of most GetResponse integrations — it takes a user's email from a form submission and adds them to a GetResponse list, optionally with tags and custom field values for segmentation. GetResponse returns a 409 Conflict status code when you try to create a contact that already exists in the specified list. Handle this gracefully — a 409 is not an error that should result in a user-visible failure. The subscriber already exists, which is a success state from the user's perspective. Return a 200 with a message like 'Already subscribed' rather than propagating the 409 to your frontend. GetResponse's confirmation email setup (double opt-in vs single opt-in) is configured per list in the GetResponse UI, not via the API. When you create a contact via the API, GetResponse respects whatever opt-in setting you have configured for that list. If double opt-in is enabled, the subscriber receives a confirmation email and is in an 'unconfirmed' state until they click it. Check your list's confirmation settings in GetResponse → Lists → {list name} → Settings. Custom fields in GetResponse require first creating the field definition via the API or through the GetResponse UI, then referencing it by `customFieldId` when setting values. Fetch your account's custom field definitions from `GET /v3/custom-fields` and store the IDs for fields you want to populate from your app.
Create a GetResponse subscriber API route at app/api/getresponse/subscribe/route.ts using lib/getresponse.ts. Accept POST with: email (required, validate format), name (optional), listId (optional, defaults to GETRESPONSE_LIST_ID), tags (optional string array). Call createContact from lib/getresponse.ts. Handle 409 (already subscribed) gracefully — return 200 with alreadySubscribed: true. Handle other errors with 500. Return 201 with success: true for new subscriptions. Also create a SubscribeForm React component with email input, optional name input, Tailwind styling, loading state, and success message showing 'Check your email to confirm your subscription' if double opt-in might be active.
Paste this in Bolt.new chat
1// app/api/getresponse/subscribe/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { createContact } from '@/lib/getresponse';45const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;67export async function POST(request: NextRequest) {8 const body = await request.json();9 const { email, name, listId, tags } = body;1011 if (!email || !emailRegex.test(email)) {12 return NextResponse.json({ error: 'Valid email address is required' }, { status: 400 });13 }1415 try {16 await createContact(email, name || email, listId, tags);17 return NextResponse.json({ success: true, subscribed: true }, { status: 201 });18 } catch (error) {19 const err = error as Error & { statusCode?: number };2021 // 409 means the contact already exists in the list22 if (err.statusCode === 409) {23 return NextResponse.json({ success: true, alreadySubscribed: true });24 }2526 console.error('GetResponse subscribe error:', err.message);27 return NextResponse.json(28 { error: 'Failed to subscribe. Please try again.' },29 { status: 500 }30 );31 }32}Pro tip: When creating contacts in GetResponse, setting dayOfCycle to 0 means they start from the beginning of any autoresponder cycle attached to the list. If you want a contact to skip the first N days of an autoresponder sequence (for re-subscriptions or users who have already received certain emails), set dayOfCycle to the appropriate number. Use null or omit the field to not enroll them in an autoresponder.
Expected result: A subscribe API route that handles both new subscribers and duplicate subscriptions gracefully, returning clear status information to the frontend.
Build a contact management dashboard with list filtering
Build a contact management dashboard with list filtering
A GetResponse contact dashboard in Bolt.new is useful for marketing teams who want to view contacts, check subscription status, and manage tags without navigating the full GetResponse interface. It is also a common requirement when building multi-tenant applications where each client account needs visibility into their specific contact list. The contacts endpoint `GET /v3/contacts` supports several useful query parameters. `query[campaignId]` filters to a specific list. `query[email]` performs an email search. `perPage` controls the page size (maximum is 1000 per call). `page` enables pagination. `sort[createdOn]` and `sort[updatedOn]` allow sorting. For the lists selector, call `GET /v3/campaigns` to retrieve all lists and display them in a dropdown. Switching the selected list re-fetches the contacts for that list. If you have a large number of contacts, implement server-side pagination rather than loading all contacts at once. Contact tags in GetResponse are returned as an array of `{ tagId, name }` objects on each contact. To add a tag to a contact, use `PATCH /v3/contacts/{contactId}` with a tags array. To create new tags, use `POST /v3/tags`. For a simple tagging interface, pre-fetch the available tags from `GET /v3/tags` and present them as a checkbox list on the contact detail view.
Create GetResponse contact management API routes. Build: GET /api/getresponse/lists that returns all lists using getLists(), GET /api/getresponse/contacts that accepts query params listId, page (defaults 1), perPage (defaults 50, max 100), and q (email search), returns paginated contacts array from getContacts(). Create a ContactManagerDashboard React component with: a list selector dropdown at the top, a search input for email filtering, a contacts table with name, email, date subscribed, and tags columns, pagination controls (previous/next), and a contact count showing 'Showing X-Y of Z contacts'. Use SWR or useEffect for data fetching with loading states.
Paste this in Bolt.new chat
1// app/api/getresponse/contacts/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { getContacts } from '@/lib/getresponse';45export async function GET(request: NextRequest) {6 const { searchParams } = new URL(request.url);7 const listId = searchParams.get('listId') || process.env.GETRESPONSE_LIST_ID || undefined;8 const page = parseInt(searchParams.get('page') || '1', 10);9 const perPage = Math.min(parseInt(searchParams.get('perPage') || '50', 10), 100);1011 try {12 const contacts = await getContacts(listId, page, perPage);13 return NextResponse.json({14 contacts,15 page,16 perPage,17 hasMore: contacts.length === perPage,18 });19 } catch (error) {20 return NextResponse.json(21 { error: (error as Error).message },22 { status: 500 }23 );24 }25}2627// app/api/getresponse/lists/route.ts28// (create as a separate file)29import { NextResponse } from 'next/server';30import { getLists } from '@/lib/getresponse';3132export async function GET() {33 try {34 const lists = await getLists();35 return NextResponse.json(lists);36 } catch (error) {37 return NextResponse.json(38 { error: (error as Error).message },39 { status: 500 }40 );41 }42}Pro tip: GetResponse's contacts API returns contacts in creation date order by default. For dashboards showing recent activity, this is useful. For dashboards prioritizing engagement, consider fetching contacts and sorting client-side by last activity. GetResponse's API does not support server-side sorting by engagement score in v3.
Expected result: A contacts API route with list filtering and pagination, and a lists API route, ready for a contact management dashboard component.
Deploy to Netlify and configure GetResponse webhooks
Deploy to Netlify and configure GetResponse webhooks
GetResponse API calls work in Bolt.new's WebContainer during development — contact creation, list fetching, and tag operations are all outbound HTTP requests that the WebContainer supports. Build and test all of these features in the Bolt preview before deploying. Deployment to Netlify moves your app to a real server environment where environment variables are stable, OAuth redirects have fixed URLs, and webhook endpoints can receive incoming connections. To deploy: click Deploy in Bolt.new, connect Netlify via OAuth, wait for the build. In Netlify dashboard → Site Configuration → Environment Variables, add: GETRESPONSE_API_KEY and GETRESPONSE_LIST_ID. Trigger a redeploy. GetResponse supports webhooks for subscriber lifecycle events — contact subscribed, unsubscribed, email opened, link clicked. To configure: in GetResponse, go to Tools → Integrations and API → Webhooks → Create a Webhook. Enter your Netlify URL (https://your-app.netlify.app/api/getresponse/webhook), select the list and events to subscribe to. GetResponse sends POST requests to this URL when events occur. GetResponse also supports webhook verification using a shared secret. When creating the webhook, you can add a secret key, and GetResponse includes an HMAC signature in the request header. Verify this signature in your webhook handler to ensure the request is genuinely from GetResponse and not a malicious third party. Webhooks cannot be received in Bolt's WebContainer preview. This is a core architectural constraint — the browser-based runtime has no persistent public URL and cannot accept incoming HTTP connections. Always configure and test webhooks using your deployed Netlify domain.
Create a GetResponse webhook handler at app/api/getresponse/webhook/route.ts. Accept POST from GetResponse subscriber events. Parse JSON body with event type ('subscribe' | 'unsubscribe' | 'email_open' | 'click' etc) and subscriber data. For subscribe events, log the new subscriber email. For unsubscribe events, log the email and TODO comment to update database. Return 200 for all events. Add netlify.toml with Next.js build configuration. Include a code comment explaining webhooks require a deployed URL and cannot work in Bolt's WebContainer preview.
Paste this in Bolt.new chat
1// app/api/getresponse/webhook/route.ts2// NOTE: GetResponse webhooks require a publicly accessible URL.3// Deploy to Netlify first, then configure in GetResponse Tools → Integrations → Webhooks.4import { NextRequest, NextResponse } from 'next/server';56interface GetResponseWebhookPayload {7 action: string;8 contact?: {9 contactId: string;10 email: string;11 name: string;12 };13 newsletter?: {14 newsletterId: string;15 subject: string;16 };17 clickedUrl?: string;18 occurredAt?: string;19}2021export async function POST(request: NextRequest) {22 let payload: GetResponseWebhookPayload;23 try {24 payload = await request.json();25 } catch {26 return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 });27 }2829 const { action, contact } = payload;30 const email = contact?.email;3132 switch (action) {33 case 'subscribe':34 console.log(`GetResponse: New subscriber — ${email}`);35 // TODO: Create user record in your database if needed36 break;3738 case 'unsubscribe':39 console.log(`GetResponse: Unsubscribe — ${email}`);40 // TODO: Update subscription status in Supabase41 break;4243 case 'email_open':44 console.log(`GetResponse: Email opened by ${email} — ${payload.newsletter?.subject}`);45 break;4647 case 'click':48 console.log(`GetResponse: Link clicked by ${email}: ${payload.clickedUrl}`);49 break;5051 default:52 console.log(`GetResponse unhandled webhook action: ${action}`);53 }5455 return NextResponse.json({ received: true });56}Pro tip: GetResponse webhooks support HMAC signature verification. When creating the webhook in GetResponse, add a secret value. GetResponse includes an X-GETRESPONSE-SIGNATURE header with a SHA256 HMAC of the request body signed with your secret. Verify this signature in production to prevent spoofed webhook requests.
Expected result: A deployed Netlify app with GetResponse subscriber management working in production and a webhook handler receiving subscriber lifecycle events.
Common use cases
Newsletter Signup with List Assignment
When a visitor subscribes to your newsletter on a Bolt.new landing page, add them to the appropriate GetResponse list (campaign) based on their interests or the page they signed up from. Optionally add tags and custom field values at signup time for better segmentation in GetResponse automations.
Create a newsletter signup integration. Build an API route at app/api/getresponse/subscribe/route.ts using GETRESPONSE_API_KEY and GETRESPONSE_LIST_ID env vars. Accept POST with email (required), name (optional), and tags (optional string array). Call GetResponse POST /v3/contacts to create the contact. Map name to the name field, email to the email field, and tags to the tags array. Add dayOfCycle: 0. Return 201 for success or 409 if the contact already exists (GetResponse returns 409 for duplicate emails). Create a NewsletterForm React component with email and name inputs, Tailwind styling, and a success/error state.
Copy this prompt to try it in Bolt.new
Contact Management Dashboard
Build an internal dashboard for managing GetResponse contacts across multiple lists. Display contacts in a searchable table with their subscription date, tags, and last activity. Allow filtering by list and exporting selected contacts.
Build a GetResponse contact management dashboard. Create API routes: GET /api/getresponse/contacts that calls GET https://api.getresponse.com/v3/contacts with X-Auth-Token header and supports query params for listId, perPage (up to 100), page, and query[email] for search. GET /api/getresponse/lists to fetch all available lists using GET /v3/campaigns. Create a ContactDashboard React component with a list selector dropdown, a searchable contacts table showing name, email, created date, and tags, and a pagination control. Add a loading skeleton state.
Copy this prompt to try it in Bolt.new
Drip Campaign Trigger on User Action
When a user completes a key milestone in your app (finishes onboarding, reaches a usage goal), add them to a specific GetResponse automation workflow by assigning them to a designated list that has an automation sequence attached. Track completion events as custom field values for personalized email content.
Create an automation trigger for user milestones. Build an API route at app/api/getresponse/trigger/route.ts. Accept POST with email, milestoneType ('onboarding_complete' | 'first_purchase' | 'power_user'), and completedAt (ISO string). Use GETRESPONSE_API_KEY to: first GET /v3/contacts?query[email]={email} to find the contact, then if found PATCH /v3/contacts/{contactId} to update custom fields (mx_MilestoneType, mx_MilestoneDate) and add the milestone as a tag. If the contact is not found, create them. Use GETRESPONSE_MILESTONE_LIST_ID env var to specify which automation-triggering list to use.
Copy this prompt to try it in Bolt.new
Troubleshooting
GetResponse API returns 401 Unauthorized with 'Invalid credentials' message
Cause: The X-Auth-Token header format is incorrect. GetResponse requires the header value to be exactly 'api-key {YOUR_KEY}' — the literal text 'api-key' followed by a space and your key. Using 'Bearer' or just the key alone results in a 401.
Solution: Verify the header value format: 'X-Auth-Token': 'api-key ' + process.env.GETRESPONSE_API_KEY — with a space between 'api-key' and the actual key. Also confirm the API key is stored in GETRESPONSE_API_KEY (not NEXT_PUBLIC_GETRESPONSE_API_KEY) and has not been regenerated since it was saved.
1headers: {2 'X-Auth-Token': `api-key ${process.env.GETRESPONSE_API_KEY}`,3 'Content-Type': 'application/json',4}Contact creation returns 409 Conflict for every submission
Cause: The contact already exists in the specified GetResponse list. GetResponse considers a contact a duplicate if they have the same email address in the same campaign (list). Multiple submissions with the same email to the same list will always return 409.
Solution: Handle 409 responses gracefully in your API route — treat them as successful operations with an alreadySubscribed: true flag rather than as errors. From the user's perspective, they are already on the list, which is the desired outcome. If you need to update data for existing subscribers, use PATCH /v3/contacts/{contactId} instead of POST /v3/contacts.
Contacts are added but not appearing in GetResponse because double opt-in confirmation email is not arriving
Cause: GetResponse's double opt-in confirmation email may be going to spam, or the list has double opt-in enabled and the subscriber must confirm before they appear as active. API-created contacts follow the list's opt-in settings.
Solution: Check the contact exists in GetResponse by searching All Contacts (including unconfirmed subscribers). In GetResponse → Lists → select the list → Settings → check the opt-in setting. For API-based signups where you control the consent collection, single opt-in is often appropriate. You can override double opt-in for specific contacts by checking GetResponse's API documentation for the skipConfirmation parameter (if available in your plan).
GetResponse webhooks are not received during Bolt.new development
Cause: GetResponse webhook POST requests require a publicly accessible URL. Bolt.new's WebContainer runs in a browser tab and cannot receive incoming HTTP connections. The dynamic preview URL is not a stable webhook target.
Solution: Deploy to Netlify and configure the GetResponse webhook in Tools → Integrations → Webhooks with your Netlify URL. This is a fundamental WebContainer limitation. After deploying, use GetResponse's webhook test feature (if available) to verify delivery to your endpoint.
Best practices
- Always format the X-Auth-Token header as 'api-key YOUR_KEY' with the literal 'api-key' prefix — this is GetResponse's required format and differs from the 'Bearer' token format used by most modern APIs
- Handle 409 Conflict responses from the contacts endpoint gracefully — they indicate the contact already exists, which is often a success state rather than an error
- Store your API key in a server-side environment variable only — the key grants full access to your GetResponse account including contacts, campaigns, and billing information
- Note that GetResponse calls contact lists 'campaigns' in their API — GET /v3/campaigns fetches your lists, not your email broadcasts; keep this naming convention in mind when reading API responses
- Set dayOfCycle: 0 when creating contacts via API to enroll them from the beginning of any autoresponder sequence attached to the list
- Test your API routes in Bolt.new's WebContainer preview before deploying — GetResponse API calls work in the preview since they are outbound HTTP requests
- Deploy to Netlify before configuring GetResponse webhooks — incoming webhook delivery requires a public URL that the WebContainer cannot provide
- Use GetResponse's custom fields for app-specific subscriber data — create fields via the API or GetResponse UI first, then reference them by customFieldId when setting values
Alternatives
AWeber focuses exclusively on email marketing without the landing pages, webinars, and funnels that GetResponse bundles — simpler and more reliable for pure email use cases.
Mailchimp has a larger user base, more integrations, and a generous free tier (500 contacts) — better for teams that want a widely-recognized platform with extensive third-party integration support.
ConvertKit is designed for individual creators with tag-based subscriber management — better for bloggers and course creators than GetResponse's more business-focused marketing automation.
Constant Contact is a simpler email marketing tool focused on small businesses — less feature-rich than GetResponse's all-in-one platform but easier to use for teams that do not need landing pages or webinars.
Frequently asked questions
Can GetResponse API calls work in Bolt.new's WebContainer during development?
Yes. GetResponse API calls are standard outbound HTTPS requests — these work in Bolt's WebContainer preview. You can build and test contact creation, list management, and tag assignment features during development. The only GetResponse feature requiring deployment is webhook delivery, which needs a publicly accessible URL to receive incoming POST requests from GetResponse's servers.
Why does GetResponse call its contact lists 'campaigns' in the API?
GetResponse's terminology evolved differently from other email platforms. In GetResponse, a 'campaign' is a contact list (subscriber group), while email broadcasts are called 'newsletters'. This is confusing if you come from Mailchimp or ConvertKit where 'campaign' means a one-time email send. When you see /v3/campaigns in the API documentation, it refers to contact lists. Email sends are at /v3/newsletters.
What is the GetResponse free plan limit?
GetResponse's free plan supports up to 500 contacts with unlimited email sends, 1 landing page, and basic marketing automation. The free plan does not include the Conversion Funnel, webinars, or advanced automation features. For development and testing, the free plan is more than sufficient. Paid plans start at approximately $15.58/month for 1,000 contacts.
How do I add custom fields to GetResponse contacts from my Bolt app?
First create the custom field definition in GetResponse (via Tools → Custom Fields or POST /v3/custom-fields), note the resulting customFieldId. Then when creating or updating contacts, include a customFieldValues array in the request body with objects containing customFieldId and value (as a string array). Custom field IDs are account-specific — store them as environment variables like GETRESPONSE_PLAN_FIELD_ID.
Does GetResponse support double opt-in and how does it affect API contact creation?
Yes, GetResponse supports double opt-in configured per list. When you create a contact via the API and the list has double opt-in enabled, GetResponse sends a confirmation email to the subscriber. The contact appears in your list as unconfirmed until they click the confirmation link. If your use case involves collecting consent before adding subscribers (common for opt-in forms), double opt-in is appropriate. For internal tools where you are adding contacts with prior consent, single opt-in is simpler.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation