PostRabbit Transactional Email API Documentation

This document details all API endpoints for sending, retrieving, and managing transactional emails.

Base URL

https://api.postrabbit.com

All endpoints below are relative to this base URL.

Authentication

This API uses a Basic Authorization header with an API key token.

  • The API key is sent by itself (no username or password)
  • The API key is Base64-encoded

Header Format:

Authorization: Basic <base64(API_KEY)>

Example (Linux/Mac)

echo -n "YOUR_API_KEY" | base64

Header sent:

Authorization: Basic MTIzNDU2Nzg5IQ==

Example (C# .NET 4.7.2):


    string apiKey = "YOURAPIKEY";

    // Base64 encode the API key ONLY
    string authValue = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(apiKey));

    client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", authValue);
            

1. Send Message — multipart/form-data

POST /v1/messages

Send a transactional email using individual form fields.

Headers

Authorization - Basic Authentication.  Encode only your API key.

Content-Type:

multipart/form-data

Parameters

FieldRequiredDescription
fromYesEmail address of sender
toYesEmail(s) of recipient(s), comma-separated
subjectYesEmail subject
HtmlViewYes*HTML body (or provide TextView)
TextViewOptionalText-only body
CcAddressOptionalCC email addresses
BccAddressOptionalBCC email addresses
SendAfterDateTimeOptionalRFC-2822 schedule time in UTC timezone (defaults to UtcNow)
TrackingOptionaltrue / false / yes / no
SuppressHeadersOptionaltrue / false / yes / no
HeadersOptionalCustom Headers
AttachmentsOptionalSend attachments using fields named attachmentX

Response (JSON)

{
    "status": "ok",
    "EmailID": "generated-message-id"
}

Code Examples

cURL Example

    curl -X POST "https://api.postrabbit.com/v1/messages" \
    -H "Authorization: Basic BASE64ENCODEDKEY" \
    -F "from=from@email.com" \
    -F "to=to@email.com" \
    -F "subject=PostRabbit Email is Easy" \
    -F "HtmlView=<b>Hello World</b>" \
    -F "TextView=This is a text email" \
    -F "SendAfterDateTime=Tue, 11 Feb 2026 15:00:00 +0000" \
    -F "Tracking=true" \
    -F "CcAddress=cc@email.com" \
    -F "SuppressHeaders=true" \
    -F "Headers=X-Report-Abuse:Please report abuse for this email to: email@email.com" \
    -F "Headers=List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>" \
    -F "BccAddress=1@email.com,2@email.com" \ 
    -F "attachment1=/path/to/file1.jpg" \
    -F "attachment2=/path/to/file2.pdf"
JavaScript (Browser fetch)


   
const apiUrl = "https://api.postrabbit.com/v1/messages";

// Your API key (NOT username:password, just the key)
const apiKey = "YOURAPIKEY";

// Base64 encode exactly what your API expects
const authValue = btoa(apiKey);

const form = new FormData();

// ---- Required fields ----
form.append("from", "from@email.com");
form.append("to", "to@email.com");
form.append("subject", "PostRabbit Email is Easy");

// --- At least one of the two fields needs to be set ---
form.append("HtmlView", "<b>Hello World</b>");
form.append("TextView", "This is a text email");

// --- Optional Fields ---
const sendAfter = new Date(Date.now() + 24 * 60 * 60 * 1000)
    .toUTCString();

form.append("SendAfterDateTime", sendAfter);
form.append("Tracking", "true");
form.append("CcAddress", "cc@email.com");

// Suppress default headers
form.append("SuppressHeaders", "true");

// Add custom headers (repeatable field)
form.append("Headers", "X-Report-Abuse:Please report abuse for this email to: email@email.com");
form.append("Headers", "List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>");

// BCC
form.append("BccAddress", "1@email.com,2@email.com");

fetch(apiUrl, {
    method: "POST",
    headers: {
        "Authorization": `Basic ${authValue}`
    },
    body: form
})
.then(response => response.text())
.then(data => {
    console.log("Response:", data);
})
.catch(error => {
    console.error("Error:", error);
});
     
Node.js (axios)

 
import fs from "fs";
import axios from "axios";
import FormData from "form-data";

const apiUrl = "https://api.postrabbit.com/v1/messages";

// Your API key (NOT username:password, just the key)
const apiKey = "YOURAPIKEY";

// Base64 encode exactly what your API expects
const authValue = Buffer.from(apiKey, "ascii").toString("base64");

const form = new FormData();

// ---- Required fields ----
form.append("from", "from@email.com");
form.append("to", "to@email.com");
form.append("subject", "PostRabbit Email is Easy");

// --- At least one of the two fields needs to be set ---
form.append("HtmlView", "<b>Hello World</b>");
form.append("TextView", "This is a text email");

// --- Optional Fields ---
const sendAfter = new Date(Date.now() + 24 * 60 * 60 * 1000).toUTCString();

form.append("SendAfterDateTime", sendAfter);
form.append("Tracking", "true");
form.append("CcAddress", "cc@email.com");

// Suppress default headers
form.append("SuppressHeaders", "true");

// Add custom headers (repeatable field)
form.append("Headers", "X-Report-Abuse:Please report abuse for this email to: email@email.com");
form.append("Headers", "List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>");

// BCC
const bccAddresses = ["1@email.com", "2@email.com"];
form.append("BccAddress", bccAddresses.join(","));

// Attachments
form.append("attachment1", fs.createReadStream("FILEPATH"));
form.append("attachment1", fs.createReadStream("FILEPATH2"));

// Send the request with Axios
axios.post(apiUrl, form, {
    headers: {
        "Authorization": `Basic ${authValue}`,
        ...form.getHeaders() // necessary for multipart/form-data
    }
})
.then(response => {
    console.log("Status:", response.status);
    console.log("Response:", response.data);
})
.catch(error => {
    console.error("Error:", error.response ? error.response.data : error.message);
});
Python (requests)

    import base64
    import requests
    from datetime import datetime, timedelta

    api_url = "https://api.postrabbit.com/v1/messages"

    # Your API key (NOT username:password, just the key)
    api_key = "YOURAPIKEY"

    # Base64 encode exactly what your API expects
    auth_value = base64.b64encode(api_key.encode("ascii")).decode("ascii")

    headers = {
    "Authorization": f"Basic {auth_value}"
    }

    # ---- Required fields ----
    data = {
    "from": "from@email.com",
    "to": "to@email.com",
    "subject": "PostRabbit Email is Easy",
    "HtmlView": "<b>Hello World</b>",
    "TextView": "This is a text email",
    "SendAfterDateTime": (datetime.utcnow() + timedelta(days=1)).strftime("%a, %d %b %Y %H:%M:%S +0000"),
    "Tracking": "true",
    "CcAddress": "cc@email.com",
    "SuppressHeaders": "true",
    "Headers": "X-Report-Abuse:Please report abuse for this email to: email@email.com",
    # Repeatable Headers field for List-Unsubscribe
    "Headers": "List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>",
    "BccAddress": "1@email.com,2@email.com"
    }

    # --- Optional Attachments ---
    files = {
    "attachment1": open("FILEPATH", "rb"),
    "attachment1": open("FILEPATH2", "rb")
    }

    response = requests.post(api_url, headers=headers, data=data, files=files)

    print("Status:", response.status_code)
    print("Response:", response.text)
