이메일 마케팅 툴인 “Benchmark Email(벤치마크 이메일)“은 외부 툴과 연락처 및 캠페인 정보를 주고받을 수 있는 공식 API를 제공합니다. 이커머스, 예약 시스템, CRM, Google Sheets 등에서 관리하는 데이터를 Benchmark Email과 자동으로 동기화할 수 있어, 매주 반복되는 “CSV 내보내기 후 다시 가져오기” 번거로움에서 벗어날 수 있습니다.

이 글에서는 2026년 10월 기준 공식 문서를 바탕으로 Benchmark Email API의 개요, 가능한 작업과 불가능한 작업, 이용 조건, API 키 발급 방법, 그리고 Google Sheets 연동의 구체적인 예시를 자세히 설명합니다.

Benchmark Email API란?

Benchmark Email API는 Benchmark Email 계정을 외부 소프트웨어와 연결하는 메커니즘입니다. 공식 페이지에서는 “스택이 함께 작동해야 한다”는 개념으로 이를 소개하며 다음과 같은 특징을 가지고 있습니다.

  • JSON over HTTP(일반적인 REST 형식) 및 공개된 OpenAPI 사양
  • API 키를 통한 인증(X-API-Key 헤더 사용)
  • 연락처, 캠페인, 리포트, 도메인별로 접근 범위를 제한할 수 있는 권한 범위(Scoped permissions) 설정
  • 키별 만료일 설정 가능, 키를 삭제하지 않고 비활성화 또는 재활성화 가능
  • 시간당 및 월간 **요율 제한(Rate limits)**이 존재하며, 응답 헤더에서 남은 횟수 확인 가능
  • 주요 워크플로우에 대한 시나리오 가이드 및 Benchmark Classic에서의 마이그레이션 가이드 제공

중요한 점은 모든 플랜에서 추가 비용 없이 API를 사용할 수 있다는 것입니다. 사용 가능한 상태의 계정과 API 키만 있으면 됩니다.

API가 필요한 대상

공식 페이지에서는 다음과 같은 문제를 해결하는 기능으로 API를 소개합니다.

  • 이커머스 사이트의 고객, 스프레드시트의 리드, POS나 CRM의 연락처가 각각 따로 존재함
  • 이메일 주소 목록을 만들기 위해 CSV 내보내기 → 정리 → 가져오기를 반복하고 있음
  • 캠페인 결과를 매번 스프레드시트나 슬라이드로 복사·붙여넣기 하고 있음

즉, 이 기능은 데이터가 여러 툴에 흩어져 있고 수동으로 레코드를 대조하는 팀을 위한 것입니다. 반대로 모든 작업을 Benchmark Email 화면 안에서만 처리한다면 API는 필요하지 않습니다.

Benchmark Email API로 할 수 있는 일

API를 통해 조작할 수 있는 리소스는 크게 네 가지 그룹으로 나뉩니다.

리소스필수 권한 범위할 수 있는 일
연락처 (리스트 포함)contacts:read / contacts:write연락처 생성, 조회, 수정, 삭제, 리스트 관리, 사용자 정의 필드 업데이트, 검색, 내보내기
캠페인campaigns:read / campaigns:write캠페인 생성, 조회, 수정, 삭제, 복제, 템플릿 보기
리포트reports:read대시보드 요약 및 이메일 발송 성과 리포트 조회
도메인domains:read발송 도메인 확인 (읽기 전용)

연락처 관리

가장 빈번하게 사용하게 될 리소스입니다.

  • 연락처 생성, 수정, 삭제: 이메일 주소를 키로 하여 이름 및 임의의 사용자 정의 필드와 함께 연락처를 등록할 수 있습니다.
  • 검색 및 세그먼트: 이메일 주소, 이메일 도메인, 사용자 정의 필드, 태그, 리스트, 상태, 생성 및 수정일 등으로 검색할 수 있습니다. “일치”, “포함”, “시작 문자”, “기간 내”, “비어 있음” 등 여러 연산자를 선택하고 AND/OR로 조합할 수 있습니다.
  • 중복 체크: 연락처를 생성하기 전에 이메일 주소로 미리 검색하면 이미 등록된 연락처가 중복으로 추가되는 것을 방지할 수 있습니다.
  • 차등 업데이트: 단일 연락처에 대해 리스트 추가/제거, 태그 추가/제거, 필드 업데이트를 한 번에 처리하는 엔드포인트도 존재합니다.
  • 내보내기 및 이벤트 조회: 연락처를 내보내거나 각 연락처의 이벤트 기록을 조회할 수도 있습니다.

