---
title: "Bulk create blocked spam sources"
method: POST
path: "/v3/blocked_spam_sources/bulk"
tags: ["Blocked Spam Sources"]
---

# Bulk create blocked spam sources

`POST /v3/blocked_spam_sources/bulk`

Adds multiple blocked spam sources in a single request, typically used to sync the blocklist from an external security tool. Each item in `data` is validated and persisted independently — per-item failures are reported in the response without aborting the rest of the batch.

## Request body

- object
  - `callback_url` string — Optional HTTPS URL Greenhouse will POST to when every row in `data` has finished. Omit to poll `GET /v3/bulk_requests/{bulk_action_uuid}` instead.
  - `data` object[], required — Array of single-resource create payloads to process. Each item must match the schema of the matching non-bulk POST endpoint; rows are validated and executed independently in their own Sidekiq jobs.
    - `source_type` 'ip_address' | 'cidr_block' | 'email_address' | 'email_domain', required — Kind of identifier `value` represents. `ip_address` accepts a single IPv4 or IPv6 address; `cidr_block` accepts an IPv4 or IPv6 CIDR range (very large subnets — IPv4 prefix `<= 8` or IPv6 prefix `<= 32` — are rejected); `email_address` accepts a full address; `email_domain` accepts a domain (the part after `@`). Picking the wrong kind for the supplied `value` returns 422.
    - `value` string, required — The IP, CIDR range, email address, or domain to block, matching the chosen `source_type`. The value is normalized (stripped and lowercased) before being stored, and must be unique per `source_type` within the organization. Common consumer email domains (`gmail.com`, `outlook.com`, `hotmail.com`, `hotmail.co.uk`, `icloud.com`, `yahoo.com`, `live.com`, `aol.com`, `protonmail.com`) cannot be blocked and return 422.
    - `note` string — Optional free-text annotation, typically used to record why the source was added (e.g. ticket id, internal incident reference). Limited to 255 characters.

## Response `202`

Accepted

- object
  - `bulk_action_uuid` string — UUID assigned to the new bulk request. Use this with `GET /v3/bulk_requests/{bulk_action_uuid}` to monitor progress and retrieve per-row results.
  - `status` string — Initial lifecycle state of the new bulk request, typically `building` immediately after creation. See the bulk request response schema for the full set of values.
  - `status_url` string — Relative path that returns the current status of the bulk request. Append this to your Harvest base URL to fetch the latest state.

## Other responses

- `401` — Unauthorized
- `413` — Payload is larger than 10MB
- `422` — Validation Error
- `429` — Client has more than 5 active jobs

---

[API](https://skmtc.net/greenhouse/apis/auth-api.md) · [All operations](https://skmtc.net/greenhouse/apis/auth-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/greenhouse/auth-api/versions/9517a2e54640/schema)