Java (OkHttp)

    import okhttp3.*;
    import java.io.File;
    import java.io.IOException;
    import java.nio.charset.StandardCharsets;
    import java.util.Base64;

    public class PostRabbitOkHttpExample {
    public static void main(String[] args) throws IOException {
    String apiUrl = "https://api.postrabbit.com/v1/messages";
    String apiKey = "YOURAPIKEY";

    // Base64 encode API key
    String authValue = Base64.getEncoder().encodeToString(apiKey.getBytes(StandardCharsets.US_ASCII));

    OkHttpClient client = new OkHttpClient();

    // Build multipart form
    MultipartBody.Builder builder = new MultipartBody.Builder()
    .setType(MultipartBody.FORM);

    // ---- Required fields ----
    builder.addFormDataPart("from", "from@email.com");
    builder.addFormDataPart("to", "to@email.com");
    builder.addFormDataPart("subject", "PostRabbit Email is Easy");

    // --- At least one of the two fields needs to be set ---
    builder.addFormDataPart("HtmlView", "<b>Hello World</b>");
    builder.addFormDataPart("TextView", "This is a text email");

    // --- Optional Fields ---
    String sendAfter = java.time.ZonedDateTime.now().plusDays(1)
    .format(java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME);
    builder.addFormDataPart("SendAfterDateTime", sendAfter);
    builder.addFormDataPart("Tracking", "true");
    builder.addFormDataPart("CcAddress", "cc@email.com");
    builder.addFormDataPart("SuppressHeaders", "true");

    // Custom headers
    builder.addFormDataPart("Headers", "X-Report-Abuse:Please report abuse for this email to: email@email.com");
    builder.addFormDataPart("Headers", "List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>");

    // BCC
    builder.addFormDataPart("BccAddress", "1@email.com,2@email.com");

    // Optional attachments
    builder.addFormDataPart("attachment1", "FileName1.jpg",
    RequestBody.create(new File("FILEPATH"), MediaType.parse("application/octet-stream")));
    builder.addFormDataPart("attachment1", "FileName2.jpg",
    RequestBody.create(new File("FILEPATH2"), MediaType.parse("application/octet-stream")));

    RequestBody requestBody = builder.build();

    // Build request
    Request request = new Request.Builder()
    .url(apiUrl)
    .addHeader("Authorization", "Basic " + authValue)
    .post(requestBody)
    .build();

    // Send request
    try (Response response = client.newCall(request).execute()) {
    System.out.println("Status: " + response.code());
    System.out.println("Response: " + response.body().string());
    }
    }
    }