리스트 관리

API를 통해 리스트 생성, 이름 변경, 복제, 병합, 삭제가 가능합니다. CRM이나 이커머스 툴이 “고객 그룹화 기준”에 대한 정답을 가지고 있을 때 유용합니다. 예를 들어 외부 시스템에서 “3회 이상 구매” 또는 “멤버십 등급 Gold” 등의 그룹을 결정하고 이를 Benchmark 리스트에 반영할 수 있습니다.

참고로 병합 시에는 기존 리스트를 유지한 채 새로운 리스트가 생성되며, 중복 연락처는 자동으로 처리됩니다.

캠페인 생성 및 설정

API를 통해 캠페인 이름, 제목, 미리보기 텍스트, 발신자 이름 및 주소, 회신 주소, 수신자 리스트, HTML 본문 등을 설정하고 초안(Draft) 상태로 캠페인을 생성할 수 있습니다. 기존 캠페인 복제도 가능하며, 복제본은 원본의 상태와 상관없이 항상 초안이 됩니다.

리포트 조회

다음과 같은 다섯 가지 정보를 조회할 수 있습니다.

  • 대시보드 개요 (최근 1~90일, 이전 기간 대비 증감률 포함)
  • 전체 발송 성과 (발송됨, 전달됨, 오픈, 클릭, 반송, 수신거부, 스팸 신고)
  • 발송 성과 시계열 데이터 (차트 작성에 유용)
  • 개별 캠페인 리포트 (링크별 클릭 수 포함)
  • 개별 캠페인 참여 추이

이 데이터를 BI 툴이나 자체 대시보드로 연동하면 “오픈율을 슬라이드에 옮겨 적는” 번거로운 작업을 없앨 수 있습니다.

발송 도메인 확인

개인 발송 도메인의 인증 상태를 조회할 수 있습니다. 별도의 대시보드에서 도달률(Deliverability)을 모니터링하거나, 다른 시스템에 “이 도메인은 이제 발송할 준비가 되었습니다”라고 알리고 싶을 때 유용합니다.

계정 정보 조회

GET /api/account를 사용하면 계정의 도시, 국가, 국가 코드, 통화 코드, 타임존 등 기본 정보를 가져올 수 있습니다. 다른 엔드포인트를 호출하기 전에 API 키가 정상 작동하는지 확인하거나 리포트를 조회할 때 타임존을 맞추는 용도로 활용할 수 있습니다. 응답에 포함된 unlayerKey는 Unlayer 연동을 위한 보안 키(SHA256 해시)이므로 로그나 화면에 노출되지 않도록 주의해야 합니다.

Benchmark Email API로 할 수 없는 일 (Benchmark Email 인터페이스에서 처리해야 하는 일)

API가 만능은 아니며, 안전한 발송을 위해 일부 작업은 의도적으로 제외되어 있습니다.

작업API 지원 여부비고
캠페인 발송, 예약, 취소 및 테스트 발송불가능Benchmark Email 인터페이스에서 수행
발송 도메인 신규 인증불가능웹 인터페이스에서 절차 진행 (API는 인증 상태 조회만 가능)
이메일 최종 디자인 편집제한적과거 캠페인을 복제하여 이어받은 뒤, 인터페이스에서 최종 조정
수신 거부한 연락처 재활성화불가능컴플라이언스 보호 목적. 재등록 시 다시 옵트인(Opt-in) 진행

즉, 실수로 이메일이 발송될 수 있는 작업은 API 키로 실행할 수 없도록 설계되어 있습니다. 예상되는 워크플로우는 API를 통해 캠페인 초안을 준비하고, 사람이 직접 최종 검토를 거쳐 발송 버튼을 누르는 것입니다.

이용 조건, 요율 제한 및 요금

