Ditto Recruitment Strategies for Claude Code

For Claude Code agents and AI coding assistants. This guide documents how to create effective research groups for Ditto synthetic research studies. It covers demographic filtering, industry proxy mapping, the over-recruit-and-curate methodology, and every known pitfall from 50+ production studies.

The core principle: The quality of a Ditto study is bounded by the quality of the research group. Even perfect questions produce poor insights if the participants are wrong for the research topic.

1. Research Group API Basics

Create a Research Group

curl -s -X POST "https://app.askditto.io/v1/research-groups/recruit" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "US Adults 28-45 Product Feedback",
    "description": "American adults for product concept testing",
    "group_size": 10,
    "filters": {
      "country": "USA",
      "age_min": 28,
      "age_max": 45
    },
    "sampling_method": "random",
    "deduplicate": true
  }'

Response

{
  "group": {
    "id": 184,
    "uuid": "60a157f6620b43f6b0b9dbbe98eb2420",
    "name": "US Adults 28-45 Product Feedback",
    "agent_count": 10
  }
}
Save the uuid value. You need the UUID (not the numeric ID) when creating studies. Using group_id instead of research_group_uuid when creating a study will result in an empty study with no participants.

Request Schema

{
  "name": "string (required) - descriptive name for the group",
  "description": "string (optional) - what these participants represent",
  "group_size": "integer (required, 1-20) - MUST use group_size, NOT size",
  "filters": {
    "country": "string (required) - USA, UK, Germany, or Canada",
    "state": "string (optional) - 2-LETTER CODE ONLY for US states",
    "age_min": "integer (optional) - minimum age",
    "age_max": "integer (optional) - maximum age",
    "gender": "string (optional) - male, female, non_binary",
    "is_parent": "boolean (optional) - true or false",
    "education": "string (optional) - high_school, bachelors, masters, phd",
    "employment": "string (optional) - employed, self_employed, unemployed, retired",
    "industry": "array of strings (optional) - industry categories"
  },
  "sampling_method": "string (optional, default: random)",
  "deduplicate": "boolean (optional, default: true)"
}

2. Complete Filter Reference

FilterTypeValuesRequiredNotes
countrystring"USA", "UK", "Germany", "Canada"YesOnly these 4 countries. See Section 3 for aliases.
statestring"TX", "CA", "MI", "NY"No2-LETTER CODES ONLY. Full names return 0 agents. See Section 4.
age_mininteger18, 25, 30NoRecommended for all studies. Improves relevance.
age_maxinteger45, 55, 65NoRecommended for all studies.
genderstring"male", "female", "non_binary"NoOnly use when gender is critical to the research (e.g., women's health).
is_parentbooleantrue, falseNoUseful for family/children/education research.
educationstring"high_school", "bachelors", "masters", "phd"NoUse for professional/academic research.
employmentstring"employed", "self_employed", "unemployed", "retired"NoUse for B2B research or retirement studies.
industryarray of stringsSee Section 5NoFor niche audience targeting. See proxy mapping for workarounds.
Filters that do NOT exist (will cause API errors):

3. Country Availability and Aliases

Ditto supports 4 countries for research groups. The API accepts multiple name variants:

CountryPrimary ValueAlso Accepted
United States"USA""United States", "US", "U.S.A."
United Kingdom"UK""United Kingdom", "Great Britain", "England", "Scotland", "Wales"
Germany"Germany"(primary only)
Canada"Canada"(primary only)
Recommendation: Always use the primary value ("USA", "UK", "Germany", "Canada") for consistency. The aliases work but the primary values are most reliable.

Ditto covers 15+ countries total representing 65% of global GDP, but these 4 are the most extensively calibrated and available via the API.

4. US State Filtering (Critical)

THE SINGLE MOST COMMON DITTO API MISTAKE: Using full state names instead of 2-letter codes. "Michigan" returns 0 agents. "MI" returns agents correctly. The API does NOT return an error - it silently returns an empty group.

Correct State Codes

StateCorrectWrong (Returns 0)
Michigan"MI""Michigan"
Texas"TX""Texas"
California"CA""California"
Pennsylvania"PA""Pennsylvania"
New York"NY""New York"
Florida"FL""Florida"
Ohio"OH""Ohio"
Arizona"AZ""Arizona"
Wisconsin"WI""Wisconsin"
Georgia"GA""Georgia"
Nevada"NV""Nevada"
New Hampshire"NH""New Hampshire"
North Carolina"NC""North Carolina"
Minnesota"MN""Minnesota"

Example: Creating a State-Filtered Group

# CORRECT - uses 2-letter code
curl -s -X POST "https://app.askditto.io/v1/research-groups/recruit" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "MI State Voters",
    "group_size": 10,
    "filters": {
      "country": "USA",
      "state": "MI",
      "age_min": 25,
      "age_max": 70
    }
  }'