C# (.NET HttpClient)

    var apiUrl = "https://api.postrabbit.com/v1/messages";

    // Your API key (NOT username:password, just the key)
    string apiKey = "YOURAPIKEY";

    // Base64 encode exactly what your API expects
    string authValue = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(apiKey));

    using (var client = new HttpClient())
    {
    client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", authValue);

    var form = new MultipartFormDataContent();

    // ---- Required fields ----
    form.Add(new StringContent("from@email.com"), "from");
    form.Add(new StringContent("to@email.com"), "to");
    form.Add(new StringContent("PostRabbit Email is Easy"), "subject");
    //

    // --- At least one of the two fields needs to be set ---
    form.Add(new StringContent(""<b>Hello World</b>""), "HtmlView");
    form.Add(new StringContent("This is a text email"), "TextView");
    //

    // --- Optional Fields ---
    form.Add(new StringContent(DateTimeOffset.UtcNow.AddDays(1).ToString("ddd, dd MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture)), "SendAfterDateTime");
    form.Add(new StringContent("true"), "Tracking");
    form.Add(new StringContent("cc@email.com"), "CcAddress");

    //SuppressHeaders will remove all PostRabbit headers so you can add custom headers
    form.Add(new System.Net.Http.StringContent("true"), "SuppressHeaders");

    //Add custom headers using key:value
    form.Add(new System.Net.Http.StringContent("X-Report-Abuse:Please report abuse for this email to: email@email.com"), "Headers");
    form.Add(new System.Net.Http.StringContent("List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>"), "Headers");


    List
        bccAddresses = new List
            {
            "1@email.com",
            "2@email.com"
            };

            string bccHeader = string.Join(",", bccAddresses);

            form.Add(new StringContent(bccHeader), "BccAddress");
            //


            //Optional Attachments
            List
                attachments = new List
                    ();

                    attachments.Add("FILEPATH");
                    attachments.Add("FILEPATH2");



                    foreach (string attach in attachments)
                    {
                    var fileBytes = System.IO.File.ReadAllBytes(attach);
                    var fileContent = new ByteArrayContent(fileBytes);
                    string mimeType = System.Web.MimeMapping.GetMimeMapping(attach);
                    fileContent.Headers.ContentType = new MediaTypeHeaderValue(mimeType);


                    form.Add(fileContent, "attachment1", "FileName.jpg");
                    }
                    //

                    var response = client.PostAsync(apiUrl, form).GetAwaiter().GetResult();
                    var body = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

                    Console.WriteLine("Status: " + response.StatusCode);
                    Console.WriteLine(body);
                    }
PHP (curl)

    
    $apiUrl = "https://api.postrabbit.com/v1/messages";
    $apiKey = "YOURAPIKEY";

    // Base64 encode API key
    $authValue = base64_encode($apiKey);

    // Form fields
    $postFields = [
    "from" => "from@email.com",
    "to" => "to@email.com",
    "subject" => "PostRabbit Email is Easy",
    "HtmlView" => "<b>Hello World</b>",
    "TextView" => "This is a text email",
    "SendAfterDateTime" => gmdate("D, d M Y H:i:s") . " +0000",
    "Tracking" => "true",
    "CcAddress" => "cc@email.com",
    "SuppressHeaders" => "true",
    "Headers" => [
    "X-Report-Abuse:Please report abuse for this email to: email@email.com",
    "List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>"
    ],
    "BccAddress" => "1@email.com,2@email.com",
    // Attachments
    "attachment1" => new CURLFile("FILEPATH"),
    "attachment1" => new CURLFile("FILEPATH2")
    ];

    // Initialize cURL
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Basic $authValue"
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);

    // Execute request
    $response = curl_exec($ch);

    if(curl_errno($ch)) {
    echo "Error: " . curl_error($ch);
    } else {
    echo "Response: " . $response;
    }

    curl_close($ch);
    
Go (net/http)

    package main

    import (
    "bytes"
    "encoding/base64"
    "fmt"
    "io"
    "mime/multipart"
    "net/http"
    "os"
    "strings"
    "time"
    )

    func main() {
    apiUrl := "https://api.postrabbit.com/v1/messages"
    apiKey := "YOURAPIKEY"

    // Base64 encode API key
    authValue := base64.StdEncoding.EncodeToString([]byte(apiKey))

    // Prepare multipart form
    var buf bytes.Buffer
    writer := multipart.NewWriter(&buf)

    // ---- Required fields ----
    writer.WriteField("from", "from@email.com")
    writer.WriteField("to", "to@email.com")
    writer.WriteField("subject", "PostRabbit Email is Easy")

    // --- At least one of the two fields needs to be set ---
    writer.WriteField("HtmlView", "<b>Hello World</b>")
    writer.WriteField("TextView", "This is a text email")

    // --- Optional Fields ---
    sendAfter := time.Now().Add(24 * time.Hour).UTC().Format(time.RFC1123)
    writer.WriteField("SendAfterDateTime", sendAfter)
    writer.WriteField("Tracking", "true")
    writer.WriteField("CcAddress", "cc@email.com")
    writer.WriteField("SuppressHeaders", "true")

    // Custom headers
    writer.WriteField("Headers", "X-Report-Abuse:Please report abuse for this email to: email@email.com")
    writer.WriteField("Headers", "List-Unsubscribe:<https://www.website.com/emailoptout.aspx?email=email@email.com>, <mailto:bounce@website.com?subject=unsubscribeemail@email.com>")

    // BCC
    writer.WriteField("BccAddress", "1@email.com,2@email.com")

    // Optional attachments
    attachFiles := []string{"FILEPATH", "FILEPATH2"}
    for _, path := range attachFiles {
    file, err := os.Open(path)
    if err != nil {
    fmt.Println("Error opening file:", err)
    return
    }
    defer file.Close()
    part, _ := writer.CreateFormFile("attachment1", path)
    io.Copy(part, file)
    }

    writer.Close()

    // Prepare HTTP request
    req, err := http.NewRequest("POST", apiUrl, &buf)
    if err != nil {
    fmt.Println("Error creating request:", err)
    return
    }

    req.Header.Set("Authorization", "Basic "+authValue)
    req.Header.Set("Content-Type", writer.FormDataContentType())

    // Send request
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
    fmt.Println("Error sending request:", err)
    return
    }
    defer resp.Body.Close()

    body, _ := io.ReadAll(resp.Body)
    fmt.Println("Status:", resp.Status)
    fmt.Println("Response:", string(body))
    }

2. Send MIME Message

POST /v1/messages.mime

Send a raw MIME email (RFC822 format). Supports attachments included inside the MIME structure.

Headers

Content-Type: message/rfc822
Authorization: Basic <base64(apiKey)>

Response

{ "message": "Queued.", "id": "…" }

Code Examples

cURL

    #!/bin/bash

    # === Configuration ===
    API_URL="https://api.postrabbit.com/v1/messages.mime"
    API_KEY="YOURAPIKEY"

    FROM="email@yourdomain.com"
    TO="test@testdomain.com"
    CC="cc@email.com"
    BCC="bcc@email.com"
    SUBJECT="This is a Mime Test"
    TEXT_BODY="text view mime"
    HTML_BODY="<p>This is a PR mime test</p>"
    SEND_AFTER=$(date -u -d "+1 day" +"%a, %d %b %Y %H:%M:%S +0000")
    TRACKING="true"
    SUPPRESS_HEADERS="true"
    X_REPORT_ABUSE="Please report abuse for this email to: email@email.com"
    LIST_UNSUBSCRIBE="<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>"

    ATTACHMENTS=("C:/Test/FileName1.jpg" "C:/Test/FileName2.pdf")
    BOUNDARY="----=_Part_0_$(date +%s)"

    # === Build MIME message ===
    {
    echo "From: ${FROM}"
    echo "To: ${TO}"
    echo "Cc: ${CC}"
    echo "Bcc: ${BCC}"
    echo "Subject: ${SUBJECT}"
    echo "SendAfterDateTime: ${SEND_AFTER}"
    echo "Tracking: ${TRACKING}"
    echo "SuppressOurHeaders: ${SUPPRESS_HEADERS}"
    echo "X-Report-Abuse: ${X_REPORT_ABUSE}"
    echo "List-Unsubscribe: ${LIST_UNSUBSCRIBE}"
    echo "MIME-Version: 1.0"
    echo "Content-Type: multipart/mixed; boundary=\"$BOUNDARY\""
    echo
    echo "--$BOUNDARY"
    echo "Content-Type: text/plain; charset=UTF-8"
    echo
    echo "$TEXT_BODY"
    echo
    echo "--$BOUNDARY"
    echo "Content-Type: text/html; charset=UTF-8"
    echo
    echo "$HTML_BODY"
    echo

    # === Add attachments ===
    for FILE in "${ATTACHMENTS[@]}"; do
    if [[ -f "$FILE" ]]; then
    FILENAME=$(basename "$FILE")
    MIMETYPE=$(file --mime-type -b "$FILE")
    echo "--$BOUNDARY"
    echo "Content-Type: $MIMETYPE"
    echo "Content-Disposition: attachment; filename=\"$FILENAME\""
    echo "Content-Transfer-Encoding: base64"
    echo
    base64 "$FILE"
    echo
    fi
    done

    echo "--$BOUNDARY--"

    } > email.mime

    # === Send via cURL ===
    curl -X POST "$API_URL" \
    -H "Authorization: Basic $(echo -n $API_KEY | base64)" \
    -H "Content-Type: message/rfc822" \
    --data-binary @email.mime
 
JavaScript (Browser fetch)

    async function sendMimeEmail() {
    const apiUrl = "https://api.postrabbit.com/v1/messages.mime";
    const apiKey = "YOURAPIKEY";

    // Base64 encode API key
    const authValue = btoa(apiKey);

    // Email fields
    const from = "email@yourdomain.com";
    const to = "test@testdomain.com";
    const cc = "cc@email.com";
    const bcc = "bcc@email.com";
    const subject = "This is a Mime Test";
    const textBody = "text view mime";
    const htmlBody = "<p>This is a PR mime test</p>";
    const sendAfter = new Date(Date.now() + 24*60*60*1000).toUTCString();
    const tracking = "true";
    const suppressHeaders = "true";
    const xReportAbuse = "Please report abuse for this email to: email@email.com";
    const listUnsubscribe = "<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>";

    // Get attachments from file input
    const input = document.getElementById("attachments");
    const files = input.files;

    // Build FormData for multipart upload
    const form = new FormData();
    form.append("from", from);
    form.append("to", to);
    form.append("subject", subject);
    form.append("HtmlView", htmlBody);
    form.append("TextView", textBody);
    form.append("CcAddress", cc);
    form.append("BccAddress", bcc);
    form.append("SendAfterDateTime", sendAfter);
    form.append("Tracking", tracking);
    form.append("SuppressOurHeaders", suppressHeaders);
    form.append("Headers", "X-Report-Abuse:" + xReportAbuse);
    form.append("Headers", "List-Unsubscribe:" + listUnsubscribe);

    // Add attachments
    for (let i = 0; i < files.length; i++) {
    form.append("attachment" + (i+1), files[i], files[i].name);
    }

    // Send request
    try {
    const response = await fetch(apiUrl, {
    method: "POST",
    headers: {
    "Authorization": `Basic ${authValue}`
    },
    body: form
    });

    const result = await response.text();
    console.log("Status:", response.status);
    console.log("Response:", result);
    } catch (error) {
    console.error("Error:", error);
    }
Node.js (axios)

    import fs from "fs";
    import axios from "axios";

    // === Configuration ===
    const apiUrl = "https://api.postrabbit.com/v1/messages.mime";
    const apiKey = "YOURAPIKEY";

    // Base64 encode API key for Basic Auth
    const authValue = Buffer.from(apiKey, "ascii").toString("base64");

    // Email fields
    const from = "email@yourdomain.com";
    const to = "test@testdomain.com";
    const cc = "cc@email.com";
    const bcc = "bcc@email.com";
    const subject = "This is a Mime Test";
    const textBody = "text view mime";
    const htmlBody = "<p>This is a PR mime test</p>";
    const sendAfter = new Date(Date.now() + 24*60*60*1000).toUTCString();
    const tracking = "true";
    const suppressHeaders = "true";
    const xReportAbuse = "Please report abuse for this email to: email@email.com";
    const listUnsubscribe = "<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>";

    // Attachments
    const attachments = [
    "C:/Test/FileName1.jpg",
    "C:/Test/FileName2.pdf"
    ];

    // === Build MIME message ===
    const boundary = "----=_NodeMime_" + Date.now();

    let mimeParts = [];

    // Headers
    mimeParts.push(`From: ${from}`);
    mimeParts.push(`To: ${to}`);
    mimeParts.push(`Cc: ${cc}`);
    mimeParts.push(`Bcc: ${bcc}`);
    mimeParts.push(`Subject: ${subject}`);
    mimeParts.push(`SendAfterDateTime: ${sendAfter}`);
    mimeParts.push(`Tracking: ${tracking}`);
    mimeParts.push(`SuppressOurHeaders: ${suppressHeaders}`);
    mimeParts.push(`X-Report-Abuse: ${xReportAbuse}`);
    mimeParts.push(`List-Unsubscribe: ${listUnsubscribe}`);
    mimeParts.push(`MIME-Version: 1.0`);
    mimeParts.push(`Content-Type: multipart/mixed; boundary="${boundary}"`);
    mimeParts.push(""); // blank line

    // Text part
    mimeParts.push(`--${boundary}`);
    mimeParts.push(`Content-Type: text/plain; charset="UTF-8"`);
    mimeParts.push("");
    mimeParts.push(textBody);

    // HTML part
    mimeParts.push(`--${boundary}`);
    mimeParts.push(`Content-Type: text/html; charset="UTF-8"`);
    mimeParts.push("");
    mimeParts.push(htmlBody);

    // Attachments
    attachments.forEach(filePath => {
    if (!fs.existsSync(filePath)) return;
    const content = fs.readFileSync(filePath);
    const base64Content = content.toString("base64");
    const filename = filePath.split("/").pop();
    const mimeType = require("mime-types").lookup(filePath) || "application/octet-stream";

    mimeParts.push(`--${boundary}`);
    mimeParts.push(`Content-Type: ${mimeType}`);
    mimeParts.push(`Content-Disposition: attachment; filename="${filename}"`);
    mimeParts.push(`Content-Transfer-Encoding: base64`);
    mimeParts.push("");
    mimeParts.push(base64Content);
    });

    // Close boundary
    mimeParts.push(`--${boundary}--`);

    // Combine MIME message
    const mimeMessage = mimeParts.join("\r\n");

    // === Send via Axios ===
    axios.post(apiUrl, mimeMessage, {
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Content-Type": "message/rfc822"
    }
    })
    .then(response => {
    console.log("Status:", response.status);
    console.log("Response:", response.data);
    })
    .catch(err => {
    console.error("Error:", err.response ? err.response.data : err.message);
    });
 
Python (requests)

    import base64
    import requests
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.application import MIMEApplication
    from datetime import datetime, timedelta
    import os
    import mimetypes

    # === Configuration ===
    api_url = "https://api.postrabbit.com/v1/messages.mime"
    api_key = "YOURAPIKEY"

    auth_value = base64.b64encode(api_key.encode("ascii")).decode("ascii")

    from_addr = "email@yourdomain.com"
    to_addr = "test@testdomain.com"
    cc_addr = "cc@email.com"
    bcc_addr = "bcc@email.com"
    subject = "This is a Mime Test"
    text_body = "text view mime"
    html_body = "<p>This is a PR mime test</p>"
    send_after = (datetime.utcnow() + timedelta(days=1)).strftime("%a, %d %b %Y %H:%M:%S +0000")
    tracking = "true"
    suppress_headers = "true"
    x_report_abuse = "Please report abuse for this email to: email@email.com"
    list_unsubscribe = "<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>"

    attachments = [
    r"C:\Test\FileName1.jpg",
    r"C:\Test\FileName2.pdf"
    ]

    # === Build MIME email ===
    msg = MIMEMultipart()
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Cc'] = cc_addr
    msg['Bcc'] = bcc_addr
    msg['Subject'] = subject
    msg['SendAfterDateTime'] = send_after
    msg['Tracking'] = tracking
    msg['SuppressOurHeaders'] = suppress_headers
    msg['X-Report-Abuse'] = x_report_abuse
    msg['List-Unsubscribe'] = list_unsubscribe

    # Text and HTML body
    msg.attach(MIMEText(text_body, 'plain'))
    msg.attach(MIMEText(html_body, 'html'))

    # Attach files
    for path in attachments:
    if not os.path.exists(path):
    continue
    mime_type, _ = mimetypes.guess_type(path)
    mime_type = mime_type or "application/octet-stream"
    with open(path, "rb") as f:
    part = MIMEApplication(f.read(), _subtype=mime_type.split('/')[-1])
    part.add_header('Content-Disposition', 'attachment', filename=os.path.basename(path))
    msg.attach(part)

    # Convert MIME message to bytes
    mime_bytes = msg.as_bytes()

    # === Send request ===
    headers = {
    "Authorization": f"Basic {auth_value}",
    "Content-Type": "message/rfc822"
    }

    response = requests.post(api_url, headers=headers, data=mime_bytes)

    print("Status:", response.status_code)
    print("Response:", response.text)
 
Java (OkHttp)

    import okhttp3.*;
    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.util.Base64;

    public class PostRabbitMimeOkHttp {

    public static void main(String[] args) throws IOException {
    String apiUrl = "https://api.postrabbit.com/v1/messages.mime";
    String apiKey = "YOURAPIKEY";

    // Base64 encode API key
    String authValue = Base64.getEncoder().encodeToString(apiKey.getBytes("ASCII"));

    // Email fields
    String from = "email@yourdomain.com";
    String to = "test@testdomain.com";
    String cc = "cc@email.com";
    String bcc = "bcc@email.com";
    String subject = "This is a Mime Test";
    String textBody = "text view mime";
    String htmlBody = "<p>This is a PR mime test</p>";
    String sendAfter = java.time.ZonedDateTime.now().plusDays(1)
    .format(java.time.format.DateTimeFormatter.RFC_1123_DATE_TIME);
    String tracking = "true";
    String suppressHeaders = "true";
    String xReportAbuse = "Please report abuse for this email to: email@email.com";
    String listUnsubscribe = "<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>";

    // Attachments
    String[] attachments = {"C:/Test/FileName1.jpg", "C:/Test/FileName2.pdf"};

    // === Build MIME message ===
    String boundary = "----=_OkHttpMime_" + System.currentTimeMillis();
    StringBuilder mimeBuilder = new StringBuilder();

    // Headers
    mimeBuilder.append("From: ").append(from).append("\r\n");
    mimeBuilder.append("To: ").append(to).append("\r\n");
    mimeBuilder.append("Cc: ").append(cc).append("\r\n");
    mimeBuilder.append("Bcc: ").append(bcc).append("\r\n");
    mimeBuilder.append("Subject: ").append(subject).append("\r\n");
    mimeBuilder.append("SendAfterDateTime: ").append(sendAfter).append("\r\n");
    mimeBuilder.append("Tracking: ").append(tracking).append("\r\n");
    mimeBuilder.append("SuppressOurHeaders: ").append(suppressHeaders).append("\r\n");
    mimeBuilder.append("X-Report-Abuse: ").append(xReportAbuse).append("\r\n");
    mimeBuilder.append("List-Unsubscribe: ").append(listUnsubscribe).append("\r\n");
    mimeBuilder.append("MIME-Version: 1.0\r\n");
    mimeBuilder.append("Content-Type: multipart/mixed; boundary=\"").append(boundary).append("\"\r\n\r\n");

    // Text part
    mimeBuilder.append("--").append(boundary).append("\r\n");
    mimeBuilder.append("Content-Type: text/plain; charset=\"UTF-8\"\r\n\r\n");
    mimeBuilder.append(textBody).append("\r\n\r\n");

    // HTML part
    mimeBuilder.append("--").append(boundary).append("\r\n");
    mimeBuilder.append("Content-Type: text/html; charset=\"UTF-8\"\r\n\r\n");
    mimeBuilder.append(htmlBody).append("\r\n\r\n");

    // Attachments
    for (String path : attachments) {
    File file = new File(path);
    if (!file.exists()) continue;

    String mimeType = Files.probeContentType(file.toPath());
    if (mimeType == null) mimeType = "application/octet-stream";
    byte[] fileBytes = Files.readAllBytes(file.toPath());
    String base64Content = Base64.getEncoder().encodeToString(fileBytes);

    mimeBuilder.append("--").append(boundary).append("\r\n");
    mimeBuilder.append("Content-Type: ").append(mimeType).append("\r\n");
    mimeBuilder.append("Content-Disposition: attachment; filename=\"").append(file.getName()).append("\"\r\n");
    mimeBuilder.append("Content-Transfer-Encoding: base64\r\n\r\n");
    mimeBuilder.append(base64Content).append("\r\n\r\n");
    }

    // Close boundary
    mimeBuilder.append("--").append(boundary).append("--\r\n");

    String mimeMessage = mimeBuilder.toString();

    // === Send via OkHttp ===
    OkHttpClient client = new OkHttpClient();

    RequestBody body = RequestBody.create(
    mimeMessage,
    MediaType.parse("message/rfc822")
    );

    Request request = new Request.Builder()
    .url(apiUrl)
    .addHeader("Authorization", "Basic " + authValue)
    .post(body)
    .build();

    try (Response response = client.newCall(request).execute()) {
    System.out.println("Status: " + response.code());
    System.out.println("Response: " + response.body().string());
    }
    }
    }

      
C# (.NET HttpClient)


    var apiUrl = "https://api.postrabbit.com/v1/messages.mime";

    // Your API key (NOT username:password, just the key)
    string apiKey = "YOURAPIKEY";

    // Base64 encode exactly what your API expects
    string authValue = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(apiKey));

    using (var client = new HttpClient())
    {
    client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", authValue);

    // ---- Required fields ----
    MimeMessage email = new MimeMessage();

    email.From.Add(new MailboxAddress("email@yourdomain.com", "email@yourdomain.com"));
    email.To.Add(MailboxAddress.Parse("test@testdomain.com"));
    email.Subject = "This is a Mime Test";

    BodyBuilder bodyBuilder = new BodyBuilder();

    bodyBuilder.HtmlBody = "<p>This is a PR mime test</p>";
    bodyBuilder.TextBody = "text view mime";

    email.Cc.Add(new MailboxAddress("cc@email.com", "cc@email.com"));
    email.Bcc.Add(new MailboxAddress("bcc@email.com", "bcc@email.com"));

    email.Headers.Add("SendAfterDateTime", DateTimeOffset.UtcNow.AddDays(1).ToString("ddd, dd MMM yyyy HH:mm:ss zzz", CultureInfo.InvariantCulture));
    email.Headers.Add("Tracking", "true");
    email.Headers.Add("SuppressOurHeaders", "true");

    email.Headers.Add("X-Report-Abuse", "Please report abuse for this email to: email@email.com");
    email.Headers.Add("List-Unsubscribe",  "<p>https: //www.website.com/emailoptout.aspx?Email=test@test.com</p>, " + "<p>mailto:bounce@email.com?subject =unsubscribe test@test.com</p>");

    List
        attachments = new List
            {
            "C:\Test\FileName1.jpg",
            "C:\Test\FileName2.pdf"
            };

            foreach (var path in attachments)
            {
            if (!System.IO.File.Exists(path))
            continue;

            var mimeType = System.Web.MimeMapping.GetMimeMapping(path);

            bodyBuilder.Attachments.Add(
            path,                       // file path (MimeKit reads it)
            MimeKit.ContentType.Parse(mimeType) // correct MIME type
            );
            }
            email.Body = bodyBuilder.ToMessageBody();

            byte[] mimeBytes;

            using (var ms = new MemoryStream())
            {
            email.WriteTo(ms);
            mimeBytes = ms.ToArray();
            }

            var content = new ByteArrayContent(mimeBytes);
            content.Headers.ContentType =
            new MediaTypeHeaderValue("message/rfc822");


            var response = client.PostAsync(apiUrl, content).GetAwaiter().GetResult();
            var body = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();

            Console.WriteLine("Status: " + response.StatusCode);
            Console.WriteLine(body);

            }

      