요금 및 API 키 개수

  • API 자체는 모든 플랜에서 무료
  • 무료 플랜은 활성 API 키 2개, 프로 플랜은 최대 10개 허용 (10개 초과 시 영업팀에 문의)
  • 공식 권장 사항은 “연동당 하나의 키 생성”입니다. 키마다 권한 범위(Scope)를 좁게 설정할 수 있으며, 불필요해진 경우 개별적으로 비활성화할 수 있습니다.

요율 제한 및 월간 할당량

개발자 문서에 따른 제한 사항은 다음과 같습니다.

유형상세 내용
시간당 제한계정당 시간당 3,600회 요청 (초당 약 1회). 여러 API 키를 사용하더라도 합산되어 소모됨
월간 할당량 (무료 플랜)연락처 한도 × 10
월간 할당량 (유료 플랜)연락처 한도 × 100

예를 들어 가상의 연락처 한도가 1,000 개인 플랜의 경우, 가이드라인은 무료 플랜에서 월 10,000회 요청, 유료 플랜에서 월 100,000회 요청입니다 (이는 계산 예시일 뿐이므로 구독 중인 플랜의 실제 숫자를 확인하세요).

제한을 초과하면 429 Too Many Requests 응답을 받게 되며, Retry-After 헤더에 대기해야 할 초(second) 수가 표시됩니다. 응답에는 시간당 잔여 횟수를 나타내는 X-RateLimit-Remaining, 월간 잔여 횟수를 나타내는 X-Monthly-Remaining 등의 헤더도 포함되므로 잔여량을 확인하며 처리를 조절할 수 있습니다.

또한, 유효하지 않은 API 키를 반복해서 시도하면 해당 IP 주소가 일시적으로 차단됩니다. 계속해서 401 에러가 발생한다면 무한 재시도를 멈추고 키를 다시 확인하세요.

기타 조건

  • 소유자(Owner) 권한을 가진 사용자만 API 키를 생성하고 관리할 수 있음
  • 계정이 “Open” 또는 “Pending Cancel” 상태일 때만 키를 사용할 수 있음 (결제 지연이나 정지 기간에는 403 응답 발생)
  • 모든 요청에 User-Agent 헤더가 필수 (아래 설명 참조)

API 키 발급부터 첫 번째 요청까지

1. API 키 생성하기

  1. 소유자 계정으로 Benchmark Email에 로그인
  2. **설정(Settings) > API 키(API Keys)**로 이동
  3. API 키 만들기(Create API Key) 클릭
  4. 알기 쉬운 이름(예: Sheets Sync)을 입력하고 필요한 권한 범위만 선택
  5. 필요한 경우 만료일 설정 (설정하지 않으면 만료되지 않음)
  6. 생성 직후 표시되는 키를 즉시 복사하여 안전한 곳에 보관

API 키는 생성 시 딱 한 번만 표시됩니다. 분실한 경우 API 키 화면에서 재생성할 수 있지만, 기존 키는 무효화됩니다.

API 키는 bme_ + 2글자 지역 코드(us, jp, eu 등) + 43글자 랜덤 문자열로 총 50글자로 구성됩니다.

2. 베이스 URL 확인하기

베이스 URL은 계정의 지역 및 클러스터에 따라 다르며 https://api-{region}-{cluster}.benchmarkemail.io 형식을 띱니다 (예: https://api-us-west-2-a.benchmarkemail.io). 본인의 베이스 URL은 설정 > API 키 화면에 표시되므로 해당 URL을 사용하세요.

3. 첫 번째 요청 보내기

bash
curl -H "X-API-Key: bme_your-api-key-here" \
  -H "User-Agent: MyIntegration/1.0" \
  "<your-api-base-url>/api/contact-structure"

연락처 구조(사용자 정의 필드 정의 등)가 JSON으로 반환되면 성공입니다. 401 또는 403 에러가 발생한다면 키, 권한 범위, 계정 상태를 확인하세요.

JSON 대신 HTML을 반환하는 403 에러가 발생하는 경우, User-Agent 헤더가 전송되지 않았을 확률이 높습니다. Benchmark Email의 엣지 보호 기능이 User-Agent가 없는 요청을 거부하기 때문입니다. curl이나 주요 언어의 표준 라이브러리는 이를 자동으로 추가하지만, PHP의 cURL 확장 등은 명시적으로 설정해야 합니다.

