پرش به مستندات
API

فهرست قالب‌ها

همهٔ قالب‌های روی اتصال، تازه‌ترین اول، با صفحه‌بندی keyset.

GETapi.openemail.uk/templates

فراخوانی واقعی را با کلید خودتان روی فضای کاری شما اجرا می‌کند.

GET /templates

همهٔ قالب‌های روی اتصال، تازه‌ترین اول، با صفحه‌بندی keyset.

دو موتور

shell
export OE=https://api.openemail.ukexport AUTH="Authorization: Bearer $OPENEMAIL_API_KEY"

قالب، بدنه‌ای است که یک بار ذخیره می‌شود و بارها فرستاده می‌شود، و به CONNECTION تعلق دارد نه به کسی که آن را نوشته است. یک کلید فضای کاری همان قالب‌هایی را می‌بیند که همکارش می‌بیند، و حذف حساب نویسنده آن‌ها را با خود نمی‌برد.

engine: "blocks" درختی را ذخیره می‌کند که نوع گره‌هایش همان خروجی‌های @react-email/components است (Section، Row، Column، Container، Text، Heading، Button، Link، Img، Hr، Markdown، CodeBlock و CodeInline) و props آن هم props خود همان کامپوننت‌هاست. هنگام ورود اعتبارسنجی می‌شود، پس یک گره نادرست به‌جای ایمیلی خراب در آینده، همان فراخوانی‌ای را که آن را نوشته با 422 روبه‌رو می‌کند.

engine: "html" همان نشانه‌گذاری‌ای را که از پیش دارید ذخیره می‌کند و هنگام انتشار نسخه یک بار پاک‌سازی می‌شود. وقتی قالب‌های شما کامپوننت‌های react-email در مخزن خودتان هستند، همین را انتخاب کنید: کامپوننت را در build خودتان با @react-email/render رندر کنید و نتیجه را بفرستید. هیچ نقطهٔ پایانی‌ای برای JSX وجود ندارد و قرار هم نیست وجود داشته باشد. API، HTML می‌گیرد چون آنچه یک کلاینت ایمیل می‌خواند HTML است، و اجرای کامپوننت فراخوان فقط یک sandbox را به ما تحمیل می‌کرد که کسی به آن نیازی ندارد.

اعلام‌شده به‌صورتپر می‌شود توسطغایب هنگام ارسال
`slots`هرکس که قالب را ویرایش می‌کندمقدار default خودِ slot رندر می‌شود
`props`هرکس که ارسال می‌کندmissing_template_prop، یک 422، و هیچ ایمیلی بیرون نمی‌رود

هر دو در بدنه و در موضوع به شکل {{key}} نوشته می‌شوند و هر دو یک kind دارند (text، url یا image) که تعیین می‌کند مقدار هنگام جایگزینی چگونه escape شود. کلیدی که هیچ‌جا اعلام نشده باشد هنگام انتشار شکست می‌خورد؛ مقدار url ای که scheme آن http، https یا mailto نباشد، به‌جای رندر شدن رد می‌شود.

نسخهٔ منتشرشده منجمد است. ویرایش بدنهٔ یک قالب منتشرشده به‌جای تغییر آنچه ارسال‌های زنده به آن می‌رسند، پیش‌نویس تازه‌ای می‌سازد؛ پس همکاری که متن را بازنویسی می‌کند نمی‌تواند آنچه کد شما هم‌اکنون می‌فرستد را عوض کند، و ثابت‌کردن version یعنی هنگام انتشار او هم نمی‌تواند عوضش کند.

نمونه

نیازمند templates:read. limit تا 100 می‌رود، status نتیجه را به draft، active یا archived محدود می‌کند، و cursor مبهم است، پس همان nextCursor ای را که گرفته‌اید بازگردانید و خودتان یکی نسازید.

curl
curl "$OE/templates?limit=25&status=active" -H "$AUTH"
پاسخ
{  "object": "list",  "data": [    {      "object": "template",      "id": "tpl_9c1f0a4b7e05d3862c1f0a44",      "name": "Order shipped",      "slug": "order-shipped",      "description": null,      "status": "active",      "publishedVersion": 3,      "latestVersion": 4,      "createdAt": "2026-08-01T09:12:44.000Z",      "updatedAt": "2026-08-28T16:03:10.000Z"    }  ],  "hasMore": false,  "nextCursor": null}

publishedVersion همان چیزی است که ارسالِ بدون version به آن می‌رسد و latestVersion پیش‌نویسی است که روی آن نشسته. تفاوت این دو یعنی کسی ویرایش کرده و منتشر نکرده است. این خطا نیست، و نمایش آن در گزارش استقرار ارزش دارد.

هر ردیف، فراداده است. slots و props اعلام‌شده از یک بازیابی برمی‌گردند، و وقتی باید بدانید چه چیزی باید به یک قالب بدهید، همان فراخوانی درست است.