PHP (curl)

    $apiUrl = "https://api.postrabbit.com/v1/messages.mime";
    $apiKey = "YOURAPIKEY";

    // Base64 encode API key
    $authValue = base64_encode($apiKey);

    // Email fields
    $from = "email@yourdomain.com";
    $to = "test@testdomain.com";
    $cc = "cc@email.com";
    $bcc = "bcc@email.com";
    $subject = "This is a Mime Test";
    $textBody = "text view mime";
    $htmlBody = "<p>This is a PR mime test</p>";
    $sendAfter = gmdate("D, d M Y H:i:s") . " +0000";
    $tracking = "true";
    $suppressHeaders = "true";
    $xReportAbuse = "Please report abuse for this email to: email@email.com";
    $listUnsubscribe = "<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>";

    // Attachments
    $attachments = [
    "C:/Test/FileName1.jpg",
    "C:/Test/FileName2.pdf"
    ];

    // === Build MIME message ===
    $boundary = "----=_PHPMime_" . time();
    $mime = "";

    // Headers
    $mime .= "From: $from\r\n";
    $mime .= "To: $to\r\n";
    $mime .= "Cc: $cc\r\n";
    $mime .= "Bcc: $bcc\r\n";
    $mime .= "Subject: $subject\r\n";
    $mime .= "SendAfterDateTime: $sendAfter\r\n";
    $mime .= "Tracking: $tracking\r\n";
    $mime .= "SuppressOurHeaders: $suppressHeaders\r\n";
    $mime .= "X-Report-Abuse: $xReportAbuse\r\n";
    $mime .= "List-Unsubscribe: $listUnsubscribe\r\n";
    $mime .= "MIME-Version: 1.0\r\n";
    $mime .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\r\n";

    // Text part
    $mime .= "--$boundary\r\n";
    $mime .= "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
    $mime .= "$textBody\r\n\r\n";

    // HTML part
    $mime .= "--$boundary\r\n";
    $mime .= "Content-Type: text/html; charset=UTF-8\r\n\r\n";
    $mime .= "$htmlBody\r\n\r\n";

    // Attachments
    foreach ($attachments as $file) {
    if (!file_exists($file)) continue;

    $mimeType = mime_content_type($file) ?: "application/octet-stream";
    $content = chunk_split(base64_encode(file_get_contents($file)));
    $filename = basename($file);

    $mime .= "--$boundary\r\n";
    $mime .= "Content-Type: $mimeType\r\n";
    $mime .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
    $mime .= "Content-Transfer-Encoding: base64\r\n\r\n";
    $mime .= "$content\r\n\r\n";
    }

    // Close boundary
    $mime .= "--$boundary--\r\n";

    // === Send via cURL ===
    $ch = curl_init($apiUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Authorization: Basic $authValue",
    "Content-Type: message/rfc822"
    ]);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $mime);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);

    if (curl_errno($ch)) {
    echo "cURL Error: " . curl_error($ch);
    } else {
    echo "Status: " . curl_getinfo($ch, CURLINFO_HTTP_CODE) . "\n";
    echo "Response:\n$response";
    }

    curl_close($ch);

      