참고: 마케팅 소개 페이지의 curl 샘플 형식과 개발자 문서의 엔드포인트 형식은 다르게 작성되어 있습니다. 구현 시에는 항상 **개발자 문서(developers.benchmarkemail.io)**를 따르세요.

권한 범위(Scopes)의 작동 방식

알기 쉬운 API 문서 - Benchmark Email

API 키에는 {resource}:{access type} 형식으로 권한 범위를 부여합니다.

권한 범위상세 내용
contacts:read연락처, 리스트 및 연락처 구조 조회/검색, 내보내기, 이벤트 기록
contacts:write연락처 및 리스트 생성/수정/삭제, 연락처 구조 업데이트
campaigns:read캠페인 조회, 템플릿 조회
campaigns:write캠페인 생성/수정/삭제/복제
reports:read대시보드 및 발송 리포트 조회
domains:read발송 도메인 조회

기억해야 할 세 가지 핵심 포인트:

  • 쓰기 권한에는 읽기 권한이 포함됨: contacts:write 권한이 있으면 연락처를 읽을 수도 있습니다.
  • 최소 권한의 원칙: 리포팅 대시보드용으로는 reports:read만, 스프레드시트에서 연락처를 동기화하는 용도로는 contacts:write만 사용하는 식으로 키를 나누세요.
  • 검색에는 읽기 권한으로 충분: 연락처 검색은 POST를 사용하지만 필요한 권한은 contacts:read입니다.

구체적인 활용 사례

지금부터는 공식 문서의 사양을 바탕으로 실제로 유용해 보이는 연동 예시를 살펴봅니다.

참고: 아래 코드는 공식 문서의 사양에 맞춰 작성된 샘플 코드입니다. 프로덕션 리스트에 적용하기 전에 테스트 리스트나 소량의 데이터로 먼저 작동하는지 확인하세요.

예시 1: Google Sheets에서 Benchmark Email로 연락처 동기화

세미나 신청이나 설문조사 응답을 Google Sheets에서 수집한다고 가정해 보겠습니다. 새로 추가된 행만 Benchmark Email 리스트에 등록하고, 이미 등록된 이메일 주소는 중복되지 않도록 방지합니다.

준비 작업

  1. contacts:write 권한 범위로 API 키 생성
  2. GET /api/contact-structure을 통해 연락처 구조의 _id 및 “이름”, “성” 필드의 _id 확인
  3. 대상 리스트의 _id 확인 (GET /api/contact-structure/{structure ID}/lists/all으로 리스트 조회 가능)
  4. 스프레드시트의 첫 번째 행을 헤더로 설정: A열 = 이메일, B열 = 이름, C열 = 성, D열 = 동기화 결과
  5. API 키와 ID를 Apps Script의 “스크립트 속성(Script Properties)“에 저장 (코드에 하드코딩하지 않기)

Google Apps Script 코드

javascript
// ===== Settings (saved in script properties) =====
const P = PropertiesService.getScriptProperties();
const BASE_URL = P.getProperty('BME_BASE_URL');           // e.g. https://api-us-west-2-a.benchmarkemail.io
const API_KEY = P.getProperty('BME_API_KEY');             // bme_us_...
const STRUCTURE_ID = P.getProperty('BME_STRUCTURE_ID');   // _id of the contact structure
const LAST_NAME_ID = P.getProperty('BME_LAST_NAME_FIELD_ID');
const FIRST_NAME_ID = P.getProperty('BME_FIRST_NAME_FIELD_ID');
const LIST_ID = P.getProperty('BME_LIST_ID');

// ===== Common API call =====
function api_(method, path, body, retry) {
  retry = retry || 0;
  const res = UrlFetchApp.fetch(BASE_URL + path, {
    method: method,
    contentType: 'application/json',
    headers: { 'X-API-Key': API_KEY, 'User-Agent': 'SheetsToBenchmark/1.0' },
    payload: body ? JSON.stringify(body) : undefined,
    muteHttpExceptions: true,
  });
  const code = res.getResponseCode();
  if (code === 429 && retry < 3) {          // Rate limit: wait, then retry
    Utilities.sleep(60 * 1000);
    return api_(method, path, body, retry + 1);
  }
  if (code >= 400) throw new Error(code + ' ' + res.getContentText());
  const text = res.getContentText();
  return text ? JSON.parse(text) : null;
}

