Quickstart

Kirim email pertama dalam tiga langkah: verifikasi domain, buat API key, lalu panggil API.

Terminal
npm install f14
# atau
pip install f14
TypeScript
import { 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);
}
Python
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.

TipeNamaNilai
TXTf14._domainkeyp=<public key>
TXTmailv=spf1 include:spf.f14.email ~all
MXmailfeedback-smtp.f14.email
TXT_dmarcv=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.

ParameterTipeKeterangan
fromstringAlamat pengirim dari domain yang sudah diverifikasi. Bisa dengan nama: "Acme <halo@acme.id>".
tostring | string[]Penerima.
subjectstringWajib, kecuali memakai templateId.
htmlstringIsi HTML. Wajib salah satu dari html atau text.
textstringIsi plain text.
templateIdstringID template dari dashboard.
variablesRecord<string, string>Nilai variabel untuk template.
cc, bcc, replyTostring | string[]Opsional.
headersRecord<string, string>Custom header email.
attachments{ filename, content }[]Maksimal 10 lampiran. content dalam base64.
scheduledAtstring (ISO 8601)Jadwalkan pengiriman, contoh 2026-10-15T09:00:00+07:00.
inReplyToIdstringID email untuk membalas dalam thread yang sama.
cURL
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.

TypeScript
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.

TypeScript
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-Event dan X-F14-Call — tipe event dan ID pengiriman.

Pengiriman yang gagal dicoba ulang hingga 6 kali dengan exponential backoff.

Next.js route handler
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

email.queuedemail.sentemail.deliveredemail.delivery_delayedemail.openedemail.clickedemail.bouncedemail.complainedemail.rejectedemail.failedemail.suppressedemail.cancelledemail.rendering_failurecontact.createdcontact.updatedcontact.deleteddomain.createddomain.verifieddomain.updateddomain.deleted

SMTP

Gunakan kredensial berikut di framework atau tools kamu. Email yang dikirim lewat SMTP tetap muncul di log dan memicu webhook.

Host
smtp.f14.email
Port
465, 2465 (TLS) · 587, 2587 (STARTTLS)
Username
f14
Password
API key kamu

Semua endpoint

Semua path relatif terhadap https://app.f14.email/api/v1.

POST/emailsKirim email
POST/emails/batchKirim hingga 100 email
GET/emailsDaftar email
GET/emails/{emailId}Detail email dan status
PATCH/emails/{emailId}Ubah jadwal email
POST/emails/{emailId}/cancelBatalkan email terjadwal
GET | POST/domainsDaftar / tambah domain
PUT/domains/{id}/verifyVerifikasi ulang domain
GET | POST/contactBooksDaftar / buat contact book
POST/contactBooks/{id}/contactsTambah kontak
POST/contactBooks/{id}/contacts/bulkTambah kontak massal
GET | POST/campaignsDaftar / buat campaign
POST/campaigns/{id}/scheduleJadwalkan campaign
POST/campaigns/{id}/pause | resumePause atau lanjutkan campaign
GET/analytics/email-time-seriesVolume pengiriman per hari
GET/analytics/reputation-metricsBounce rate dan complaint rate

Butuh bantuan? support@f14.email