mcpField
R
reach

reach

github.com/hostingerMarketing & growth2655 installsUpdated 19w ago
Repository

About reach

A reference skill for using the Hostinger Reach API for email marketing. It covers contact management, rule-based audience segments, and sender profiles, with examples for API requests and Python, TypeScript, and PHP SDKs.

Key features

  1. 01Create, list, and delete contacts
  2. 02Filter contacts by subscription status
  3. 03Build segments with condition operators
  4. 04List segment members and details
  5. 05View sender profiles
  6. 06Examples for Python, TypeScript, and PHP

Use cases

  1. 01Maintaining email marketing contact lists
  2. 02Targeting subscribers by engagement or status
  3. 03Checking sender profiles and segment membership

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/hostinger/hostinger-agent-skills --skill reach

After installing, type/reachin Claude Code to confirm it loaded.

Details

From the project README

Hostinger Reach (Email Marketing)

The Reach API provides email marketing capabilities — managing contacts, creating segments for targeted campaigns, and working with sender profiles.

Table of Contents

Core Concepts

Contacts

Contacts are email recipients in your marketing system. Each contact has basic information (name, email, surname) and a subscription status. If double opt-in is enabled, new contacts start with a pending status and receive a confirmation email.

Segments

Segments group contacts based on specific criteria (email, name, subscription status, engagement metrics, etc.). Segments support complex filtering with operators like equals, contains, gte, lte, opened, clicked, etc.

Profiles

Sender profiles represent the email identity used to send campaigns. Each profile has basic information and is associated with your account.

Contact Groups

Groups are a way to organize contacts (deprecated in favor of segments).

Subscription Status

Contacts can have different subscription statuses that determine whether they receive emails. Status can be used as a filter when listing contacts.

Common Patterns

Create and Manage Contacts
# Create a new contact (direct)
curl -X POST "https://developers.hostinger.com/api/reach/v1/contacts" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "name": "John",
    "surname": "Doe",
    "phone": "+15551234567",
    "note": "Met at conference"
  }'

# Create a new contact (scoped to a specific sender profile)
curl -X POST "https://developers.hostinger.com/api/reach/v1/profiles/{profileUuid}/contacts" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "name": "John",
    "surname": "Doe"
  }'

# List contacts (paginated)
curl -X GET "https://developers.hostinger.com/api/reach/v1/contacts?page=1" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

# Filter contacts by subscription status
curl -X GET "https://developers.hostinger.com/api/reach/v1/contacts?subscription_status=active" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

# List contact groups
curl -X GET "https://developers.hostinger.com/api/reach/v1/contacts/groups" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

# Delete a contact
curl -X DELETE "https://developers.hostinger.com/api/reach/v1/contacts/{uuid}" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

Python SDK:

from hostinger_api import Hostinger

client = Hostinger(api_token="YOUR_API_TOKEN")

# List contacts
contacts = client.reach.contacts.list(page=1)
for contact in contacts:
    print(f"{contact.name} <{contact.email}>")

TypeScript SDK:

import { Hostinger } from "hostinger-api-sdk";

const client = new Hostinger({ apiToken: "YOUR_API_TOKEN" });

const contacts = await client.reach.contacts.list({ page: 1 });
for (const contact of contacts) {
  console.log(`${contact.name} <${contact.email}>`);
}

PHP SDK:

use Hostinger\Api\HostingerApi;

$client = new HostingerApi('YOUR_API_TOKEN');

$contacts = $client->reach->contacts->list(['page' => 1]);
foreach ($contacts as $contact) {
    echo "{$contact->name} <{$contact->email}>\n";
}
Work with Segments
# List all segments
curl -X GET "https://developers.hostinger.com/api/reach/v1/segmentation/segments" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

# Create a segment (e.g., engaged subscribers who opened emails)
curl -X POST "https://developers.hostinger.com/api/reach/v1/segmentation/segments" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Engaged Subscribers",
    "logic": "and",
    "conditions": [
      {
        "field": "subscription_status",
        "operator": "equals",
        "value": "active"
      },
      {
        "field": "email_engagement",
        "operator": "opened"
      }
    ]
  }'

# Get segment details
curl -X GET "https://developers.hostinger.com/api/reach/v1/segmentation/segments/{segmentUuid}" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

# List contacts in a segment (paginated)
curl -X GET "https://developers.hostinger.com/api/reach/v1/segmentation/segments/{segmentUuid}/contacts?page=1&per_page=50" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"
Manage Profiles
# List all sender profiles
curl -X GET "https://developers.hostinger.com/api/reach/v1/profiles" \
  -H "Authorization: Bearer $HOSTINGER_API_TOKEN"

API Reference

Contacts
MethodEndpointDescription
GET/api/reach/v1/contactsList contacts (paginated, filterable)
POST/api/reach/v1/contactsCreate a contact (direct)
POST/api/reach/v1/profiles/{profileUuid}/contactsCreate a contact scoped to a sender profile
GET/api/reach/v1/contacts/groupsList contact groups
DELETE/api/reach/v1/contacts/{uuid}Delete a contact
Segments
MethodEndpointDescription
GET/api/reach/v1/segmentation/segmentsList all segments
POST/api/reach/v1/segmentation/segmentsCreate a new segment
GET/api/reach/v1/segmentation/segments/{segmentUuid}Get segment details
GET/api/reach/v1/segmentation/segments/{segmentUuid}/contactsList segment contacts
Profiles
MethodEndpointDescription
GET/api/reach/v1/profilesList sender profiles
Contact Query Parameters
ParameterDescription
pagePage number
group_uuidFilter by group UUID
subscription_statusFilter by subscription status
Segment Condition Operators
OperatorDescription
equals / not_equalsExact match
contains / not_containsPartial match
gte / lteGreater/less than or equal
existsField has a value
within_last_days / not_within_last_daysDate range
older_than_daysOlder than N days
opened / not_openedEmail open engagement
clicked / not_clickedEmail click engagement
bounced / not_bouncedBounce status
delivered / not_deliveredDelivery status
unsubscribed / not_unsubscribedUnsubscribe status

Best Practices

Contact Management
  • Use the direct POST /contacts endpoint for general contact creation; use POST /profiles/{profileUuid}/contacts when the contact must be tied to a specific sender profile
  • Prefer segments over contact groups for organizing contacts — groups are legacy
  • Enable double opt-in for compliance with email marketing regulations (GDPR, CAN-SPAM)
  • Clean your contact list regularly by removing bounced and unsubscribed contacts
Segmentation
  • Use and logic for narrow, precise targeting
  • Use or logic for broader audience reach
  • Combine engagement operators (opened, clicked) with time-based operators for re-engagement campaigns
  • Create segments before campaigns to preview audience size
Profiles
  • Verify sender profiles to improve deliverability
  • Use consistent sender identity across campaigns

Troubleshooting

Contact Not Receiving Emails
  • Check subscription status — contact may be unsubscribed or pending
  • If double opt-in is enabled, contact must confirm their email first
  • Verify the contact's email address is valid and not bouncing
Segment Returns No Contacts
  • Verify conditions and operators are correct
  • Check that logic field (and/or) matches your intent
  • Ensure contacts exist that match all/any conditions
422 Validation Error on Contact Creation
  • Missing required fields (email is required)
  • Invalid email format
  • Duplicate email address in the system

References

Comments

Markdown supported