# WRONG - full name, will return 0 agents silently
# "state": "Michigan"  <-- DO NOT DO THIS

Naming Convention for State Groups

Use the format "{StateCode} State Voters" to enable group reuse:

Before creating a new state group, check if one already exists:

curl -s "https://app.askditto.io/v1/research-groups" \
  -H "Authorization: Bearer YOUR_API_KEY"

Look for groups with names matching the "{StateCode} State Voters" pattern. If one exists and was created with the correct state filter, reuse it.

5. Industry Proxy Mapping

Ditto's industry filters cover broad categories. When your target audience does not have an exact match, use these validated proxy mappings:

Validated Industry Proxy Table

If You Need...Use This Industry FilterWhy It WorksValidated In
Auto mechanics / repair shops "Automotive Manufacturing" Includes service advisors, technicians, and parts specialists MotorMinds study (10 participants)
Pet owners Age 30-60 + USA filter (no industry) General population screen. Use Q1 to filter: "Do you have a pet?" VetVivo study (20 participants)
Parents of young children Age 25-40 + is_parent: true Direct filter available. Do NOT use "Education" (gets teachers) Feel Good Games study (20 participants)
Healthcare workers ["Healthcare", "Home Healthcare"] Combine both to get wider coverage. "Healthcare" alone may miss home care staff. PatientCompanion, TimeSmart studies
Nurses / elder care staff "Healthcare" + age 25-55 Healthcare filter covers clinical roles. Age range narrows to working staff. PatientCompanion study (20 participants)
Civil engineers "Civil Engineering" or "Construction" "Civil Engineering" is exact match. "Construction" is broader alternative. Sidian study (10 participants)
Construction trades ["Construction", "Commercial Construction", "Residential Construction"] Multiple construction categories cover different specialisations. (validated via filter testing)
Security professionals "Cybersecurity" Exact match. Do NOT use "IT" (too broad, includes helpdesk and sysadmin). NexRisx study (8 participants)
Frequent travellers Age 25-55 + USA + employment: "employed" Working professionals travel most. No "Travel" industry exists. Screen in Q1. Airfairness study (20 participants)
Retail workers "Grocery Retail" and various retail categories Multiple retail categories exist. Check API for current options. (validated via filter testing)
Office workers / knowledge workers ["Information Services", "Government Administration"] Broad categories that capture desk-based professionals. (validated via filter testing)
Logistics / supply chain ["Freight & Logistics", "Transportation"] Combined covers warehouse, transport, and supply chain roles. (validated via filter testing)
Eye care practitioners "Healthcare" + specific Q1 screen No "Optometry" filter. Use Healthcare and screen with: "What is your role in eye care?" Mandel Diagnostics study (15 participants)

The Q1 Screening Strategy

When exact industry filters do not exist, use broad demographic filters and make Question 1 a relevance screen:

Pattern: Use age + country filters (broad), then make Q1: "In your current or past work, how often do you [industry-specific task]?" This immediately reveals whether the persona has relevant experience, allowing you to identify and weight relevant responses during analysis.

This strategy was used successfully for:

6. The Over-Recruit and Curate Strategy

For niche audiences where demographic filters cannot perfectly target the desired participants, use the over-recruit and curate strategy.

The Process

  1. Recruit 15-20 participants (more than you need for the study)
  2. Review each participant's profile (name, occupation, summary, age, location)
  3. Score each participant for relevance (see Section 7)
  4. Create the study using the full group UUID
  5. Remove low-relevance agents from the STUDY (not the group)
  6. Run the study with the remaining 8-12 curated participants

Why This Works

Ditto's population is broad. An "Automotive Manufacturing" filter might return a mix of service advisors, assembly line workers, and supply chain managers. For a study about auto parts sourcing, service advisors are ideal, assembly line workers are somewhat relevant, and supply chain managers may not be useful. Over-recruiting lets you select the best participants instead of hoping the random sample is good enough.

API Workflow

# Step 1: Over-recruit (15-20 participants)
curl -s -X POST "https://app.askditto.io/v1/research-groups/recruit" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "MotorMinds - Auto Service Professionals",
    "group_size": 15,
    "filters": {
      "industry": ["Automotive Manufacturing"],
      "age_min": 25,
      "age_max": 60
    }
  }'

# Step 2: Review profiles
curl -s "https://app.askditto.io/v1/research-groups/{group_id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Step 3: Create study (use uuid, not id)
curl -s -X POST "https://app.askditto.io/v1/research-studies" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Auto Parts Sourcing Study",
    "objective": "Understand parts sourcing pain points for auto repair shops",
    "research_group_uuid": "uuid-from-step-1"
  }'