Go (net/http)

    package main

    import (
    "bytes"
    "encoding/base64"
    "fmt"
    "io/ioutil"
    "mime"
    "net/http"
    "os"
    "path/filepath"
    "time"
    )

    func main() {
    apiURL := "https://api.postrabbit.com/v1/messages.mime"
    apiKey := "YOURAPIKEY"

    // Base64 encode API key for Basic Auth
    authValue := base64.StdEncoding.EncodeToString([]byte(apiKey))

    // Email fields
    from := "email@yourdomain.com"
    to := "test@testdomain.com"
    cc := "cc@email.com"
    bcc := "bcc@email.com"
    subject := "This is a Mime Test"
    textBody := "text view mime"
    htmlBody := "<p>This is a PR mime test</p>"
    sendAfter := time.Now().Add(24 * time.Hour).UTC().Format("Mon, 02 Jan 2006 15:04:05 +0000")
    tracking := "true"
    suppressHeaders := "true"
    xReportAbuse := "Please report abuse for this email to: email@email.com"
    listUnsubscribe := "<p>https://www.website.com/emailoptout.aspx?Email=test@test.com</p>, <p>mailto:bounce@email.com?subject=unsubscribe test@test.com</p>"

    attachments := []string{
    "C:/Test/FileName1.jpg",
    "C:/Test/FileName2.pdf",
    }

    // === Build MIME message ===
    boundary := fmt.Sprintf("----=_GoMime_%d", time.Now().Unix())
    var mimeBuf bytes.Buffer

    // Headers
    mimeBuf.WriteString(fmt.Sprintf("From: %s\r\n", from))
    mimeBuf.WriteString(fmt.Sprintf("To: %s\r\n", to))
    mimeBuf.WriteString(fmt.Sprintf("Cc: %s\r\n", cc))
    mimeBuf.WriteString(fmt.Sprintf("Bcc: %s\r\n", bcc))
    mimeBuf.WriteString(fmt.Sprintf("Subject: %s\r\n", subject))
    mimeBuf.WriteString(fmt.Sprintf("SendAfterDateTime: %s\r\n", sendAfter))
    mimeBuf.WriteString(fmt.Sprintf("Tracking: %s\r\n", tracking))
    mimeBuf.WriteString(fmt.Sprintf("SuppressOurHeaders: %s\r\n", suppressHeaders))
    mimeBuf.WriteString(fmt.Sprintf("X-Report-Abuse: %s\r\n", xReportAbuse))
    mimeBuf.WriteString(fmt.Sprintf("List-Unsubscribe: %s\r\n", listUnsubscribe))
    mimeBuf.WriteString("MIME-Version: 1.0\r\n")
    mimeBuf.WriteString(fmt.Sprintf("Content-Type: multipart/mixed; boundary=\"%s\"\r\n\r\n", boundary))

    // Text part
    mimeBuf.WriteString(fmt.Sprintf("--%s\r\n", boundary))
    mimeBuf.WriteString("Content-Type: text/plain; charset=\"UTF-8\"\r\n\r\n")
    mimeBuf.WriteString(fmt.Sprintf("%s\r\n\r\n", textBody))

    // HTML part
    mimeBuf.WriteString(fmt.Sprintf("--%s\r\n", boundary))
    mimeBuf.WriteString("Content-Type: text/html; charset=\"UTF-8\"\r\n\r\n")
    mimeBuf.WriteString(fmt.Sprintf("%s\r\n\r\n", htmlBody))

    // Attachments
    for _, filePath := range attachments {
    if _, err := os.Stat(filePath); os.IsNotExist(err) {
    continue
    }

    data, err := ioutil.ReadFile(filePath)
    if err != nil {
    fmt.Printf("Failed to read file %s: %v\n", filePath, err)
    continue
    }

    filename := filepath.Base(filePath)
    mimeType := mime.TypeByExtension(filepath.Ext(filePath))
    if mimeType == "" {
    mimeType = "application/octet-stream"
    }

    mimeBuf.WriteString(fmt.Sprintf("--%s\r\n", boundary))
    mimeBuf.WriteString(fmt.Sprintf("Content-Type: %s\r\n", mimeType))
    mimeBuf.WriteString(fmt.Sprintf("Content-Disposition: attachment; filename=\"%s\"\r\n", filename))
    mimeBuf.WriteString("Content-Transfer-Encoding: base64\r\n\r\n")

    encoded := base64.StdEncoding.EncodeToString(data)
    // Split base64 lines to 76 chars per RFC
    for i := 0; i < len(encoded); i += 76 {
    end := i + 76
    if end > len(encoded) {
    end = len(encoded)
    }
    mimeBuf.WriteString(encoded[i:end] + "\r\n")
    }
    mimeBuf.WriteString("\r\n")
    }

    // Close boundary
    mimeBuf.WriteString(fmt.Sprintf("--%s--\r\n", boundary))

    // === Send via HTTP POST ===
    req, err := http.NewRequest("POST", apiURL, &mimeBuf)
    if err != nil {
    panic(err)
    }
    req.Header.Add("Authorization", "Basic "+authValue)
    req.Header.Add("Content-Type", "message/rfc822")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
    panic(err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Printf("Status: %d\n", resp.StatusCode)
    fmt.Printf("Response:\n%s\n", body)
    }
 

3. Retrieve Email

GET /v1/getmessage/{id}

Retrieve full email details by Message ID.

Response

{
      "EmailID": "abcd1234",
      "FromAddress": "...",
      "ToAddress": "...",
      "Subject": "...",
      "CcAddress": "...",
      "BccAddress": "...",
      "Status": "Delivered",
      "DateSent": "Tue, 20 Feb 2025 09:12:00 +0000",
      "TextView": "...",
      "HtmlView": "..."
}

Code Examples

cURL

    MESSAGE_ID="YOURMESSAGEID"
    API_KEY="YOURAPIKEY"

    AUTH_VALUE=$(printf "%s" "$API_KEY" | base64)

    curl -i \
    -H "Authorization: Basic $AUTH_VALUE" \
    -H "Accept: application/json" \
    "https://api.postrabbit.com/v1/getmessage/$MESSAGE_ID"
 
JavaScript (Browser fetch)

    const messageID = "YOURMESSAGEID";
    const apiKey = "YOURAPIKEY";

    const apiUrl = `https://api.postrabbit.com/v1/getmessage/${messageID}`;

    // Base64 encode API key
    const authValue = btoa(apiKey); // browser-safe Base64

    fetch(apiUrl, {
    method: "GET",
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Accept": "application/json"
    }
    })
    .then(response => {
    console.log("Status Code:", response.status);
    return response.text();
    })
    .then(body => {
    console.log("Response:");
    console.log(body);
    })
    .catch(err => {
    console.error("Error:", err);
    });

