Reference
Setter
Setter: 9 operations (setter.variants.list, setter.variants.create, setter.variants.get, setter.variants.update, setter.variants.archive, setter.variants.promote, setter.variants.publish, setter.variants.start_test, setter.variants.versions.list).
| Method | Path | Operation |
|---|---|---|
GET | /v1/reps/{rep_id}/setter/variants | setter.variants.list |
POST | /v1/reps/{rep_id}/setter/variants | setter.variants.create |
GET | /v1/setter/variants/{variant_id} | setter.variants.get |
PATCH | /v1/setter/variants/{variant_id} | setter.variants.update |
POST | /v1/setter/variants/{variant_id}/archive | setter.variants.archive |
POST | /v1/setter/variants/{variant_id}/promote | setter.variants.promote |
POST | /v1/setter/variants/{variant_id}/publish | setter.variants.publish |
POST | /v1/setter/variants/{variant_id}/start-test | setter.variants.start_test |
GET | /v1/setter/variants/{variant_id}/versions | setter.variants.versions.list |
setter.variants.list
GET/v1/reps/{rep_id}/setter/variants
List a rep's AI Setter variants, newest first.
Archived variants are left out, as in the app's editor; read one by id to see it.
| Operation id | setter.variants.list |
| Scopes | setter:read |
| Rate class | `read` |
| Idempotency | Not applicable |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
rep_id | string | yes | A rep (connected Instagram account) id. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
data | object[] | yes |
Errors
| Status | Code | When |
|---|---|---|
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `REP_NOT_FOUND_404` | The rep does not exist in this workspace, is archived, or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl "https://api.dmhero.ai/v1/reps/string/setter/variants" \
-H "Authorization: Bearer $DMHERO_API_KEY"JSON Schema
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}
}
},
"required": [
"data"
],
"additionalProperties": false
}setter.variants.create
POST/v1/reps/{rep_id}/setter/variants
Create a draft AI Setter variant for a rep.
The variant starts as a draft; publish it, or start an A/B test with it, to serve conversations. Fields left out take the editor's defaults.
| Operation id | setter.variants.create |
| Scopes | setter:write |
| Rate class | `write` |
| Idempotency | `Idempotency-Key` accepted |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
rep_id | string | yes | A rep (connected Instagram account) id. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | Shown in the variant list. 1 to 80 characters. |
avoid_text | string | no | |
booking_config | object | no | The Google Calendar booking rules, read only while goal_tool is google_calendar. Sent whole: a field left out takes its default. |
disqualify_text | string | no | |
few_shot | object[] | no | At most 3; a fully blank row is dropped. |
goal_link | string | null | no | The CTA link; null or empty clears it. At most 2000 characters. |
goal_link_status | "none" | "connected" | no | |
goal_text | string | no | Script: the goal. Every text field takes up to 4000 characters. |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | no | How the CTA is fulfilled. |
handoff_on_uncertain | boolean | no | Also hand off when the model is unsure. |
handoff_text | string | no | When to hand a live thread to a human. |
icp_text | string | no | |
key_elements_text | string | no | |
language_text | string | no | |
message_style | "single" | "multi" | no | One message, or several short bubbles. |
objection_mode | "stop" | "rebut" | no | On a soft objection: stop, or rebut and persuade. |
objections | object[] | no | At most 6; a fully blank row is dropped. |
offer_text | string | no | |
phrases_text | string | no | |
qualifying_text | string | no | |
reaction_emojis | string[] | no | At most 4, from the allowed reaction emoji. |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | no | |
reaction_rules | object[] | no | At most 6. |
rep_name | string | no | |
rep_role | string | no | |
style_text | string | no | |
tone_text | string | no | |
traffic_weight | integer | no | A/B share, 0 to 100. start_test is the usual way to set it. On a testing variant it must be at least 1 and keep the rep's testing weights within 100, else 400 traffic_weight_invalid or traffic_weight_sum_exceeded; on any other status it is stored and serves nothing until start_test sets it again.. -9007199254740991 to 9007199254740991 |
Response 201
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 400 | `VALIDATION_FAILED_400` | A field is missing or outside the editor's limits. fields maps each field path (booking_config.<field> for the booking rules) to the reason, e.g. text_too_long, out_of_range, traffic_weight_sum_exceeded. |
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 403 | `GOOGLE_CALENDAR_NOT_ENABLED_403` | Booking in Google Calendar is not enabled for this organization, and the call would move the variant onto goal_tool google_calendar or change the booking rules of a variant on it. |
| 404 | `REP_NOT_FOUND_404` | The rep does not exist in this workspace, is archived, or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl -X POST "https://api.dmhero.ai/v1/reps/string/setter/variants" \
-H "Authorization: Bearer $DMHERO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"name": "string"
}'JSON Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Shown in the variant list. 1 to 80 characters."
},
"goal_text": {
"type": "string",
"description": "Script: the goal. Every text field takes up to 4000 characters."
},
"goal_link": {
"description": "The CTA link; null or empty clears it. At most 2000 characters.",
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
],
"description": "How the CTA is fulfilled."
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
},
"description": "At most 4, from the allowed reaction emoji."
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
]
},
"description": "At most 6."
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
],
"description": "One message, or several short bubbles."
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
],
"description": "On a soft objection: stop, or rebut and persuade."
},
"handoff_text": {
"type": "string",
"description": "When to hand a live thread to a human."
},
"handoff_on_uncertain": {
"type": "boolean",
"description": "Also hand off when the model is unsure."
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
]
},
"description": "At most 3; a fully blank row is dropped."
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
]
},
"description": "At most 6; a fully blank row is dropped."
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"description": "Meeting length in minutes, 10 to 240. Default 45.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"description": "Minutes kept free around a meeting, 0 to 120. Default 0.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"description": "Up to 4 non-overlapping intervals per day; at least one day must have hours. Default Monday to Friday 09:00 to 17:00.",
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"additionalProperties": false
},
"min_notice_min": {
"description": "Minimum notice in minutes, 0 to 10080. Default 180.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"description": "Default true.",
"type": "boolean"
},
"horizon_days": {
"description": "Days ahead offered first, 1 to 60. Default 14.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"description": "Read-only. Accepted only as 60, so a config read back can be sent again unchanged.",
"type": "number",
"const": 60
},
"max_per_day": {
"description": "Bookings per day, 1 to 50; null for no limit. Default null.",
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"description": "Default meet.",
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"description": "Prospect-visible event title, at most 200 characters.",
"type": "string"
},
"event_description": {
"description": "Prospect-visible event description, at most 2000 characters.",
"type": "string"
},
"prospect_tz_mode": {
"description": "campaign: the campaign's time zone; fixed: prospect_tz, which is then required.",
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"description": "An IANA time zone.",
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"description": "The calendar events land in. Default primary.",
"type": "string"
},
"busy_calendar_ids": {
"description": "Calendars checked for conflicts, at most 10 counting the target, which is always added.",
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false,
"description": "The Google Calendar booking rules, read only while goal_tool is google_calendar. Sent whole: a field left out takes its default."
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "A/B share, 0 to 100. start_test is the usual way to set it. On a testing variant it must be at least 1 and keep the rep's testing weights within 100, else 400 traffic_weight_invalid or traffic_weight_sum_exceeded; on any other status it is stored and serves nothing until start_test sets it again."
}
},
"required": [
"name"
]
}{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.get
GET/v1/setter/variants/{variant_id}
Read one AI Setter variant, any status.
| Operation id | setter.variants.get |
| Scopes | setter:read |
| Rate class | `read` |
| Idempotency | Not applicable |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl "https://api.dmhero.ai/v1/setter/variants/string" \
-H "Authorization: Bearer $DMHERO_API_KEY"JSON Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.update
PATCH/v1/setter/variants/{variant_id}
Change any field of an AI Setter variant.
Send only the fields to change. A change to a content field snapshots the previous content into the version history and bumps version; a patch whose content equals the stored content cuts no version (updated_at still moves, and the change is audited). An empty patch, or a booking_config equal to the stored one alone, writes nothing. booking_config is replaced whole. A live variant serves its new content from its next reply.
| Operation id | setter.variants.update |
| Scopes | setter:write |
| Rate class | `write` |
| Idempotency | Not applicable |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | no | |
booking_config | object | no | The Google Calendar booking rules, read only while goal_tool is google_calendar. Sent whole: a field left out takes its default. |
disqualify_text | string | no | |
few_shot | object[] | no | At most 3; a fully blank row is dropped. |
goal_link | string | null | no | The CTA link; null or empty clears it. At most 2000 characters. |
goal_link_status | "none" | "connected" | no | |
goal_text | string | no | Script: the goal. Every text field takes up to 4000 characters. |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | no | How the CTA is fulfilled. |
handoff_on_uncertain | boolean | no | Also hand off when the model is unsure. |
handoff_text | string | no | When to hand a live thread to a human. |
icp_text | string | no | |
key_elements_text | string | no | |
language_text | string | no | |
message_style | "single" | "multi" | no | One message, or several short bubbles. |
name | string | no | Shown in the variant list. 1 to 80 characters. |
objection_mode | "stop" | "rebut" | no | On a soft objection: stop, or rebut and persuade. |
objections | object[] | no | At most 6; a fully blank row is dropped. |
offer_text | string | no | |
phrases_text | string | no | |
qualifying_text | string | no | |
reaction_emojis | string[] | no | At most 4, from the allowed reaction emoji. |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | no | |
reaction_rules | object[] | no | At most 6. |
rep_name | string | no | |
rep_role | string | no | |
style_text | string | no | |
tone_text | string | no | |
traffic_weight | integer | no | A/B share, 0 to 100. start_test is the usual way to set it. On a testing variant it must be at least 1 and keep the rep's testing weights within 100, else 400 traffic_weight_invalid or traffic_weight_sum_exceeded; on any other status it is stored and serves nothing until start_test sets it again.. -9007199254740991 to 9007199254740991 |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 400 | `VALIDATION_FAILED_400` | A field is missing or outside the editor's limits. fields maps each field path (booking_config.<field> for the booking rules) to the reason, e.g. text_too_long, out_of_range, traffic_weight_sum_exceeded. |
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 403 | `GOOGLE_CALENDAR_NOT_ENABLED_403` | Booking in Google Calendar is not enabled for this organization, and the call would move the variant onto goal_tool google_calendar or change the booking rules of a variant on it. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl -X PATCH "https://api.dmhero.ai/v1/setter/variants/string" \
-H "Authorization: Bearer $DMHERO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Variant B",
"goal_text": "Book a 30 minute intro call.",
"booking_config": {
"duration_min": 30,
"working_hours": {
"mon": [
[
"09:00",
"17:00"
]
],
"wed": [
[
"09:00",
"12:00"
]
]
}
}
}'JSON Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Shown in the variant list. 1 to 80 characters."
},
"goal_text": {
"type": "string",
"description": "Script: the goal. Every text field takes up to 4000 characters."
},
"goal_link": {
"description": "The CTA link; null or empty clears it. At most 2000 characters.",
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
],
"description": "How the CTA is fulfilled."
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
},
"description": "At most 4, from the allowed reaction emoji."
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
]
},
"description": "At most 6."
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
],
"description": "One message, or several short bubbles."
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
],
"description": "On a soft objection: stop, or rebut and persuade."
},
"handoff_text": {
"type": "string",
"description": "When to hand a live thread to a human."
},
"handoff_on_uncertain": {
"type": "boolean",
"description": "Also hand off when the model is unsure."
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
]
},
"description": "At most 3; a fully blank row is dropped."
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
]
},
"description": "At most 6; a fully blank row is dropped."
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"description": "Meeting length in minutes, 10 to 240. Default 45.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"description": "Minutes kept free around a meeting, 0 to 120. Default 0.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"description": "Up to 4 non-overlapping intervals per day; at least one day must have hours. Default Monday to Friday 09:00 to 17:00.",
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"additionalProperties": false
},
"min_notice_min": {
"description": "Minimum notice in minutes, 0 to 10080. Default 180.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"description": "Default true.",
"type": "boolean"
},
"horizon_days": {
"description": "Days ahead offered first, 1 to 60. Default 14.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"description": "Read-only. Accepted only as 60, so a config read back can be sent again unchanged.",
"type": "number",
"const": 60
},
"max_per_day": {
"description": "Bookings per day, 1 to 50; null for no limit. Default null.",
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"description": "Default meet.",
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"description": "Prospect-visible event title, at most 200 characters.",
"type": "string"
},
"event_description": {
"description": "Prospect-visible event description, at most 2000 characters.",
"type": "string"
},
"prospect_tz_mode": {
"description": "campaign: the campaign's time zone; fixed: prospect_tz, which is then required.",
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"description": "An IANA time zone.",
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"description": "The calendar events land in. Default primary.",
"type": "string"
},
"busy_calendar_ids": {
"description": "Calendars checked for conflicts, at most 10 counting the target, which is always added.",
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false,
"description": "The Google Calendar booking rules, read only while goal_tool is google_calendar. Sent whole: a field left out takes its default."
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "A/B share, 0 to 100. start_test is the usual way to set it. On a testing variant it must be at least 1 and keep the rep's testing weights within 100, else 400 traffic_weight_invalid or traffic_weight_sum_exceeded; on any other status it is stored and serves nothing until start_test sets it again."
}
}
}{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.archive
POST/v1/setter/variants/{variant_id}/archive
Retire a variant, or stop its A/B test.
The live variant cannot be archived: publish another one, or switch the rep's setter off, first.
| Operation id | setter.variants.archive |
| Scopes | setter:write |
| Rate class | `write` |
| Idempotency | `Idempotency-Key` accepted |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
| 409 | `SETTER_VARIANT_LIVE_409` | The variant is live. Publish another variant, or switch the rep's setter off, before archiving it. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl -X POST "https://api.dmhero.ai/v1/setter/variants/string/archive" \
-H "Authorization: Bearer $DMHERO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"JSON Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.promote
POST/v1/setter/variants/{variant_id}/promote
End the rep's A/B test with this variant as the winner.
The variant becomes the only live one; the previous live variant and the other challengers are archived. Conversations already assigned to a loser keep it.
| Operation id | setter.variants.promote |
| Scopes | setter:write |
| Rate class | `write` |
| Idempotency | `Idempotency-Key` accepted |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl -X POST "https://api.dmhero.ai/v1/setter/variants/string/promote" \
-H "Authorization: Bearer $DMHERO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"JSON Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.publish
POST/v1/setter/variants/{variant_id}/publish
Make a variant the rep's live variant.
The rep's previous live variant is archived in the same transaction. Testing challengers keep running.
| Operation id | setter.variants.publish |
| Scopes | setter:write |
| Rate class | `write` |
| Idempotency | `Idempotency-Key` accepted |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl -X POST "https://api.dmhero.ai/v1/setter/variants/string/publish" \
-H "Authorization: Bearer $DMHERO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"JSON Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.start_test
POST/v1/setter/variants/{variant_id}/start-test
Put a variant into the rep's A/B test as a challenger.
The variant serves traffic_weight percent of new conversations and the live variant takes the rest. Calling it again on a testing variant resets its weight. The live variant cannot be a challenger, and a rep's testing weights stay within 100. Archive the variant to stop its test.
| Operation id | setter.variants.start_test |
| Scopes | setter:write |
| Rate class | `write` |
| Idempotency | `Idempotency-Key` accepted |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
traffic_weight | integer | yes | The challenger's share, 1 to 100.. -9007199254740991 to 9007199254740991 |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
avoid_text | string | yes | |
booking_config | object | yes | |
created_at | date-time | yes | |
disqualify_text | string | yes | |
few_shot | object[] | yes | |
goal_link | string | null | yes | |
goal_link_status | "none" | "connected" | yes | |
goal_text | string | yes | |
goal_tool | "manual" | "calendly" | "cal_com" | "google_calendar" | yes | |
handoff_on_uncertain | boolean | yes | |
handoff_text | string | yes | |
icp_text | string | yes | |
id | uuid | yes | |
key_elements_text | string | yes | |
language_text | string | yes | |
message_style | "single" | "multi" | yes | |
name | string | yes | |
objection_mode | "stop" | "rebut" | yes | |
objections | object[] | yes | |
offer_text | string | yes | |
phrases_text | string | yes | |
qualifying_text | string | yes | |
reaction_emojis | string[] | yes | |
reaction_frequency | "off" | "rare" | "normal" | "frequent" | yes | |
reaction_rules | object[] | yes | |
rep_id | uuid | yes | |
rep_name | string | yes | |
rep_role | string | yes | |
status | "draft" | "testing" | "live" | "archived" | yes | |
style_text | string | yes | |
tone_text | string | yes | |
traffic_weight | integer | yes | -9007199254740991 to 9007199254740991 |
updated_at | date-time | yes | |
version | integer | yes | Bumped by every change to a content field.. -9007199254740991 to 9007199254740991 |
Errors
| Status | Code | When |
|---|---|---|
| 400 | `VALIDATION_FAILED_400` | A field is missing or outside the editor's limits. fields maps each field path (booking_config.<field> for the booking rules) to the reason, e.g. text_too_long, out_of_range, traffic_weight_sum_exceeded. |
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl -X POST "https://api.dmhero.ai/v1/setter/variants/string/start-test" \
-H "Authorization: Bearer $DMHERO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"traffic_weight": 1
}'JSON Schema
{
"type": "object",
"properties": {
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "The challenger's share, 1 to 100."
}
},
"required": [
"traffic_weight"
]
}{
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"rep_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"status": {
"type": "string",
"enum": [
"draft",
"testing",
"live",
"archived"
]
},
"traffic_weight": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Bumped by every change to a content field."
},
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string",
"enum": [
"manual",
"calendly",
"cal_com",
"google_calendar"
]
},
"goal_link_status": {
"type": "string",
"enum": [
"none",
"connected"
]
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string",
"enum": [
"off",
"rare",
"normal",
"frequent"
]
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string",
"enum": [
"single",
"multi"
]
},
"objection_mode": {
"type": "string",
"enum": [
"stop",
"rebut"
]
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"rep_id",
"status",
"traffic_weight",
"version",
"name",
"goal_text",
"goal_link",
"goal_tool",
"goal_link_status",
"key_elements_text",
"avoid_text",
"offer_text",
"icp_text",
"qualifying_text",
"disqualify_text",
"tone_text",
"style_text",
"language_text",
"phrases_text",
"rep_name",
"rep_role",
"reaction_frequency",
"reaction_emojis",
"reaction_rules",
"message_style",
"objection_mode",
"handoff_text",
"handoff_on_uncertain",
"few_shot",
"objections",
"booking_config",
"created_at",
"updated_at"
],
"additionalProperties": false
}setter.variants.versions.list
GET/v1/setter/variants/{variant_id}/versions
List a variant's earlier contents, newest version first.
The current content is on the variant itself, not in this list.
| Operation id | setter.variants.versions.list |
| Scopes | setter:read |
| Rate class | `read` |
| Idempotency | Not applicable |
| Keys | Developer keys |
| Reps | A key restricted to reps sees only data of its own reps |
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
variant_id | string | yes | A setter variant id. |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | no | 1 to 200, default 50 |
cursor | string | no | 1 to 2048 characters |
Response 200
| Field | Type | Required | Description |
|---|---|---|---|
data | object[] | yes | |
has_more | boolean | yes | |
next_cursor | string | null | yes |
Errors
| Status | Code | When |
|---|---|---|
| 403 | `API_SETTER_NOT_IN_PLAN_403` | The organization's plan does not include the AI Setter. |
| 404 | `SETTER_VARIANT_NOT_FOUND_404` | The variant does not exist, or its rep is not in this workspace or is outside the key's rep restriction. |
Every operation can also answer the shared errors: authentication, scopes, rate limits and validation.
Example
curl "https://api.dmhero.ai/v1/setter/variants/string/versions" \
-H "Authorization: Bearer $DMHERO_API_KEY"JSON Schema
{
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"variant_id": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"version": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "The version the variant had before the edit."
},
"config": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"goal_text": {
"type": "string"
},
"goal_link": {
"type": [
"string",
"null"
]
},
"goal_tool": {
"type": "string"
},
"goal_link_status": {
"type": "string"
},
"key_elements_text": {
"type": "string"
},
"avoid_text": {
"type": "string"
},
"offer_text": {
"type": "string"
},
"icp_text": {
"type": "string"
},
"qualifying_text": {
"type": "string"
},
"disqualify_text": {
"type": "string"
},
"tone_text": {
"type": "string"
},
"style_text": {
"type": "string"
},
"language_text": {
"type": "string"
},
"phrases_text": {
"type": "string"
},
"rep_name": {
"type": "string"
},
"rep_role": {
"type": "string"
},
"reaction_frequency": {
"type": "string"
},
"reaction_emojis": {
"type": "array",
"items": {
"type": "string"
}
},
"reaction_rules": {
"type": "array",
"items": {
"type": "object",
"properties": {
"emoji": {
"type": "string",
"description": "One of the allowed reaction emoji."
},
"when": {
"type": "string",
"description": "The moment it fits, in the operator's words. At most 200 characters."
}
},
"required": [
"emoji",
"when"
],
"additionalProperties": false
}
},
"message_style": {
"type": "string"
},
"objection_mode": {
"type": "string"
},
"handoff_text": {
"type": "string"
},
"handoff_on_uncertain": {
"type": "boolean"
},
"few_shot": {
"type": "array",
"items": {
"type": "object",
"properties": {
"prospect": {
"type": "string",
"description": "A prospect message. At most 600 characters."
},
"reply": {
"type": "string",
"description": "The ideal reply. At most 600 characters."
}
},
"required": [
"prospect",
"reply"
],
"additionalProperties": false
}
},
"objections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"objection": {
"type": "string",
"description": "A known objection. At most 600 characters."
},
"approach": {
"type": "string",
"description": "How to handle it. At most 600 characters."
}
},
"required": [
"objection",
"approach"
],
"additionalProperties": false
}
},
"booking_config": {
"type": "object",
"properties": {
"duration_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"buffer_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"working_hours": {
"type": "object",
"properties": {
"mon": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"tue": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"wed": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"thu": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"fri": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sat": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
},
"sun": {
"type": "array",
"items": {
"type": "array",
"prefixItems": [
{
"type": "string"
},
{
"type": "string"
}
],
"items": false,
"minItems": 2,
"maxItems": 2,
"description": "[from, to] as HH:MM in the owner's (the target calendar's) time zone; to may be 24:00."
}
}
},
"required": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"additionalProperties": false
},
"min_notice_min": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"allow_same_day": {
"type": "boolean"
},
"horizon_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"hard_cap_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Never offered or booked beyond it. Fixed at 60; read-only."
},
"max_per_day": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"meeting_form": {
"type": "string",
"enum": [
"meet",
"phone"
]
},
"event_title": {
"type": "string"
},
"event_description": {
"type": "string"
},
"prospect_tz_mode": {
"type": "string",
"enum": [
"campaign",
"fixed"
]
},
"prospect_tz": {
"type": [
"string",
"null"
]
},
"target_calendar_id": {
"type": "string"
},
"busy_calendar_ids": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"duration_min",
"buffer_min",
"working_hours",
"min_notice_min",
"allow_same_day",
"horizon_days",
"hard_cap_days",
"max_per_day",
"meeting_form",
"event_title",
"event_description",
"prospect_tz_mode",
"prospect_tz",
"target_calendar_id",
"busy_calendar_ids"
],
"additionalProperties": false
}
},
"additionalProperties": false,
"description": "A field the snapshot predates is absent."
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
}
},
"required": [
"id",
"variant_id",
"version",
"config",
"created_at"
],
"additionalProperties": false
}
},
"has_more": {
"type": "boolean"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"required": [
"data",
"has_more",
"next_cursor"
],
"additionalProperties": false
}