# Step 4: Remove irrelevant agents from the STUDY
curl -s -X POST "https://app.askditto.io/v1/research-studies/{study_id}/agents/remove" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_ids": [irrelevant_id_1, irrelevant_id_2, irrelevant_id_3]}'

# Step 5: Now ask questions to the curated group
Important: Removing agents from a STUDY does not remove them from the research GROUP. The group remains intact for potential reuse. Only study membership is affected.

7. Participant Relevance Scoring

When reviewing participant profiles after over-recruiting, score each persona using this framework:

ScoreLevelCriteriaAction
10 High Job title directly matches target. Summary confirms relevant experience. Keep in study.
5 Medium Related role or industry experience mentioned in summary. Not exact match but useful perspective. Keep in study if you need more participants.
1 Low Tangentially related. May have occasional exposure to the task. Remove unless you are short on participants.
0 None Completely unrelated role. No relevant experience visible in profile. Always remove from study.

What to Check in Profiles

The participant profile from GET /v1/research-groups/{group_id} includes:

Real Example: MotorMinds Participant Review

Group of 10 from "Automotive Manufacturing" filter:

NameOccupationScoreWhy
James NeriMaintenance Technician10 (High)Summary: "Spanish-speaking mechanic" - direct match
Michael MclimansMaintenance Technician10 (High)Summary: "automotive tech" - direct match
Sonny CarrizalesUnemployed10 (High)Summary: "former auto parts salesman" - deep relevant experience
Jaime TejadaSales Manager5 (Medium)Summary: "auto sales specialist" - sells cars, not parts, but knows industry
Joseph AkinFacilities Manager5 (Medium)Equipment maintenance experience, orders parts
OthersProduction/QA/Data1-0 (Low/None)Manufacturing-adjacent but not parts sourcing

In this case, the full group of 10 was used because even the lower-scoring participants had tangential automotive experience. For a more niche topic, the low-scoring participants would be removed.

8. Removing Agents from Studies and Groups

Remove Agents from a Study

curl -s -X POST "https://app.askditto.io/v1/research-studies/{study_id}/agents/remove" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_ids": [123, 456, 789]}'

Agents remain in the research group. Only their participation in this specific study is removed.

Remove Agents from a Group

curl -s -X POST "https://app.askditto.io/v1/research-groups/{group_id}/agents/remove" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_ids": [123, 456]}'

This permanently removes agents from the group. Use sparingly.

9. Appending to Existing Groups

Add more participants to an existing group with different or additional filters:

curl -s -X POST "https://app.askditto.io/v1/research-groups/{group_uuid}/append" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": {"country": "USA", "state": "GA", "age_min": 40, "age_max": 60},
    "group_size": 5
  }'

When to Append

Note: The append endpoint uses group_uuid (the UUID string), NOT the numeric group_id.

10. Building Representative Panels

To build a panel that represents a broad population (e.g., "representative US adults"), use iterative recruitment:

  1. Recruit initial group with broad filters (age 25-65, USA)
  2. Analyse demographics (age distribution, gender balance, geographic spread)
  3. Identify gaps (e.g., no one over 55, no suburban representation, all from coastal states)
  4. Append targeted recruits to fill gaps (e.g., state-specific, older age range, gender filter)
  5. Remove outliers or over-represented groups if needed
  6. Repeat until the panel reflects the target population

Real Example: ESPN DTC Study Panel

The ESPN pricing study used 64 US personas from Ditto's "100 Americans" dataset. This pre-built panel was designed to be nationally representative across age, gender, geography, income, and media consumption patterns. For studies requiring this level of representativeness, ask about pre-built panels.

11. Reusing Existing Groups

Groups persist in Ditto and can be reused across multiple studies. This is valuable when:

Checking for Existing Groups

curl -s "https://app.askditto.io/v1/research-groups" \
  -H "Authorization: Bearer YOUR_API_KEY"

Look for groups with descriptive names that match your target:

Only reuse a group if you are confident it was created with the correct filters for your study. If unsure, create a new one. Creating a group takes ~30 seconds and costs nothing.

12. Group Sizing Guidelines

Study TypeRecommended Group SizeRationale
Standard research (CPG, B2C, political)10Enough diversity for pattern identification. Sweet spot validated across 50+ studies.
Quick validation / focused test6-8Sufficient for directional insights when time is constrained.
Due diligence (over-recruit)15-20Recruit more, curate down to 10-12 after profile review.
Pricing study10-20More participants = higher confidence on price sensitivity ranges.
Cultural research6-10Smaller groups with specific demographic focus produce deeper cultural insights.
Competitive intelligence10Standard size. Ensure diverse competitive experiences.
Rule of thumb: 10 is the default. Use fewer only for focused studies. Use more only when over-recruiting for curation. Never exceed 20 per group (API limit). If you need more than 20 participants, create multiple groups and multiple studies.