// ===== Duplicate check by email address =====
function emailExists_(email) {
  const r = api_('post', '/api/contact/search', {
    contactStructureId: STRUCTURE_ID,
    page: 1,
    pageSize: 1,
    source: ['_id'],
    contactSpecification: {
      filters: [{ criterias: [{ columnToFilter: 'KEY', operator: 'EQ', values: [email] }] }],
    },
  });
  return r.totalRecords > 0;
}

// ===== Register only unsynced rows =====
function syncNewRows() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Applicants');
  const rows = sheet.getDataRange().getValues();

  for (let i = 1; i < rows.length; i++) {
    const email = String(rows[i][0]).trim();
    const firstName = rows[i][1];
    const lastName = rows[i][2];
    const synced = rows[i][3];
    if (!email || synced) continue;       // Skip empty and already-synced rows

    let result;
    if (emailExists_(email)) {
      result = 'Skipped (already registered)';
    } else {
      api_('post', '/api/contact', {
        key: email,
        contactStructureId: STRUCTURE_ID,
        fields: [
          { _id: LAST_NAME_ID, value: lastName },
          { _id: FIRST_NAME_ID, value: firstName },
        ],
        lists: [{ _id: LIST_ID }],
      });
      result = 'Synced ' + new Date().toLocaleString();
    }
    sheet.getRange(i + 1, 4).setValue(result);
    Utilities.sleep(300);                  // Avoid back-to-back requests
  }
}

이후 Apps Script의 **시간 기반 트리거(Time-driven trigger)**에서 “매시간” 또는 “매일 아침”과 같이 syncNewRows 함수를 실행하도록 설정하면, 스프레드시트에 행이 추가될 때마다 Benchmark Email 리스트에 자동으로 반영됩니다. Google Forms 응답 시트인 경우 “양식 제출 시(on form submit)” 트리거를 사용할 수도 있습니다.

각 행당 최대 2회의 요청(검색 + 생성)이 소모되므로 시간당 3,600회 요청 제한 내에서 여유 있게 작동합니다.

예시 2: 발송 결과를 Google Sheets에 자동으로 기록

반대 방향의 예시입니다. 발송된 캠페인의 결과를 스프레드시트에 자동으로 정리합니다. 캠페인 리스트 API(GET /api/email/campaign)는 발송된 캠페인의 통계(오픈, 클릭, 오픈율 등)도 함께 반환합니다. 앞서 작성한 api_ 함수를 그대로 재사용할 수 있습니다.

campaigns:read 권한 범위가 부여된 키로 작동합니다.

javascript
function exportCampaignStats() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Delivery Report') || ss.insertSheet('Delivery Report');

  const res = api_('get', '/api/email/campaign?page=1&size=25&statuses=sent&sort=scheduledAt:desc');

  const header = ['Campaign name', 'Subject', 'Sent at', 'Sent', 'Delivered',
                  'Opens (unique)', 'Open rate (%)', 'Clicks (unique)', 'Click rate (%)'];
  const rows = res.records.map(function (c) {
    const s = c.stats || {};
    return [
      c.name, c.subject, c.scheduledAt,
      s.sent, s.delivered,
      s.opens && s.opens.unique, s.opens && s.opens.rate,
      s.clicks && s.clicks.unique, s.clicks && s.clicks.rate,
    ];
  });

  sheet.clearContents();
  sheet.getRange(1, 1, 1, header.length).setValues([header]);
  if (rows.length) sheet.getRange(2, 1, rows.length, header.length).setValues(rows);
}

매일 아침 트리거로 실행해 두면 시트를 열었을 때 최신 결과가 바로 준비되어 있습니다. 이후 Google Sheets의 기본 기능을 활용해 차트를 만들거나 Looker Studio에 연결하여 주간 리포트를 자동화할 수 있습니다.