Node.js (axios)

    const axios = require("axios");

    const messageID = "YOURMESSAGEID";
    const apiKey = "YOURAPIKEY";

    const apiUrl = `https://api.postrabbit.com/v1/getmessage/${messageID}`;

    // Base64 encode API key (same as Convert.ToBase64String)
    const authValue = Buffer.from(apiKey, "ascii").toString("base64");

    axios.get(apiUrl, {
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Accept": "application/json"
    }
    })
    .then(response => {
    console.log("Status Code:", response.status);
    console.log("Response:");
    console.log(response.data);
    })
    .catch(error => {
    if (error.response) {
    // Server returned a non-2xx status
    console.log("Status Code:", error.response.status);
    console.log("Response:");
    console.log(error.response.data);
    } else {
    // Network or other error
    console.error("Error:", error.message);
    }
    });
Python (requests)

import base64
import requests

message_id = "YOURMESSAGEID"
api_key = "YOURAPIKEY"

api_url = f"https://api.postrabbit.com/v1/getmessage/{message_id}"

# Base64 encode API key (same as Convert.ToBase64String)
auth_value = base64.b64encode(api_key.encode("ascii")).decode("ascii")

headers = {
    "Authorization": f"Basic {auth_value}",
    "Accept": "application/json"
}

response = requests.get(api_url, headers=headers)

print("Status Code:", response.status_code)
print("Response:")
print(response.text)  
Java (OkHttp)


    String messageID = "YOURMESSAGEID";
    String apiKey = "YOURAPIKEY";

    String apiUrl = "https://api.postrabbit.com/v1/getmessage/" + messageID;

    // Base64 encode API key (same as Convert.ToBase64String)
    String authValue = Base64.getEncoder()
    .encodeToString(apiKey.getBytes(java.nio.charset.StandardCharsets.US_ASCII));

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
    .url(apiUrl)
    .addHeader("Authorization", "Basic " + authValue)
    .addHeader("Accept", "application/json")
    .get()
    .build();

    try (Response response = client.newCall(request).execute()) {

    String responseBody = response.body() != null
    ? response.body().string()
    : "";

    System.out.println("Status Code: " + response.code());
    System.out.println("Response:");
    System.out.println(responseBody);
    }
    catch (Exception ex) {
    ex.printStackTrace();
    }
C# (.NET HttpClient)

    string messageID = "YOURMESSAGEID";

    var apiUrl = "https://api.postrabbit.com/v1/getmessage/" + messageID;
    string apiKey = "YOURAPIKEY";

    string authValue = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(apiKey));

    using (var client = new HttpClient())
    {

    client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", authValue);

    HttpResponseMessage response =
    client.GetAsync(apiUrl)
    .GetAwaiter()
    .GetResult();

    string responseBody =
    response.Content.ReadAsStringAsync()
    .GetAwaiter()
    .GetResult();

    Console.WriteLine("Status Code: " + response.StatusCode);
    Console.WriteLine("Response:");
    Console.WriteLine(responseBody);
    }
Go (net/http)


package main