13. Demographic Targeting by Use Case

CPG / Consumer Goods

Product CategoryRecommended Filters
Premium beveragesAge 25-55, country matching brand market
Alcoholic drinksAge 25-55 (legal drinking age +), country matching
Children's productsAge 25-40, is_parent: true
Health/wellness supplementsAge 25-55, country matching
Personal care / beautyAge 22-50, optionally gender-filtered
Snacks / convenience foodAge 18-55, broad demographics

B2C Tech / Product

Product TypeRecommended Filters
Productivity SaaSAge 25-45, employment: "employed"
Consumer appAge 18-45, broad
Prosumer / creative toolsAge 25-40
Finance / budgetingAge 25-55
Health / wellness appAge 25-50

Political / Voter Research

Research TypeRecommended Filters
State-specific voter sentimentcountry: "USA", state: "{2-letter}", age_min: 18, age_max: 65
National sentimentcountry: "USA", age_min: 18, age_max: 70
Suburban voter focusState + age 30-60 (suburban demographics)

14. Common Errors and Solutions

ErrorCauseSolution
0 agents returnedState filter uses full nameUse 2-letter code: "MI" not "Michigan"
0 agents returnedUnavailable countryOnly USA, UK, Germany, Canada available
0 agents returnedToo-narrow filter combinationBroaden filters. Try removing industry or education. Use Q1 to screen instead.
"size is not supported"Used "size" instead of "group_size"Change to "group_size"
"unknown filter field"Used income filter (not supported)Remove income filter. Use education/employment as proxy.
Empty study (no participants)Used group_id instead of research_group_uuidPass the UUID string from group creation, not the numeric ID
401 UnauthorizedMissing or incorrect API keyCheck Authorization: Bearer header
Irrelevant participantsIndustry filter too broadUse over-recruit-and-curate strategy (Section 6)

15. Production Examples

Research groups from real production studies, showing the exact filters and group sizes used:

StudyGroup NameSizeFiltersStrategy
MotorMinds Auto Service Professionals 10 industry: ["Automotive Manufacturing"], age: 28-58 Direct industry filter. Full group used (all had some relevance).
VetVivo Pet Owner Candidates 20 age: 30-60, country: USA Broad filter + Q1 screen. No industry filter (pet owners are general population).
Feel Good Games Parents of Young Children 20 age: 25-40, is_parent: true Direct demographic filter. is_parent filter worked well.
PatientCompanion Elder Care Healthcare Workers 20 industry: ["Healthcare"], elder care focus Healthcare filter + Q1 screen for elder care role.
NexRisx Cybersecurity Professionals 8 industry: ["Cybersecurity"] Exact industry match. Smaller group (niche audience, high relevance).
Airfairness Working Professional Travelers 20 age: 25-55, country: USA, employment: "employed" Broad filter + Q1 screen ("How often do you fly?"). No travel industry filter exists.
Michigan Voters MI State Voters 10 country: "USA", state: "MI", age: 25-70 State-filtered. 2-letter code critical.
CareQuarter Phase 1 US Adults 45-65 Managing Parents 12 age: 45-65, country: USA Age-focused. Target: adult children of aging parents.
German Bread Study German Adults 30-65 6 country: "Germany", age: 30-65 Country-specific cultural research. Small group for depth.

16. Frequently Asked Questions

What is the maximum group size?

20 per API call. If you need more than 20 participants, use the append endpoint to add more to an existing group, or create multiple groups and run separate studies.

Can I combine multiple industry filters?

Yes. Pass an array: "industry": ["Healthcare", "Home Healthcare"]. This returns personas from either industry, not only those matching both.

How do I know what industry values are available?

The Ditto API does not currently provide a list of all available industry values. The validated values from production studies are documented in the Industry Proxy Mapping section. If you try an industry value that does not exist, the API will return 0 agents (not an error).

Should I always use industry filters?

No. Industry filters are useful for professional/B2B research but unnecessary for consumer research. For CPG, use age + country. For political, use state + age. Only use industry filters when you need participants with specific professional experience. When in doubt, use broad filters and let Q1 screen for relevance.

What happens if I recruit 0 agents?

The API returns a group with 0 agents. There is no error message. This usually means: (1) wrong state code format (full name vs 2-letter), (2) unsupported country, or (3) too-narrow filter combination. Try broadening filters and retrying. For state-specific groups, wait 30 seconds and retry before giving up.

Can I reuse a group across multiple studies?

Yes. Groups persist and can be used for multiple studies. However, personas do not carry context between different studies. Each study starts fresh. This is useful for running follow-up or multi-phase research on the same topic with the same demographic profile.

How long do groups persist?

Indefinitely. Once created, a group remains available for future studies. You can list all your groups with GET /v1/research-groups.