더 자세한 분석이 필요하다면 리포트 API를 함께 활용하세요.

  • GET /api/reports/dashboard?pastDays=30&timezone=America/New_York: 최근 30일 개요 (전기 대비 증감률 포함)
  • GET /api/reports/email/{campaign ID}: 특정 캠페인의 링크별 클릭 수
  • GET /api/reports/email/{campaign ID}/engagement?period=week: 발송 후 1주일 동안의 오픈 및 클릭 추이

timezone를 본인의 타임존(예: America/New_York)으로 설정하면 해당 타임존을 기준으로 날짜가 집계되므로 국내 리포트에 편리합니다.

예시 3: 이커머스 사이트나 예약 폼의 고객을 리스트에 자동 추가 (n8n, Zapier 등)

현재 Benchmark Email에는 자체 내장된 노코드 워크플로우 툴이 없습니다. 하지만 공식 문서에서도 “Zapier나 n8n 같은 툴을 통해 API로 워크플로우를 자동화할 수 있다”고 안내하고 있습니다. **HTTP 요청을 보낼 수 있는 노드(n8n의 HTTP Request 노드, Zapier의 Webhooks 등)**를 사용하면 코딩 없이 거의 연동할 수 있습니다.

흐름은 다음과 같습니다.

  1. 트리거: 이커머스 사이트 주문 발생 / 예약 폼 제출 / Google Forms 응답 완료
  2. 검색: POST /api/contact/search을 사용하여 이메일 주소가 이미 등록되어 있는지 확인
  3. 분기
    • 미등록 → POST /api/contact로 생성 후 리스트에 추가
    • 등록됨 → 차등 업데이트 엔드포인트를 사용하여 리스트 추가, 태그 할당, 필드 업데이트 수행
  4. 알림: 필요한 경우 Slack이나 Microsoft Teams에 “새로운 연락처가 등록되었습니다” 알림 전송

검색 시 FIELD_ID로 필터링하면 “멤버십 등급이 Gold인 사람만” 같은 조건도 확인할 수 있습니다. 고객의 핵심 데이터는 이커머스 툴이나 CRM에 남겨두면서 Benchmark Email 리스트는 자동으로 최신 상태로 유지할 수 있습니다.

예시 4: 지난달 뉴스레터를 복제하여 이번 달 초안 만들기

매번 거의 동일한 디자인을 발송하는 월간 뉴스레터 같은 경우, 과거 캠페인을 복제하여 초안을 준비하는 방식이 매우 적합합니다.

bash
# 1. Duplicate last month's campaign to create this month's draft
curl -X POST "<your-api-base-url>/api/email/campaign/{last month's campaign ID}/duplicate" \
  -H "X-API-Key: $BENCHMARK_KEY" \
  -H "User-Agent: MonthlyNewsletter/1.0" \
  -H "Content-Type: application/json" \
  -d '{ "name": "November 2026 Newsletter" }'

# 2. Update the subject, preview text, and destination list (__v is the value you just retrieved)
curl -X PATCH "<your-api-base-url>/api/email/campaign/{new campaign ID}" \
  -H "X-API-Key: $BENCHMARK_KEY" \
  -H "User-Agent: MonthlyNewsletter/1.0" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "[November Issue] This Month'"'"'s Announcements",
    "previewText": "A roundup of new features and use cases",
    "lists": ["{destination list ID}"],
    "__v": 0
  }'

이후 Benchmark Email 인터페이스에서 초안을 열어 본문을 수정하고 내용을 검토한 뒤 발송합니다. API가 “초안 준비”를 담당하고 사람이 “최종 검토 및 발송”을 담당하도록 역할을 나누면 안전하게 운영할 수 있습니다.

예시 5: AI 코딩 어시스턴트에 구현 위임하기

공식 개발자 문서에서는 AI 코딩 어시스턴트를 위한 자료도 제공하고 있습니다.

  • llms.txt: 모든 문서 페이지의 목차
  • llms-full.txt: 전체 문서 내용을 하나의 파일로 합친 텍스트
  • SKILL.md: 엔드포인트, 의사결정 가이드, 흔한 실수를 요약한 에이전트용 가이드

