Bulk import Outlook mailboxes from CSV
Upload a CSV to import Outlook/Hotmail mailboxes using app passwords (not OAuth). Maximum 1000 per import.
Required columns: email, password
Optional columns: name (display name), totpsecret (TOTP secret for 2FA)
The import runs asynchronously: the CSV is validated, deduplicated against
existing workspace mailboxes, and an outlook_bulk_import job is queued.
A worker creates the mailboxes and tests their connections. Rows whose
email already exists in the workspace are skipped (their display name is
updated if the CSV provides one).
curl -X POST "https://api.sendkit.ai/v1/mailboxes/import/outlook" \
-H "X-Api-Key: YOUR_API_KEY" \
--form file=example_string \
--form tag=example_string \
--form provider=outlook
import requests
import json
url = "https://api.sendkit.ai/v1/mailboxes/import/outlook"
headers = {
"X-Api-Key": "YOUR_API_KEY"
}
data = {
"file": "example_string",
"tag": "example_string",
"provider": "outlook"
}
response = requests.post(url, headers=headers, data=data)
print(response.json())
const formData = new FormData();
formData.append("file", "example_string");
formData.append("tag", "example_string");
formData.append("provider", "outlook");
const response = await fetch("https://api.sendkit.ai/v1/mailboxes/import/outlook", {
method: "POST",
headers: {
"X-Api-Key": "YOUR_API_KEY"
},
body: formData
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"mime/multipart"
)
func main() {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
writer.WriteField("file", "example_string")
writer.WriteField("tag", "example_string")
writer.WriteField("provider", "outlook")
writer.Close()
req, err := http.NewRequest("POST", "https://api.sendkit.ai/v1/mailboxes/import/outlook", body)
if err != nil {
panic(err)
}
req.Header.Set("X-Api-Key", "YOUR_API_KEY")
req.Header.Set("Content-Type", writer.FormDataContentType())
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.sendkit.ai/v1/mailboxes/import/outlook')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['X-Api-Key'] = 'YOUR_API_KEY'
request.set_form([
["file", "example_string"],
["tag", "example_string"],
["provider", "outlook"]
], 'multipart/form-data')
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"jobId": "bulk_outlook_bulk_import_1718000000000_a1b2c3d",
"accountCount": 20,
"skipped": 2,
"updated": 1
},
"message": "Outlook bulk import started for 20 accounts"
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "CSV file is required"
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "CSV must have email and password columns"
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Maximum 1000 mailboxes per import"
}
}
{
"success": false,
"error": {
"code": "LIMIT_REACHED",
"message": "Mailbox limit reached"
}
}
{
"success": false,
"error": {
"code": "CONFLICT",
"message": "All accounts in the CSV already exist in this workspace",
"skipped": 5,
"updated": 2
}
}
/v1/mailboxes/import/outlook
Target server for requests. Edit to use your own host.
Platform API key (sk_user_...) or Workspace API key (sk_...)
The media type of the request body
CSV file with email and password columns
Tag to apply to all imported mailboxes
Account type for the import job
Request Preview
Response
Response will appear here after sending the request
Authentication
API Key for authentication. Platform API key (sk_user_...) or Workspace API key (sk_...)
Body
CSV file with email and password columns
Tag to apply to all imported mailboxes