import (
	"encoding/base64"
	"fmt"
	"io"
	"net/http"
)

func main() {
	messageID := "YOURMESSAGEID"
	apiKey := "YOURAPIKEY"

	apiURL := "https://api.postrabbit.com/v1/getmessage/" + messageID

	// Base64 encode API key (same as Convert.ToBase64String)
	authValue := base64.StdEncoding.EncodeToString([]byte(apiKey))

	// Create HTTP request
	req, err := http.NewRequest("GET", apiURL, nil)
	if err != nil {
		panic(err)
	}

	// Add Authorization header
	req.Header.Add("Authorization", "Basic "+authValue)
	req.Header.Add("Accept", "application/json")

	// Create client and send request
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// Read response body
	body, err := io.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}

	// Output results
	fmt.Println("Status Code:", resp.Status)
	fmt.Println("Response:")
	fmt.Println(string(body))
}
}  

4. Get Email Status

GET /v1/getstatus/{id}

Returns only the email status.

Response

{
    "EmailID": "abcd1234",
    "Status": "Queued"
}

Code Examples

cURL

    MESSAGE_ID="YOURMESSAGEID"
    API_KEY="YOURAPIKEY"

    # Base64 encode the API key
    AUTH_VALUE=$(printf "%s" "$API_KEY" | base64)

    curl -i \
    -H "Authorization: Basic $AUTH_VALUE" \
    -H "Accept: application/json" \
    "https://api.postrabbit.com/v1/getstatus/$MESSAGE_ID"
 
JavaScript (Browser fetch)

    const messageID = "YOURMESSAGEID";
    const apiKey = "YOURAPIKEY";

    const apiUrl = `https://api.postrabbit.com/v1/getstatus/${messageID}`;

    // Base64 encode API key
    const authValue = btoa(apiKey); // browser-safe Base64

    fetch(apiUrl, {
    method: "GET",
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Accept": "application/json"
    }
    })
    .then(response => {
    console.log("Status Code:", response.status);
    return response.text();
    })
    .then(body => {
    console.log("Response:");
    console.log(body);
    })
    .catch(err => {
    console.error("Error:", err);
    });

Node.js (axios)

    const axios = require("axios");

    const messageID = "YOURMESSAGEID";
    const apiKey = "YOURAPIKEY";

    const apiUrl = `https://api.postrabbit.com/v1/getstatus/${messageID}`;

    // Base64 encode API key (same as Convert.ToBase64String)
    const authValue = Buffer.from(apiKey, "ascii").toString("base64");

    axios.get(apiUrl, {
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Accept": "application/json"
    }
    })
    .then(response => {
    console.log("Status Code:", response.status);
    console.log("Response:");
    console.log(response.data);
    })
    .catch(error => {
    if (error.response) {
    // Server returned a non-2xx status
    console.log("Status Code:", error.response.status);
    console.log("Response:");
    console.log(error.response.data);
    } else {
    console.error("Error:", error.message);
    }
    });
Python (requests)

    message_id = "YOURMESSAGEID"
    api_key = "YOURAPIKEY"

    api_url = f"https://api.postrabbit.com/v1/getstatus/{message_id}"

    # Base64 encode API key (same as Convert.ToBase64String)
    auth_value = base64.b64encode(api_key.encode("ascii")).decode("ascii")

    headers = {
    "Authorization": f"Basic {auth_value}",
    "Accept": "application/json"
    }

    response = requests.get(api_url, headers=headers)

    print("Status Code:", response.status_code)
    print("Response:")
    print(response.text)

    # Example Failure Response:
    # {"message":"Invalid Message Id.","errorCode":"InvalidMessageId"}

    # Example Success Response:
    # {"emailID":"YOURMESSAGEID","status":"Delivered"}
Java (OkHttp)

    String messageID = "YOURMESSAGEID";
    String apiKey = "YOURAPIKEY";

    String apiUrl = "https://api.postrabbit.com/v1/getstatus/" + messageID;

    // Base64 encode API key (same as Convert.ToBase64String)
    String authValue = Base64.getEncoder()
    .encodeToString(apiKey.getBytes(StandardCharsets.US_ASCII));

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
    .url(apiUrl)
    .addHeader("Authorization", "Basic " + authValue)
    .addHeader("Accept", "application/json")
    .get()
    .build();

    try (Response response = client.newCall(request).execute()) {

    String responseBody = response.body() != null
    ? response.body().string()
    : "";

    System.out.println("Status Code: " + response.code());
    System.out.println("Response:");
    System.out.println(responseBody);

    // Example Failure Response:
    // {"message":"Invalid Message Id.","errorCode":"InvalidMessageId"}

    // Example Success Response:
    // {"emailID":"YOURMESSAGEID","status":"Delivered"}
    }
    catch (Exception ex) {
    ex.printStackTrace();
    }
C# (.NET HttpClient)

    string messageID = "YOURMESSAGEID";

    var apiUrl = "https://api.postrabbit.com/v1/getstatus/" + messageID;
    string apiKey = "YOURAPIKEY";

    string authValue = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(apiKey));

    using (var client = new HttpClient())
    {

    client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", authValue);

    HttpResponseMessage response =
    client.GetAsync(apiUrl)
    .GetAwaiter()
    .GetResult();

    string responseBody =
    response.Content.ReadAsStringAsync()
    .GetAwaiter()
    .GetResult();

    Console.WriteLine("Status Code: " + response.StatusCode);
    Console.WriteLine("Response:");
    Console.WriteLine(responseBody);

    //Example Failure Reaponse:  "{\"message\":\"Invalid Message Id.\",\"errorCode\":\"InvalidMessageId\"}"
    //Example Success Response:  "{\"emailID\":\"YOURMESSAGEID\",\"status\":\"Delivered\"}"
    }
PHP (curl)


    $messageID = "YOURMESSAGEID";
    $apiKey = "YOURAPIKEY";

    $apiUrl = "https://api.postrabbit.com/v1/getstatus/" . $messageID;

    // Base64 encode API key (same as Convert.ToBase64String)
    $authValue = base64_encode($apiKey);

    $ch = curl_init();

    curl_setopt_array($ch, [
    CURLOPT_URL => $apiUrl,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
    "Authorization: Basic $authValue",
    "Accept: application/json"
    ]
    ]);

    $responseBody = curl_exec($ch);
    $httpStatus   = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($responseBody === false) {
    $error = curl_error($ch);
    curl_close($ch);
    die("cURL Error: " . $error);
    }

    curl_close($ch);

    echo "Status Code: " . $httpStatus . PHP_EOL;
    echo "Response:" . PHP_EOL;
    echo $responseBody . PHP_EOL;

    // Example Failure Response:
    // {"message":"Invalid Message Id.","errorCode":"InvalidMessageId"}

    // Example Success Response:
    // {"emailID":"YOURMESSAGEID","status":"Delivered"}
Go (net/http)

    package main

    import (
    "encoding/base64"
    "fmt"
    "io"
    "net/http"
    )

    func main() {
    messageID := "YOURMESSAGEID"
    apiKey := "YOURAPIKEY"

    apiURL := "https://api.postrabbit.com/v1/getstatus/" + messageID

    // Base64 encode API key (same as Convert.ToBase64String)
    authValue := base64.StdEncoding.EncodeToString([]byte(apiKey))

    // Create HTTP request
    req, err := http.NewRequest("GET", apiURL, nil)
    if err != nil {
    panic(err)
    }

    // Add headers
    req.Header.Add("Authorization", "Basic "+authValue)
    req.Header.Add("Accept", "application/json")

    // Create HTTP client and send request
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
    panic(err)
    }
    defer resp.Body.Close()

    // Read response body
    body, err := io.ReadAll(resp.Body)
    if err != nil {
    panic(err)
    }

    // Output results
    fmt.Println("Status Code:", resp.StatusCode)
    fmt.Println("Response:")
    fmt.Println(string(body))

    // Example Failure Response:
    // {"message":"Invalid Message Id.","errorCode":"InvalidMessageId"}

    // Example Success Response:
    // {"emailID":"YOURMESSAGEID","status":"Delivered"}
    }