AI에게 요청할 때는 “먼저 SKILL.md를 읽고, 그 다음 내가 하고자 하는 작업에 맞는 시나리오 가이드를 읽은 뒤 코드를 작성해 줘”라고 지시하는 것이 좋습니다. 예를 들어 앞서 소개한 예시 1과 같은 Google Apps Script도 AI에게 사양을 읽히고 “내 스프레드시트의 열 배치에 맞춰 작성해 줘”라고 요청하면 짧은 시간 안에 맞춤형으로 조정할 수 있습니다.

구현 시 주의해야 할 점

시나리오 가이드에서 발췌한, 자주 실수하는 포인트들입니다.

  • PUT은 “전체 교체”: PUT으로 연락처를 업데이트할 때 요청에 포함하지 않은 필드는 모두 지워집니다. 먼저 GET으로 최신 데이터를 가져와 기반으로 삼고, 변경하고 싶은 부분만 수정해서 보내야 합니다.
  • __v (버전) 필수: PUT 및 캠페인/리스트의 PATCH 시에는 GET으로 방금 가져온 __v을 첨부해야 합니다. 이전 값일 경우 ConcurrencyError(400) 에러가 발생하므로 다시 조회한 뒤 재시도하세요.
  • 상태 값은 대소문자 구분: Active, Inactive, Unsubscribe은 정확히 이 형식으로 보내야 하며 소문자를 사용하면 에러가 납니다. Inactive를 설정할 때는 primary과 secondary가 모두 필요합니다.
  • 수신 거부 또는 반송된 연락처 복구 불가: 연락처가 Inactive 상태가 되면 API를 통해 다시 Active 상태로 되돌릴 수 없습니다. 컴플라이언스 보호를 위한 사양이므로 임의로 재활성화하려고 시도하지 않는 것이 기본 전제입니다.
  • 중복 시 에러 발생: 동일한 구조 내에 같은 이메일 주소가 이미 존재하면 DuplicateFieldError 에러가 발생합니다. 생성 전 검색으로 확인하거나 에러를 확인한 후 업데이트로 전환하세요.
  • 검색 시 source 필수: 반환받고 싶은 필드를 _id, key, fields과 같은 배열로 지정해야 합니다. 값은 대소문자를 구분하며 알 수 없는 값이 하나라도 포함되면 요청 전체가 거부됩니다.
  • 연락처 리스트 조회는 페이지네이션 없음: GET /api/contact는 모든 레코드를 한 번에 반환하므로 레코드가 많은 계정의 경우 페이지네이션이 있는 검색 API가 더 안전합니다.
  • 발신자 주소는 인증된 도메인이어야 함: 캠페인의 from은 인증된 발송 도메인의 주소여야 합니다.
  • 키는 항상 환경 변수나 스크립트 속성으로 관리: 소스 코드나 스프레드시트 셀에 하드코딩하지 마세요. 유출이 의심되는 경우 키를 비활성화하고 재생성하세요.

Benchmark Email API의 장단점

장점 6
  • 모든 플랜에서 추가 비용 없이 사용 가능 (무료 플랜에서도 API 키 최대 2개 제공)

  • 일상적인 운영에 필요한 범위(연락처, 리스트, 캠페인, 리포트, 도메인)를 모두 커버

  • 권한 범위별 API 키를 통해 연동별 권한 축소 가능

  • 키별 만료일 설정, 비활성화 및 재활성화 지원으로 보안 고려

  • 시나리오 가이드, OpenAPI 사양, AI용 자료(llms.txt, SKILL.md) 등 충실한 문서 제공

  • 캠페인 발송은 API로 실행할 수 없어 자동화에 따른 오발송 위험이 낮음

단점 5
  • 기본 내장된 노코드 연동 기능이 없어 개발자, 기술 담당자 또는 AI 툴의 도움을 전제로 함

  • 발송, 예약, 최종 디자인 편집은 API로 처리할 수 없어 인터페이스에서의 작업이 필요

  • 시간당 3,600회 요청 및 월간 할당량 제한으로 대용량 데이터 동기화 시 계획 필요

  • 수신 거부 등으로 비활성화된 연락처를 API로 재활성화 불가

  • 무료 플랜은 API 키가 2개로 제한되므로 연동이 많다면 프로 플랜 필요

이런 분에게 적합하고, 이런 분에게는 적합하지 않습니다

