Quickstart
Kirim email pertama dalam tiga langkah: verifikasi domain, buat API key, lalu panggil API.
npm install f14
# atau
pip install f14import { F14 } from 'f14';
const f14 = new F14(process.env.F14_API_KEY);
const { data, error } = await f14.emails.send({
from: 'Acme <noreply@acme.id>',
to: 'user@example.com',
subject: 'Selamat datang',
html: '<p>Akun kamu sudah aktif.</p>',
});
if (error) {
console.error(error);
} else {
console.log('Email ID:', data.emailId);
}import os
from f14 import F14
client = F14(os.environ["F14_API_KEY"])
resp, _ = client.emails.send(payload={
"from": "Acme <noreply@acme.id>",
"to": "user@example.com",
"subject": "Selamat datang",
"html": "<p>Akun kamu sudah aktif.</p>",
})API key
Buat API key di dashboard lewat menu Dev settings → API keys. Sertakan di setiap request sebagai Authorization: Bearer <API_KEY>.
- Full access — semua endpoint, termasuk domain, kontak, dan campaign.
- Sending only — hanya mengirim email. Disarankan untuk server production.
- API key bisa dibatasi ke satu domain. API key hanya ditampilkan sekali saat dibuat.
Base URL: https://app.f14.email/api/v1
Verifikasi domain
Tambahkan domain di dashboard, lalu pasang record berikut di DNS provider kamu. Nilai persisnya ditampilkan di halaman domain.
| Tipe | Nama | Nilai |
|---|---|---|
| TXT | f14._domainkey | p=<public key> |
| TXT | v=spf1 include:spf.f14.email ~all | |
| MX | feedback-smtp.f14.email | |
| TXT | _dmarc | v=DMARC1; p=none; |
Status diperiksa otomatis secara berkala. Kamu juga bisa memicu pengecekan ulang dari dashboard atau lewat PUT /domains/{id}/verify.
POST /emails
Mengirim satu email. Response berisi emailId.
| Parameter | Tipe | Keterangan |
|---|---|---|
| from | string | Alamat pengirim dari domain yang sudah diverifikasi. Bisa dengan nama: "Acme <halo@acme.id>". |
| to | string | string[] | Penerima. |
| subject | string | Wajib, kecuali memakai templateId. |
| html | string | Isi HTML. Wajib salah satu dari html atau text. |
| text | string | Isi plain text. |
| templateId | string | ID template dari dashboard. |
| variables | Record<string, string> | Nilai variabel untuk template. |
| cc, bcc, replyTo | string | string[] | Opsional. |
| headers | Record<string, string> | Custom header email. |
| attachments | { filename, content }[] | Maksimal 10 lampiran. content dalam base64. |
| scheduledAt | string (ISO 8601) | Jadwalkan pengiriman, contoh 2026-10-15T09:00:00+07:00. |
| inReplyToId | string | ID email untuk membalas dalam thread yang sama. |
curl -X POST https://app.f14.email/api/v1/emails \
-H "Authorization: Bearer $F14_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: signup-8812" \
-d '{
"from": "noreply@acme.id",
"to": "user@example.com",
"subject": "Kode OTP",
"text": "Kode verifikasi kamu adalah 583109"
}'
# Response
{ "emailId": "cm3x9k2a10001qz8f7d2h4v1s" }Idempotency-Key (opsional, maks. 256 karakter): key dan body yang sama dalam 24 jam akan mengembalikanemailId yang sama tanpa mengirim ulang. Key yang sama dengan body berbeda menghasilkan 409 Conflict.
POST /emails/batch
Kirim hingga 100 email dalam satu request. Setiap item memakai format yang sama dengan POST /emails.
await f14.emails.batch(
[
{ from: 'halo@acme.id', to: 'a@example.com', subject: 'Halo A', html: '<p>Hai A</p>' },
{ from: 'halo@acme.id', to: 'b@example.com', subject: 'Halo B', html: '<p>Hai B</p>' },
],
{ idempotencyKey: 'welcome-batch-1' },
);Jadwal & pembatalan
Isi scheduledAt untuk menjadwalkan. Selama belum terkirim, jadwal bisa diubah dengan PATCH /emails/{emailId} atau dibatalkan dengan POST /emails/{emailId}/cancel.
const { data } = await f14.emails.send({
from: 'halo@acme.id',
to: 'user@example.com',
subject: 'Pengingat jadwal',
html: '<p>Sampai jumpa besok.</p>',
scheduledAt: '2026-10-15T09:00:00+07:00',
});
await f14.emails.cancel(data.emailId);Webhook
Tambahkan endpoint di dashboard dan pilih event yang ingin diterima. Setiap request berisi header berikut:
X-F14-Signature—v1=diikuti HMAC SHA-256 (hex) dari${timestamp}.${rawBody}.X-F14-Timestamp— waktu kirim dalam milidetik.X-F14-EventdanX-F14-Call— tipe event dan ID pengiriman.
Pengiriman yang gagal dicoba ulang hingga 6 kali dengan exponential backoff.
import { createHmac, timingSafeEqual } from 'crypto';
export async function POST(req: Request) {
const rawBody = await req.text();
const signature = req.headers.get('x-f14-signature') ?? '';
const timestamp = req.headers.get('x-f14-timestamp') ?? '';
if (Math.abs(Date.now() - Number(timestamp)) > 5 * 60 * 1000) {
return new Response('Stale webhook', { status: 400 });
}
const expected =
'v1=' +
createHmac('sha256', process.env.F14_WEBHOOK_SECRET!)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
const valid =
expected.length === signature.length &&
timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
if (!valid) return new Response('Invalid signature', { status: 401 });
const event = JSON.parse(rawBody);
console.log(event.type, event.data.id);
return new Response('OK');
}Event yang tersedia
SMTP
Gunakan kredensial berikut di framework atau tools kamu. Email yang dikirim lewat SMTP tetap muncul di log dan memicu webhook.
Semua endpoint
Semua path relatif terhadap https://app.f14.email/api/v1.
| POST | /emails | Kirim email |
| POST | /emails/batch | Kirim hingga 100 email |
| GET | /emails | Daftar email |
| GET | /emails/{emailId} | Detail email dan status |
| PATCH | /emails/{emailId} | Ubah jadwal email |
| POST | /emails/{emailId}/cancel | Batalkan email terjadwal |
| GET | POST | /domains | Daftar / tambah domain |
| PUT | /domains/{id}/verify | Verifikasi ulang domain |
| GET | POST | /contactBooks | Daftar / buat contact book |
| POST | /contactBooks/{id}/contacts | Tambah kontak |
| POST | /contactBooks/{id}/contacts/bulk | Tambah kontak massal |
| GET | POST | /campaigns | Daftar / buat campaign |
| POST | /campaigns/{id}/schedule | Jadwalkan campaign |
| POST | /campaigns/{id}/pause | resume | Pause atau lanjutkan campaign |
| GET | /analytics/email-time-series | Volume pengiriman per hari |
| GET | /analytics/reputation-metrics | Bounce rate dan complaint rate |
Butuh bantuan? support@f14.email