Coldrig · Schema

LaunchCampaignInput

Cold EmailOutreachAI AgentsEmail Infrastructure

Properties

Name Type Description
name string
offer string
leads array
sequence array
timezone string
sendWindow object Evaluated in `timezone`. Any field you omit gets the recommended default below — except on a test-mode account, where omitted fields are open every hour of every day until it upgrades and they take th
stopOnReply boolean
endBy string Optional fixed end date — an ISO 8601 instant with a zone. From then on nothing more in this campaign sends: every step still waiting is skipped and recorded as a `failed` event with reason `campaign_
listSource string Where the lead list came from, in a sentence. REQUIRED on a crowdfunding account (a missing or "unknown" source is refused 400); optional elsewhere.
previewOnly boolean Optional. true = a dry run — every launch check runs and the rendered steps for the first three leads come back with the counts a launch would report; nothing is created or sent.
repeatOf string Optional. Send it only to repeat a campaign on purpose: the existingCampaignId that a 409 duplicate_campaign refusal named. Accepted once, and only while it names the most recent campaign of this acco
includeAlreadyEmailed boolean Optional. true also stores and emails the contacts who already got this campaign's first email from another campaign of this account; without it they are skipped and counted in alreadyEmailed.
View JSON Schema on GitHub

JSON Schema

coldrig-dev-launch-campaign-input-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/coldrig-dev/json-schema/coldrig-dev-launch-campaign-input-schema.json",
  "title": "LaunchCampaignInput",
  "x-generated": "2026-11-04",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/coldrig-dev-openapi.yml#/components/schemas/LaunchCampaignInput",
  "type": "object",
  "required": [
    "name",
    "offer",
    "leads",
    "sequence"
  ],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200
    },
    "offer": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "leads": {
      "type": "array",
      "minItems": 1,
      "maxItems": 5000,
      "items": {
        "$ref": "#/$defs/LeadInput"
      }
    },
    "sequence": {
      "type": "array",
      "minItems": 1,
      "maxItems": 10,
      "items": {
        "$ref": "#/$defs/SequenceStepInput"
      }
    },
    "timezone": {
      "type": "string",
      "default": "UTC"
    },
    "sendWindow": {
      "type": "object",
      "description": "Evaluated in `timezone`. Any field you omit gets the recommended default below — except on a test-mode account, where omitted fields are open every hour of every day until it upgrades and they take the recommended default. The decision is yours; include 0 and 6 in `days` to send on weekends. Setting exactly one of startHour/endHour combines it with the recommended default for the other (08/16, including on a test-mode account, since that value re-resolves to the same default on upgrade) — if that combination would wrap the window past midnight (start > end), the launch is refused; set both explicitly, including for a deliberate overnight window such as {startHour:22, endHour:6}.\n",
      "properties": {
        "startHour": {
          "type": "integer",
          "minimum": 0,
          "maximum": 23
        },
        "endHour": {
          "type": "integer",
          "minimum": 0,
          "maximum": 23,
          "description": "Inclusive — the last hour a send may start in."
        },
        "days": {
          "type": "array",
          "items": {
            "type": "integer",
            "minimum": 0,
            "maximum": 6
          },
          "minItems": 1,
          "maxItems": 7,
          "description": "0 = Sunday … 6 = Saturday."
        }
      },
      "default": {
        "startHour": 8,
        "endHour": 16,
        "days": [
          1,
          2,
          3,
          4,
          5
        ]
      }
    },
    "stopOnReply": {
      "type": "boolean",
      "default": true
    },
    "endBy": {
      "type": "string",
      "format": "date-time",
      "description": "Optional fixed end date — an ISO 8601 instant with a zone. From then on nothing more in this campaign sends: every step still waiting is skipped and recorded as a `failed` event with reason `campaign_ended`. Paid accounts only: a trial account that sends one is refused 400. Must be later than now and later than every step's notBefore, or the launch is refused 400.\n"
    },
    "listSource": {
      "type": "string",
      "maxLength": 500,
      "description": "Where the lead list came from, in a sentence. REQUIRED on a crowdfunding account (a missing or \"unknown\" source is refused 400); optional elsewhere."
    },
    "previewOnly": {
      "type": "boolean",
      "description": "Optional. true = a dry run — every launch check runs and the rendered steps for the first three leads come back with the counts a launch would report; nothing is created or sent."
    },
    "repeatOf": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Optional. Send it only to repeat a campaign on purpose: the existingCampaignId that a 409 duplicate_campaign refusal named. Accepted once, and only while it names the most recent campaign of this account with the same contacts and the same subjects and bodies as written; any other value is refused and nothing is created."
    },
    "includeAlreadyEmailed": {
      "type": "boolean",
      "description": "Optional. true also stores and emails the contacts who already got this campaign's first email from another campaign of this account; without it they are skipped and counted in alreadyEmailed."
    }
  },
  "$defs": {
    "LeadAttributes": {
      "type": "object",
      "additionalProperties": false,
      "description": "Optional audience details for this contact. Recorded for your account only, so results can be broken down by audience; never shared. A missing field reads \"unknown\".\n",
      "properties": {
        "role": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "description": "One line, e.g. \"Head of RevOps\"."
        },
        "seniority": {
          "type": "string",
          "enum": [
            "c_level",
            "vp",
            "director",
            "manager",
            "individual",
            "founder",
            "other"
          ]
        },
        "industry": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120
        },
        "companySize": {
          "type": "string",
          "enum": [
            "1-10",
            "11-50",
            "51-200",
            "201-1000",
            "1001-5000",
            "5001+"
          ]
        },
        "trigger": {
          "type": "string",
          "minLength": 1,
          "maxLength": 120,
          "description": "Why now, e.g. \"raised a Series A\"."
        },
        "timezone": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100,
          "description": "IANA time zone, e.g. \"America/Chicago\"; refused 400 otherwise. The local send hour is recorded in it (the campaign's zone otherwise)."
        }
      }
    },
    "LeadInput": {
      "type": "object",
      "required": [
        "email"
      ],
      "properties": {
        "email": {
          "type": "string",
          "format": "email",
          "description": "Trimmed and lower-cased before it is checked or stored."
        },
        "firstName": {
          "type": "string",
          "maxLength": 200,
          "default": "",
          "description": "Optional. A launch whose subject or body uses {{firstName}} is refused 400, naming how many contacts have none; no fallback word is invented. One line of plain text: a line break, tab or control character is refused (400) naming this field. Right-to-left text and its direction marks are accepted."
        },
        "company": {
          "type": "string",
          "maxLength": 200,
          "default": "",
          "description": "One line of plain text: a line break, tab or control character is refused (400) naming this field. Right-to-left text and its direction marks are accepted."
        },
        "vars": {
          "type": "object",
          "maxProperties": 50,
          "additionalProperties": {
            "type": "string",
            "maxLength": 2000
          },
          "description": "Optional per-lead values for your own {{key}} tokens: word-keys (letters, digits, underscore; up to 64 characters) to one-line plain-text strings (no line breaks, tabs or control characters). Right-to-left text and its direction marks are accepted. A {{key}} used in any subject or body must be present and non-empty on EVERY lead, or the launch is refused 400 naming the token and how many leads lack it. A key may not be firstName or company. A value is inserted once as plain text; a value that itself contains {{...}} reaches the recipient as that literal text.\n"
        },
        "attributes": {
          "$ref": "#/$defs/LeadAttributes"
        }
      }
    },
    "SequenceStepInput": {
      "type": "object",
      "required": [
        "step",
        "body",
        "delayDays"
      ],
      "properties": {
        "step": {
          "type": "integer",
          "minimum": 1
        },
        "subject": {
          "type": "string",
          "minLength": 1,
          "maxLength": 300,
          "description": "Required on step 1, and the first email's subject may not start with \"Re:\" (400). A later step (step > 1) may omit it to keep step 1's subject line (recommended) — it resolves at launch to \"Re: \" + step 1's subject (unchanged if that already starts with \"Re: \"). Set one explicitly on a later step to change only its subject line: every later step is still sent In-Reply-To step 1, though some mail clients display a changed subject as a separate conversation. One line of plain text: a line break, tab or control character is refused (400) naming this field. Right-to-left text and its direction marks are accepted.\n"
        },
        "body": {
          "type": "string",
          "minLength": 1,
          "maxLength": 20000
        },
        "delayDays": {
          "type": "integer",
          "minimum": 0,
          "maximum": 60
        },
        "notBefore": {
          "type": "string",
          "format": "date-time",
          "description": "Optional fixed date this step is held until — an ISO 8601 instant with a zone (e.g. \"2026-11-03T09:00:00-05:00\" or \"...Z\"). The step goes out at the later of notBefore and delayDays after the previous step actually sent, still inside sendWindow. Paid accounts only: a trial account that sends one is refused 400 (use delayDays).\n"
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/coldrig-dev-launch-campaign-input"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.