적합한 대상

  • 고객 데이터가 이커머스 사이트, 예약 시스템, CRM, 스프레드시트 등 여러 곳에 분산되어 있어 수동으로 대조하느라 시간을 낭비하고 있는 분
  • 개발자가 있거나, AI 코딩 툴에 구현을 맡길 수 있는 분
  • 발송 결과를 자체 대시보드나 BI 툴에서 확인하고 싶은 분
  • 매월 거의 동일한 형식으로 이메일을 발송하며 초안 준비 단계만 자동화하고 싶은 분

적합하지 않은 대상

  • Benchmark Email 인터페이스 안에서만 모든 작업이 완결되며 외부 툴 연동이 필요 없는 분
  • 완전히 노코드 형태의 클릭만으로 이루어지는 연동을 원하는 분 (현재로서는 Zapier 같은 외부 툴에 HTTP 요청을 직접 구축하는 방식이 필요함)
  • 이메일 발송 자체를 API로 실행하고 싶은 분 (트랜잭션 이메일 스타일의 용도에는 적합하지 않음)

##주요 질문과 답변 (FAQ)

Q. Benchmark Email 무료 플랜에서도 API를 사용할 수 있나요?

네. 모든 플랜에 API가 무료로 포함되어 있습니다. 무료 플랜에서는 최대 2개의 활성 API 키를 생성할 수 있습니다.

Q. 프로그래밍 지식이 없어도 사용할 수 있나요?

연동을 위한 코드를 작성하거나 생성해야 합니다. 직접 코드를 작성할 수 없더라도 개발자에게 요청하거나 AI 코딩 어시스턴트를 활용하면 구현할 수 있습니다.

Q. API를 통해 이메일을 발송할 수 있나요?

직접 발송할 수는 없습니다. API를 통한 캠페인 생성, 설정, 복제는 가능하지만 예약과 발송은 Benchmark Email 인터페이스에서 진행해야 합니다.

Q. API 키는 어디서 만들 수 있나요?

소유자 권한 계정으로 설정(Settings) > API 키(API Keys)에서 만들 수 있습니다. 키는 생성 시 단 한 번만 표시되므로 그 즉시 메모해 두어야 합니다.

Q. 요율 제한(Rate limits)은 어떻게 되나요?

개발자 문서에 따르면 계정당 시간당 3,600회 요청(여러 키의 합산)이며, 월간 할당량은 연락처 한도의 10배(무료) 또는 100배(유료)입니다. 숫자는 변경될 수 있으므로 문서의 “Rate Limits”에서 최신 정보를 확인하세요.

Q. Google Sheets와 연동할 수 있나요?

공식 커넥터는 없지만, Google Apps Script에서 UrlFetchApp로 API를 호출하여 연동할 수 있습니다. 본문의 예시 1과 2처럼 스프레드시트에서 연락처를 등록하고 발송 결과를 내보낼 수 있습니다.

요약

Benchmark Email API는 연락처, 리스트, 캠페인, 리포트, 발송 도메인을 외부 툴과 연결하기 위한 모든 플랜 무료 API입니다.

  • 연락처 동기화, 검색, 중복 체크, 리스트 관리, 리포트 조회 등 데이터를 주고받는 수동 작업을 자동화할 수 있습니다.
  • 반면 발송, 예약, 최종 디자인은 API로 처리할 수 없으며, 안전을 위해 인터페이스에서의 검토 절차가 유지됩니다.
  • 사용하려면 개발자나 AI 툴의 도움이 필요하지만, 공식 측에서 llms.txt와 SKILL.md를 제공하므로 AI에 구현을 위임한다는 전제 하에 진입 장벽이 높지 않습니다.
  • Google Sheets와 연동 시 Google Apps Script를 활용하여 가입 리스트 자동 등록과 발송 결과 자동 집계를 구현할 수 있습니다.

시작하려면 무료 플랜에서 API 키를 하나 생성하고 GET /api/contact-structure를 호출하여 본인 계정의 구조를 확인해 보세요. 그 후 스프레드시트 동기화 등 가장 수고가 많이 드는 작업부터 자동화를 시작하는 것을 추천합니다.

참고 링크