5. Cancel Unsent Email

GET /v1/cancelemail/{id}

This endpoint cancels an email only if it is in:

  • Queued
  • Pending
  • Error
  • OptedOut

Responses

{"status":"email cancelled", "EmailID":"abcd1234"}
{"status":"email already sent", "EmailID":"abcd1234"}
{"status":"email could not be cancelled", "EmailID":"abcd1234"}

Code Examples

cURL

    MESSAGE_ID="YOURMESSAGEID"
    API_KEY="YOURAPIKEY"

    # Base64 encode the API key
    AUTH_VALUE=$(printf "%s" "$API_KEY" | base64)

    curl -i \
    -H "Authorization: Basic $AUTH_VALUE" \
    -H "Accept: application/json" \
    "https://api.postrabbit.com/v1/cancelemail/$MESSAGE_ID"
 
JavaScript (Browser fetch)

    const messageID = "YOURMESSAGEID";
    const apiKey = "YOURAPIKEY";

    const apiUrl = `https://api.postrabbit.com/v1/cancelemail/${messageID}`;

    // Base64 encode API key (browser-safe)
    const authValue = btoa(apiKey);

    fetch(apiUrl, {
    method: "GET",
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Accept": "application/json"
    }
    })
    .then(response => {
    console.log("Status Code:", response.status);
    return response.text();
    })
    .then(body => {
    console.log("Response:");
    console.log(body);
    })
    .catch(err => {
    console.error("Error:", err);
    });
 
Node.js (axios)

    const axios = require("axios");

    const messageID = "YOURMESSAGEID";
    const apiKey = "YOURAPIKEY";

    const apiUrl = `https://api.postrabbit.com/v1/cancelemail/${messageID}`;

    // Base64 encode API key (like Convert.ToBase64String)
    const authValue = Buffer.from(apiKey, "ascii").toString("base64");

    axios.get(apiUrl, {
    headers: {
    "Authorization": `Basic ${authValue}`,
    "Accept": "application/json"
    }
    })
    .then(response => {
    console.log("Status Code:", response.status);
    console.log("Response:");
    console.log(response.data);
    })
    .catch(error => {
    if (error.response) {
    console.log("Status Code:", error.response.status);
    console.log("Response:");
    console.log(error.response.data);
    } else {
    console.error("Error:", error.message);
    }
    });
Python (requests)

    message_id = "YOURMESSAGEID"
    api_key = "YOURAPIKEY"

    api_url = f"https://api.postrabbit.com/v1/cancelemail/{message_id}"

    # Base64 encode API key (like Convert.ToBase64String)
    auth_value = base64.b64encode(api_key.encode("ascii")).decode("ascii")

    headers = {
    "Authorization": f"Basic {auth_value}",
    "Accept": "application/json"
    }

    response = requests.get(api_url, headers=headers)

    print("Status Code:", response.status_code)
    print("Response:")
    print(response.text)

    # Example Failure Response:
    # {"status":"email already sent","emailID":"YOURMESSAGEID"}

    # Example Success Response:
    # {"status":"email cancelled","emailID":"YOURMESSAGEID"}
Java (OkHttp)

    String messageID = "YOURMESSAGEID";
    String apiKey = "YOURAPIKEY";

    String apiUrl = "https://api.postrabbit.com/v1/cancelemail/" + messageID;

    // Base64 encode API key (same as Convert.ToBase64String)
    String authValue = Base64.getEncoder()
    .encodeToString(apiKey.getBytes(StandardCharsets.US_ASCII));

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
    .url(apiUrl)
    .addHeader("Authorization", "Basic " + authValue)
    .addHeader("Accept", "application/json")
    .get()
    .build();

    try (Response response = client.newCall(request).execute()) {

    String responseBody = response.body() != null
    ? response.body().string()
    : "";

    System.out.println("Status Code: " + response.code());
    System.out.println("Response:");
    System.out.println(responseBody);

    // Example Failure Response:
    // {"status":"email already sent","emailID":"YOURMESSAGEID"}

    // Example Success Response:
    // {"status":"email cancelled","emailID":"YOURMESSAGEID"}

    } catch (Exception ex) {
    ex.printStackTrace();
    }
C# (.NET HttpClient)

    string messageID = "YOURMESSAGEID";

    var apiUrl = "https://api.postrabbit.com/v1/cancelemail/" + messageID;
    string apiKey = "YOURAPIKEY";

    string authValue = Convert.ToBase64String(
    Encoding.ASCII.GetBytes(apiKey));

    using (var client = new HttpClient())
    {
    // Your controller expects:
    // Authorization: Basic base64(apiKey)

    client.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Basic", authValue);

    // GET request
    HttpResponseMessage response =
    client.GetAsync(apiUrl)
    .GetAwaiter()
    .GetResult();

    string responseBody =
    response.Content.ReadAsStringAsync()
    .GetAwaiter()
    .GetResult();

    Console.WriteLine("Status Code: " + response.StatusCode);
    Console.WriteLine("Response:");
    Console.WriteLine(responseBody);

    //Failure Response:  "{\"status\":\"email already sent\",\"emailID\":\"YOURMESSAGEID\"}"
    //Success Response:  "{\"status\":\"email cancelled\",\"emailID\":\"YOURMESSAGEID\"}"
    }
PHP (curl)

    $messageID = "YOURMESSAGEID";
    $apiKey = "YOURAPIKEY";

    $apiUrl = "https://api.postrabbit.com/v1/cancelemail/" . $messageID;

    // Base64 encode API key (same as Convert.ToBase64String)
    $authValue = base64_encode($apiKey);

    // Initialize cURL
    $ch = curl_init();

    curl_setopt_array($ch, [
    CURLOPT_URL => $apiUrl,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPGET => true,
    CURLOPT_HTTPHEADER => [
    "Authorization: Basic $authValue",
    "Accept: application/json"
    ]
    ]);

    $responseBody = curl_exec($ch);
    $httpStatus   = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($responseBody === false) {
    $error = curl_error($ch);
    curl_close($ch);
    die("cURL Error: " . $error);
    }

    curl_close($ch);

    echo "Status Code: " . $httpStatus . PHP_EOL;
    echo "Response:" . PHP_EOL;
    echo $responseBody . PHP_EOL;

    // Example Failure Response:
    // {"status":"email already sent","emailID":"YOURMESSAGEID"}

    // Example Success Response:
    // {"status":"email cancelled","emailID":"YOURMESSAGEID"}
 
Go (net/http)

    package main

    import (
    "encoding/base64"
    "fmt"
    "io"
    "net/http"
    )

    func main() {
    messageID := "YOURMESSAGEID"
    apiKey := "YOURAPIKEY"

    apiURL := "https://api.postrabbit.com/v1/cancelemail/" + messageID

    // Base64 encode API key (like Convert.ToBase64String)
    authValue := base64.StdEncoding.EncodeToString([]byte(apiKey))

    // Create HTTP request
    req, err := http.NewRequest("GET", apiURL, nil)
    if err != nil {
    panic(err)
    }

    // Add headers
    req.Header.Add("Authorization", "Basic "+authValue)
    req.Header.Add("Accept", "application/json")

    // Create HTTP client and send request
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
    panic(err)
    }
    defer resp.Body.Close()

    // Read response body
    body, err := io.ReadAll(resp.Body)
    if err != nil {
    panic(err)
    }

    // Print results
    fmt.Println("Status Code:", resp.StatusCode)
    fmt.Println("Response:")
    fmt.Println(string(body))

    // Example Failure Response:
    // {"status":"email already sent","emailID":"YOURMESSAGEID"}

    // Example Success Response:
    // {"status":"email cancelled","emailID":"YOURMESSAGEID"}
    }
    }