{
  "openapi": "3.1.0",
  "info": {
    "title": "Array HQ public API",
    "version": "1.0.0",
    "summary": "Lead-capture endpoints behind the arrayhq.com forms.",
    "description": "Array HQ is a frontline workforce platform. This specification covers the\npublic endpoints the marketing site exposes — all of them lead-capture form\nhandlers that accept a JSON POST and forward it to our CRM.\n\nThese endpoints require no authorization: no token, key, or scope. The\nempty top-level `security` array states that explicitly, so an agent can\nsee that zero privilege is needed rather than attempting a token exchange.\n\nThere is no read API here — these endpoints only accept submissions and\nnever return stored data. Submitting means a real person will follow up, so\nonly call them on behalf of someone who asked you to.\n\nFailures return application/problem+json (RFC 9457) with a stable `code`,\na human `title` and `detail`, and a `hint` describing how to resolve it.\nBranch on `code` — the prose fields may be reworded. No endpoint on this\nhost answers an error with HTML.\n\nThe authenticated Array HQ product API and the Array HQ MCP server are\nseparate services, not described by this document. /llms.txt indexes them\nand the rest of the developer resources; /sitemap.xml lists every page.",
    "contact": {
      "name": "Array HQ",
      "url": "https://www.arrayhq.com/"
    }
  },
  "externalDocs": {
    "description": "Array HQ product documentation",
    "url": "https://docs.arrayhq.com/"
  },
  "servers": [
    {
      "url": "https://www.arrayhq.com",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Lead capture",
      "description": "Form submissions that create a sales or marketing contact."
    }
  ],
  "paths": {
    "/api/book-demo": {
      "post": {
        "operationId": "bookDemo",
        "tags": [
          "Lead capture"
        ],
        "summary": "Request a product demo",
        "description": "Books a demo request. Forwarded to Pardot and mirrored to Make.com.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookDemoRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "502": {
            "description": "The downstream CRM or automation webhook rejected the submission (upstream_unavailable).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "bookDemoPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/industry-notify": {
      "post": {
        "operationId": "notifyIndustryInterest",
        "tags": [
          "Lead capture"
        ],
        "summary": "Register interest in an industry not yet launched",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IndustryNotifyRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "502": {
            "description": "The downstream CRM or automation webhook rejected the submission (upstream_unavailable).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "notifyIndustryInterestPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/qsr-form": {
      "post": {
        "operationId": "submitQsrEnquiry",
        "tags": [
          "Lead capture"
        ],
        "summary": "Request restaurant/QSR recruiting help",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QsrFormRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "502": {
            "description": "The downstream CRM or automation webhook rejected the submission (upstream_unavailable).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "submitQsrEnquiryPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/ops-qsr-form": {
      "post": {
        "operationId": "submitOpsQsrEnquiry",
        "tags": [
          "Lead capture"
        ],
        "summary": "Request restaurant/QSR ops demo",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OpsQsrFormRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "502": {
            "description": "The downstream CRM or automation webhook rejected the submission (upstream_unavailable).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "submitOpsQsrEnquiryPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/qsr-sales": {
      "post": {
        "operationId": "submitQsrHeroCapture",
        "tags": [
          "Lead capture"
        ],
        "summary": "Submit the QSR landing page hero capture",
        "description": "Three-field capture from the QSR hero. Forwarded to Make.com. `form_name` identifies which hero the submission came from.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QsrSalesRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "502": {
            "description": "The downstream CRM or automation webhook rejected the submission (upstream_unavailable).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "submitQsrHeroCapturePreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/checklist-request": {
      "post": {
        "operationId": "requestSourcingChecklist",
        "tags": [
          "Lead capture"
        ],
        "summary": "Request the sourcing exposure checklist PDF",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChecklistRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "requestSourcingChecklistPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/roi-report-lead": {
      "post": {
        "operationId": "submitRoiReportLead",
        "tags": [
          "Lead capture"
        ],
        "summary": "Save ROI calculator results against a contact",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoiReportLeadRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "submitRoiReportLeadPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    },
    "/api/blog-subscribe": {
      "post": {
        "operationId": "subscribeToNewsletter",
        "tags": [
          "Lead capture"
        ],
        "summary": "Subscribe an email address to the Insights newsletter",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BlogSubscribeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Submission accepted. Also returned when a submission is silently discarded as spam.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuccessResponse"
                }
              }
            }
          },
          "400": {
            "description": "Malformed JSON (invalid_json), a missing required field (missing_required_fields), a value outside the allowed set (invalid_field_value), or a malformed email (invalid_email).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Wrong HTTP method (method_not_allowed). The Allow header and the `allowed` member both name the accepted methods.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server-side failure (internal_error).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "options": {
        "operationId": "subscribeToNewsletterPreflight",
        "tags": [
          "Lead capture"
        ],
        "summary": "CORS preflight",
        "description": "Returns the accepted methods and CORS policy. Every endpoint here allows any origin, because none of them read or return credentialed data.",
        "responses": {
          "204": {
            "description": "No content. `Allow` is `POST, OPTIONS`; `Access-Control-Allow-Origin` is `*`."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "SuccessResponse": {
        "type": "object",
        "required": [
          "success"
        ],
        "properties": {
          "success": {
            "type": "boolean",
            "const": true
          }
        }
      },
      "Problem": {
        "type": "object",
        "description": "Error payload, shaped after RFC 9457 and served as application/problem+json. Branch on `code`: it is stable, whereas title and detail may be reworded.",
        "required": [
          "status",
          "code",
          "title",
          "detail",
          "hint"
        ],
        "properties": {
          "status": {
            "type": "integer",
            "description": "HTTP status code, repeated for callers that only read the body."
          },
          "code": {
            "type": "string",
            "enum": [
              "invalid_json",
              "missing_required_fields",
              "invalid_field_value",
              "invalid_email",
              "method_not_allowed",
              "endpoint_not_found",
              "upstream_unavailable",
              "internal_error"
            ],
            "description": "Stable machine-readable identifier for the failure."
          },
          "title": {
            "type": "string",
            "description": "Short human summary of the problem."
          },
          "detail": {
            "type": "string",
            "description": "What specifically went wrong with this request."
          },
          "hint": {
            "type": "string",
            "description": "What the caller should do to resolve it."
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Names of the fields that failed validation, when applicable."
          },
          "allowed": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Permitted values (or methods), when the request used one outside the accepted set."
          }
        }
      },
      "BookDemoRequest": {
        "type": "object",
        "required": [
          "email",
          "last_name",
          "phone",
          "company",
          "biggest_workforce_challenge"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "first_name": {
            "type": "string",
            "description": "Optional."
          },
          "last_name": {
            "type": "string"
          },
          "phone": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "biggest_workforce_challenge": {
            "type": "string",
            "enum": [
              "Hiring faster and reducing recruiting costs",
              "Rewarding and retaining your frontline workforce",
              "Both"
            ]
          }
        }
      },
      "IndustryNotifyRequest": {
        "type": "object",
        "required": [
          "email",
          "first_name",
          "last_name",
          "company",
          "industry",
          "workforce_size"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "first_name": {
            "type": "string"
          },
          "last_name": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "industry": {
            "type": "string",
            "description": "Free text — the industry the caller wants supported."
          },
          "workforce_size": {
            "type": "string",
            "enum": [
              "1–50",
              "51–200",
              "201–500",
              "501–1,000",
              "1,000+"
            ],
            "description": "Note the en dash in the range values."
          }
        }
      },
      "QsrFormRequest": {
        "type": "object",
        "required": [
          "email",
          "company",
          "locations",
          "open_roles"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "company": {
            "type": "string"
          },
          "locations": {
            "type": "string",
            "description": "Number of locations, as text. Example: \"32\"."
          },
          "open_roles": {
            "type": "string",
            "description": "Number of open roles, as text. Example: \"45\"."
          },
          "form_name": {
            "type": "string",
            "default": "recruiting_qsr",
            "description": "Optional label recorded with the submission."
          }
        }
      },
      "OpsQsrFormRequest": {
        "type": "object",
        "required": [
          "email",
          "company",
          "locations",
          "open_roles"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "company": {
            "type": "string"
          },
          "locations": {
            "type": "string",
            "description": "Number of locations, as text. Example: \"32\"."
          },
          "open_roles": {
            "type": "string",
            "description": "Number of open roles, as text. Example: \"45\"."
          },
          "form_name": {
            "type": "string",
            "default": "ops_qsr",
            "description": "Optional label recorded with the submission."
          }
        }
      },
      "QsrSalesRequest": {
        "type": "object",
        "required": [
          "email",
          "name",
          "company"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "name": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "form_name": {
            "type": "string",
            "default": "qsr_hero",
            "description": "Optional label identifying the originating hero, e.g. recruiting_qsr."
          }
        }
      },
      "ChecklistRequest": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          },
          "name": {
            "type": "string",
            "description": "Optional."
          },
          "title": {
            "type": "string",
            "description": "Optional job title."
          },
          "industry": {
            "type": "string",
            "enum": [
              "QSR / Restaurants",
              "Warehouse & Distribution",
              "Transportation & Logistics",
              "Construction",
              "Manufacturing",
              "Other frontline / hourly"
            ],
            "description": "Optional, but rejected if it is not one of these values."
          }
        }
      },
      "RoiReportLeadRequest": {
        "type": "object",
        "required": [
          "fullName",
          "jobTitle",
          "company",
          "workEmail"
        ],
        "properties": {
          "fullName": {
            "type": "string"
          },
          "jobTitle": {
            "type": "string"
          },
          "company": {
            "type": "string"
          },
          "workEmail": {
            "type": "string",
            "format": "email"
          },
          "inputs": {
            "type": "object",
            "additionalProperties": true,
            "description": "Optional ROI calculator inputs, stored verbatim."
          },
          "results": {
            "type": "object",
            "additionalProperties": true,
            "description": "Optional ROI calculator results, stored verbatim."
          }
        }
      },
      "BlogSubscribeRequest": {
        "type": "object",
        "required": [
          "email"
        ],
        "properties": {
          "email": {
            "type": "string",
            "format": "email"
          }
        }
      }
    }
  }
}