문서로 건너뛰기
SDK

양식

`forms.list`, `get`, `create`, `update`, `delete`, `publish`, `pause`, `resume`, `duplicate`, `analytics`, `listStarters`, `getStarter`, `listSubmissions`, `getSubmission`, `deleteSubmission`, `deleteSubmissions`, `approveSubmission`, `resendConfirmation`, `subscribe`.

모든 메서드

forms.ts
const form = await openemail.forms.create({  name: 'Newsletter sign-up',  starter: 'newsletter',  settings: { audienceIds: ['aud_4c1b8e2a7d9f05c36b4e8a71'] },  publish: true,}) console.log(form.url, form.subscribeUrl) const saved = await openemail.forms.update(form.id, {  settings: { doubleOptIn: true, senderAddress: '[email protected]' },  expectedUpdatedAt: form.updatedAt,}) const signup = await openemail.forms.subscribe(form.id, {  email: '[email protected]',  first_name: 'Ann',  consent: true,}) for await (const submission of openemail.forms.iterateSubmissions(form.id, { status: 'pending' })) {  if (submission.expired) await openemail.forms.resendConfirmation(form.id, submission.id)} const stats = await openemail.forms.analytics(form.id, { days: 30 })const starters = await openemail.forms.listStarters() await openemail.forms.pause(form.id)await openemail.forms.resume(form.id)const copy = await openemail.forms.duplicate(form.id)await openemail.forms.delete(copy.id) console.log(saved.senderIssue, signup.outcome, stats.totals.conversion, starters.length)

양식은 초안인 document와 방문자에게 보이는 publishedDocument를 보관합니다. update는 초안과 설정을 바꾸고, publish는 초안을 게시합니다. 설정은 게시 여부와 상관없이 즉시 적용되며, expectedUpdatedAt은 다른 사람의 저장을 덮어쓰게 될 저장을 409 version_conflict로 거부합니다.

읽기에는 forms:read, 변경에는 forms:write가 필요합니다. approveSubmission은 연락처를 추가하므로 contacts:write도 필요합니다. resendConfirmation에는 emails:send도 필요하며, 양식이 메일을 보내게 하는 호출에도 필요합니다. doubleOptIn 켜기, senderAddress나 확인 메일 설정, 더블 옵트인 양식의 게시나 재개가 여기에 해당합니다. delete는 OAuth 액세스 토큰에는 인증 코드를 요구하지만, API 키에는 절대 요구하지 않습니다.

subscribe는 양식의 페이지와 똑같이 누군가를 가입시키며, 자격 증명을 가진 클라이언트에서도 자격 증명을 보내지 않습니다. 한 네트워크에서 오는 모든 가입은 10분마다 40번이라는 한도를 함께 쓰므로, 많은 사람의 가입을 중계하는 서버는 금방 한도에 닿습니다. 이미 아는 사람은 대신 audiences.importContacts로 추가하세요. 양식이 있던 페이지는 oe_source로 넘기고, oe_started는 빼고, oe_website는 빈 값으로 보내거나 아예 빼세요.

subscribe에서 오는 422는 invalid_form_submission이며, 오류의 fields는 빠졌거나 유효하지 않은 답변을 각각 { key, error }로 나열하고 required, email, option 같은 이유를 담습니다. 이 클라이언트는 서버용입니다. 브라우저에서는 fetch를 써서 양식의 subscribeUrl로 답변을 전송하세요. JSON 본문으로 보내거나 Accept: application/json 헤더를 붙이면 어떤 오리진에서든 JSON으로 응답합니다. 둘 다 없으면 호스팅된 페이지로 가는 303 리디렉션으로 응답합니다.

응답: FormDetailResource

list는 document와 settings를 뺀 FormResource의 한 페이지로 최신순으로 resolve되고, listAll과 iterate가 모든 페이지를 훑습니다. get, create, update, publish, pause, resume, duplicate는 document, publishedDocument, settings, audiences, senderIssue, senderProblem을 더한 FormDetailResource로 resolve됩니다.

idstring
영구적인 핸들로, `frm_` 뒤에 16진수 24자가 붙습니다.
status'draft' | 'live' | 'paused'
첫 게시 전까지는 `draft`, 그 뒤로는 가입을 받는 동안 `live`, 받지 않는 동안 `paused`입니다. 양식은 `draft`로 돌아가지 않습니다.
urlstring
게시된 양식의 호스팅된 페이지로, 링크로 공유할 수 있습니다.
subscribeUrlstring
순수 HTML 양식이나 `fetch`가 답변을 전송하는 곳입니다.
documentFormDocument
초안: 순서대로 놓인 `fields`, 그 주변의 `copy`, 그리고 `style`.
publishedDocumentFormDocument | null
방문자에게 지금 보이는 내용입니다. 첫 게시 전까지는 null입니다.
settingsFormSettings
가입이 들어갈 곳과 가입 뒤에 일어나는 일: `audienceIds`, `doubleOptIn`, `senderAddress`, 확인 메일, `successAction`, `redirectUrl`, `notifyAddresses`.
hasUnpublishedChangesboolean
초안이 방문자에게 보이는 내용과 다르면 true입니다. 첫 게시 전에는 항상 false입니다.
senderIssue'missing' | 'not_sendable' | 'not_allowed' | null
더블 옵트인 양식이 지금 확인 메일을 보낼 수 없는 이유이며, 보낼 수 있으면 null입니다.
statsFormStats
`views`, `submissions`, `added`, `pending`, `lastSubmittedAt`이며, 조회 시점에 집계됩니다.

제출

listSubmissions는 이메일 주소를 검색하는 q, pending 또는 added를 고르는 status와 함께 최신순으로 페이지를 가져오고, listAllSubmissions와 iterateSubmissions가 모든 페이지를 훑습니다. 각 FormSubmissionResource는 답변을 레이블까지 포함해 보낸 그대로 보관하므로, 양식이 바뀐 뒤에도 제대로 읽힙니다.

resendConfirmation은 confirmationSent가 담긴 제출로 resolve됩니다. 아무것도 나가지 않았으면 false입니다. 한 주소는 양식마다 10분에 한 통, 워크스페이스 전체에서 하루 다섯 통의 확인 메일을 받으며, 이미 추가된 제출은 받지 않습니다. expired는 최신 링크가 만료된 확인 대기 중인 가입을 표시합니다.

받은편지함을,
내 방식대로.

기업, AI, 에이전트, 개인 메일을 위한 이메일 인프라. 규모와 프라이버시, 통제권을 위해 만들었습니다. 이메일이 처음부터 갖췄어야 할 모든 것.

© 2026 OpenEmail. 모든 권리 보유.