{
  "openapi": "3.1.0",
  "info": {
    "title": "BA Performance Website API",
    "summary": "Send a company inquiry or a job application to BA Performance.",
    "description": "BA Performance (BA Performance Strategies LLC) is a US-incorporated BPO and B2B sales outsourcing company. These are the endpoints behind the contact and careers forms on https://baperformance.com/.\n\n- **No authentication.** They are public, like the forms.\n- **Consent is required.** `consent: true` means the person agreed to the privacy policy. An agent must only submit on behalf of a person who asked it to and agreed.\n- **Company inquiries need a work email.** `/leads/contact` rejects personal addresses (Gmail, Hotmail, Outlook.com, Yahoo, iCloud and similar) with `validation_failed`. Job applications accept any email.\n- **SMS consent is separate and optional.** `smsConsent` is its own field, defaults to `false`, and is never required for a submission to be accepted. Send `true` only when the person explicitly agreed to receive text messages; agreeing to the privacy policy is not that.\n- **Bot verification.** When enabled on the site, a Cloudflare Turnstile token is required, and it can only be obtained by completing the form in a browser.\n\nWhen to use BA Performance, and everything else an agent can read on the site, is in https://baperformance.com/llms.txt.\n\n## Errors\n\nEvery error is an RFC 9457 Problem Details object (`application/problem+json`). Branch on `code`, a stable machine-readable identifier: `agreement_unavailable` (503), `nda_version_unknown` (400), `invalid_body` (400), `validation_failed` (400), `verification_failed` (400), `quota_exceeded` (429), `method_not_allowed` (405), `delivery_failed` (502). `type` is a URI that documents the problem and how to resolve it, `detail` is a human-readable message, and `instance` identifies the request in the server logs.\n\n## Rate limits\n\nEach endpoint allows 5 requests per 60 seconds per client IP address. Every response carries the `RateLimit-Policy` and `RateLimit` headers (draft-ietf-httpapi-ratelimit-headers): `r` is the remaining quota and `t` the seconds until the window resets. A `429` also carries `Retry-After`. The limit is applied per server instance, so treat the values as approximate.\n\n## Versioning and deprecation\n\nThe version is part of the path: `/api/v1`. A published version never receives breaking changes; those ship under a new path. When a version is deprecated, its responses carry the `Deprecation` header (RFC 9745) and a `Sunset` header (RFC 8594) at least 180 days before it stops responding. Every response already links to this policy with `Link: <https://baperformance.com/developers#versioning>; rel=\"deprecation\"`.",
    "version": "1.0.0",
    "termsOfService": "https://baperformance.com/terms",
    "contact": {
      "name": "BA Performance",
      "email": "contact@baperformance.com",
      "url": "https://baperformance.com/developers"
    }
  },
  "externalDocs": {
    "description": "BA Performance developer resources",
    "url": "https://baperformance.com/developers"
  },
  "servers": [
    {
      "url": "https://baperformance.com",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Leads",
      "description": "Company inquiries and job applications, the same ones the website forms send."
    }
  ],
  "paths": {
    "/api/v1/leads/contact": {
      "post": {
        "operationId": "submitCompanyInquiry",
        "tags": [
          "Leads"
        ],
        "summary": "Send a company inquiry",
        "description": "A company asks about hiring through BA Performance. The sales team replies by email or phone. Same as the form at https://baperformance.com/contact.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContactLead"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The inquiry was received.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadAccepted"
                }
              }
            }
          },
          "400": {
            "description": "The request is invalid. `code` says why: `invalid_body`, `validation_failed` (see `fieldErrors`) or `verification_failed`.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "invalid_body": {
                    "summary": "The request body could not be read",
                    "value": {
                      "type": "https://baperformance.com/developers#error-invalid-body",
                      "title": "The request body could not be read",
                      "status": 400,
                      "detail": "Invalid request body.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "invalid_body",
                      "error": "Invalid request body."
                    }
                  },
                  "validation_failed": {
                    "summary": "Some fields are invalid",
                    "value": {
                      "type": "https://baperformance.com/developers#error-validation-failed",
                      "title": "Some fields are invalid",
                      "status": 400,
                      "detail": "Please check the highlighted fields.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "validation_failed",
                      "error": "Please check the highlighted fields.",
                      "fieldErrors": {
                        "email": [
                          "Enter a valid email address"
                        ]
                      }
                    }
                  },
                  "verification_failed": {
                    "summary": "Bot verification failed",
                    "value": {
                      "type": "https://baperformance.com/developers#error-verification-failed",
                      "title": "Bot verification failed",
                      "status": 400,
                      "detail": "Verification failed. Please reload and try again.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "verification_failed",
                      "error": "Verification failed. Please reload and try again."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many submissions from the same IP address (`quota_exceeded`).",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "quota_exceeded": {
                    "summary": "Request cannot be satisfied as assigned quota has been exceeded",
                    "value": {
                      "type": "https://iana.org/assignments/http-problem-types#quota-exceeded",
                      "title": "Request cannot be satisfied as assigned quota has been exceeded",
                      "status": 429,
                      "detail": "Too many requests. Please try again shortly.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "quota_exceeded",
                      "violated-policies": [
                        "per-ip"
                      ],
                      "error": "Too many requests. Please try again shortly."
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "The submission could not be delivered (`delivery_failed`). Email the address given in `detail` instead of retrying in a loop.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "delivery_failed": {
                    "summary": "The submission could not be delivered",
                    "value": {
                      "type": "https://baperformance.com/developers#error-delivery-failed",
                      "title": "The submission could not be delivered",
                      "status": 502,
                      "detail": "We could not submit your message. Please email contact@baperformance.com and we will pick it up from there.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "delivery_failed",
                      "error": "We could not submit your message. Please email contact@baperformance.com and we will pick it up from there."
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/leads/careers": {
      "post": {
        "operationId": "submitJobApplication",
        "tags": [
          "Leads"
        ],
        "summary": "Apply for an open role",
        "description": "A candidate applies for one or more open roles, with a résumé and an intro video link. Same as the form at https://baperformance.com/careers.",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": [
                  "payload",
                  "resume"
                ],
                "properties": {
                  "payload": {
                    "$ref": "#/components/schemas/CareersApplication",
                    "description": "The application fields, as a JSON part."
                  },
                  "resume": {
                    "type": "string",
                    "contentMediaType": "application/octet-stream",
                    "description": "The candidate's résumé: PDF, DOC or DOCX, up to 8 MB."
                  }
                }
              },
              "encoding": {
                "payload": {
                  "contentType": "application/json"
                },
                "resume": {
                  "contentType": "application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The application was received.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LeadAccepted"
                }
              }
            }
          },
          "400": {
            "description": "Invalid request, or nda_version_unknown: reload the careers page to read the new agreement.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "invalid_body": {
                    "summary": "The request body could not be read",
                    "value": {
                      "type": "https://baperformance.com/developers#error-invalid-body",
                      "title": "The request body could not be read",
                      "status": 400,
                      "detail": "Invalid request body.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "invalid_body",
                      "error": "Invalid request body."
                    }
                  },
                  "validation_failed": {
                    "summary": "Some fields are invalid",
                    "value": {
                      "type": "https://baperformance.com/developers#error-validation-failed",
                      "title": "Some fields are invalid",
                      "status": 400,
                      "detail": "Please check the highlighted fields.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "validation_failed",
                      "error": "Please check the highlighted fields.",
                      "fieldErrors": {
                        "email": [
                          "Enter a valid email address"
                        ]
                      }
                    }
                  },
                  "verification_failed": {
                    "summary": "Bot verification failed",
                    "value": {
                      "type": "https://baperformance.com/developers#error-verification-failed",
                      "title": "Bot verification failed",
                      "status": 400,
                      "detail": "Verification failed. Please reload and try again.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "verification_failed",
                      "error": "Verification failed. Please reload and try again."
                    }
                  },
                  "nda_version_unknown": {
                    "summary": "The candidate agreement was updated",
                    "value": {
                      "type": "https://baperformance.com/developers#error-nda-version-unknown",
                      "title": "The candidate agreement was updated",
                      "status": 400,
                      "detail": "The candidate agreement was updated. Reload the page to read the new version.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "nda_version_unknown",
                      "error": "The candidate agreement was updated. Reload the page to read the new version."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "description": "Too many submissions from the same IP address (`quota_exceeded`).",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              },
              "Retry-After": {
                "$ref": "#/components/headers/Retry-After"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "quota_exceeded": {
                    "summary": "Request cannot be satisfied as assigned quota has been exceeded",
                    "value": {
                      "type": "https://iana.org/assignments/http-problem-types#quota-exceeded",
                      "title": "Request cannot be satisfied as assigned quota has been exceeded",
                      "status": 429,
                      "detail": "Too many requests. Please try again shortly.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "quota_exceeded",
                      "violated-policies": [
                        "per-ip"
                      ],
                      "error": "Too many requests. Please try again shortly."
                    }
                  }
                }
              }
            }
          },
          "502": {
            "description": "The submission could not be delivered (`delivery_failed`). Email the address given in `detail` instead of retrying in a loop.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "delivery_failed": {
                    "summary": "The submission could not be delivered",
                    "value": {
                      "type": "https://baperformance.com/developers#error-delivery-failed",
                      "title": "The submission could not be delivered",
                      "status": 502,
                      "detail": "We could not submit your message. Please email contact@baperformance.com and we will pick it up from there.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "delivery_failed",
                      "error": "We could not submit your message. Please email contact@baperformance.com and we will pick it up from there."
                    }
                  }
                }
              }
            }
          },
          "503": {
            "description": "The candidate agreement could not be loaded. Reload the careers page in a few minutes.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimit-Policy"
              },
              "RateLimit": {
                "$ref": "#/components/headers/RateLimit"
              },
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Sunset": {
                "$ref": "#/components/headers/Sunset"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                },
                "examples": {
                  "agreement_unavailable": {
                    "summary": "The candidate agreement could not be loaded",
                    "value": {
                      "type": "https://baperformance.com/developers#error-agreement-unavailable",
                      "title": "The candidate agreement could not be loaded",
                      "status": 503,
                      "detail": "Our candidate agreement could not be loaded. Please try again in a few minutes.",
                      "instance": "urn:uuid:7c9e6679-7425-40de-944b-e07fc1f90ae7",
                      "code": "agreement_unavailable",
                      "error": "Our candidate agreement could not be loaded. Please try again in a few minutes."
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ContactLead": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "First name of the person asking about BA Performance's services."
          },
          "lastName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Last name."
          },
          "email": {
            "type": "string",
            "maxLength": 160,
            "format": "email",
            "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
            "description": "Work email address at the company's own domain. The team replies here. Personal addresses (Gmail, Hotmail, Outlook.com, Live, Yahoo, AOL, iCloud, Proton, GMX, Yandex and similar free providers, in any country variant) are rejected with `validation_failed`: ask the person for their work email instead of retrying."
          },
          "phone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 40,
            "description": "Phone number in international format with country code, e.g. `+13055550100`. It must contain between 7 and 15 digits."
          },
          "company": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Company name."
          },
          "teamSize": {
            "type": "string",
            "enum": [
              "1-10",
              "11-50",
              "51-200",
              "200+"
            ],
            "description": "Size of the company's team."
          },
          "role": {
            "type": "string",
            "enum": [
              "bdr-sdr",
              "executive-assistant",
              "administrative-assistant",
              "closer"
            ],
            "description": "The profile the company needs to hire."
          },
          "message": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 4000
              },
              {
                "type": "string",
                "const": ""
              }
            ],
            "description": "Anything else the team should know before replying."
          },
          "consent": {
            "type": "boolean",
            "const": true,
            "description": "Must be `true`: the person agrees to the privacy policy (https://baperformance.com/privacy-policy). Only send it when the person you act for has agreed."
          },
          "smsConsent": {
            "default": false,
            "type": "boolean",
            "description": "Optional, defaults to `false`. `true` only if the person separately and explicitly agreed to receive SMS. It is never a condition for submitting: do not set it to get the request accepted, and do not infer it from `consent`. Left out, the person is contacted by email only."
          },
          "website": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 0
              },
              {
                "type": "string",
                "const": ""
              }
            ],
            "description": "Leave empty or omit."
          },
          "turnstileToken": {
            "type": "string",
            "maxLength": 4000,
            "description": "Cloudflare Turnstile token produced by the form on the website. Required only while bot verification is enabled on the site; requests without a valid token are then rejected with 400."
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "es"
            ],
            "description": "Language of the error messages in the response. Defaults to `en`."
          },
          "eventId": {
            "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)$",
            "description": "Used by the website to deduplicate analytics events. Omit."
          },
          "attribution": {
            "type": "object",
            "properties": {
              "utmSource": {
                "type": "string",
                "maxLength": 200
              },
              "utmMedium": {
                "type": "string",
                "maxLength": 200
              },
              "utmCampaign": {
                "type": "string",
                "maxLength": 200
              },
              "utmTerm": {
                "type": "string",
                "maxLength": 200
              },
              "utmContent": {
                "type": "string",
                "maxLength": 200
              },
              "gclid": {
                "type": "string",
                "maxLength": 200
              },
              "fbclid": {
                "type": "string",
                "maxLength": 200
              },
              "referrer": {
                "type": "string",
                "maxLength": 500
              },
              "landingPath": {
                "type": "string",
                "maxLength": 200
              },
              "firstSeen": {
                "type": "string",
                "maxLength": 40
              }
            },
            "description": "First-touch campaign data captured by the website. Omit unless you have campaign parameters."
          }
        },
        "required": [
          "firstName",
          "lastName",
          "email",
          "phone",
          "company",
          "consent"
        ]
      },
      "CareersApplication": {
        "type": "object",
        "properties": {
          "ndaAcceptance": {
            "type": "object",
            "properties": {
              "version": {
                "type": "string",
                "minLength": 1,
                "maxLength": 40
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "accepted": {
                "type": "boolean",
                "const": true
              },
              "fullName": {
                "type": "string",
                "minLength": 2,
                "maxLength": 200
              }
            },
            "required": [
              "version",
              "sha256",
              "accepted",
              "fullName"
            ],
            "description": "Required when the candidate agreement is enabled on /careers; omit when disabled. The candidate must read it to the end, check acceptance (accepted: true) and type their full legal name (2–200 characters, trimmed, no NUL). Use version and sha256 from the displayed agreement. Do not infer acceptance or fill in the signature for them. Country comes from the application. This is separate from privacy and SMS consent."
          },
          "firstName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Candidate's first name."
          },
          "lastName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Candidate's last name."
          },
          "email": {
            "type": "string",
            "maxLength": 160,
            "format": "email",
            "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
            "description": "Candidate's email address. The hiring team replies here."
          },
          "phone": {
            "type": "string",
            "maxLength": 40,
            "description": "Optional. Candidate's phone number in international format with country code, e.g. `+573001234567`. If present, it must contain between 7 and 15 digits."
          },
          "country": {
            "type": "string",
            "enum": [
              "Afghanistan",
              "Åland Islands",
              "Albania",
              "Algeria",
              "American Samoa",
              "Andorra",
              "Angola",
              "Anguilla",
              "Antarctica",
              "Antigua and Barbuda",
              "Argentina",
              "Armenia",
              "Aruba",
              "Australia",
              "Austria",
              "Azerbaijan",
              "Bahamas",
              "Bahrain",
              "Bangladesh",
              "Barbados",
              "Belarus",
              "Belgium",
              "Belize",
              "Benin",
              "Bermuda",
              "Bhutan",
              "Bolivia",
              "Caribbean Netherlands",
              "Bosnia and Herzegovina",
              "Botswana",
              "Bouvet Island",
              "Brazil",
              "British Indian Ocean Territory",
              "British Virgin Islands",
              "Brunei",
              "Bulgaria",
              "Burkina Faso",
              "Burundi",
              "Cape Verde",
              "Cambodia",
              "Cameroon",
              "Canada",
              "Cayman Islands",
              "Central African Republic",
              "Chad",
              "Chile",
              "China",
              "Christmas Island",
              "Cocos (Keeling) Islands",
              "Colombia",
              "Comoros",
              "Congo - Brazzaville",
              "Congo - Kinshasa",
              "Cook Islands",
              "Costa Rica",
              "Côte d’Ivoire",
              "Croatia",
              "Cuba",
              "Curaçao",
              "Cyprus",
              "Czechia",
              "Denmark",
              "Djibouti",
              "Dominica",
              "Dominican Republic",
              "Ecuador",
              "Egypt",
              "El Salvador",
              "Equatorial Guinea",
              "Eritrea",
              "Estonia",
              "Eswatini",
              "Ethiopia",
              "Falkland Islands",
              "Faroe Islands",
              "Fiji",
              "Finland",
              "France",
              "French Guiana",
              "French Polynesia",
              "French Southern Territories",
              "Gabon",
              "Gambia",
              "Georgia",
              "Germany",
              "Ghana",
              "Gibraltar",
              "Greece",
              "Greenland",
              "Grenada",
              "Guadeloupe",
              "Guam",
              "Guatemala",
              "Guernsey",
              "Guinea",
              "Guinea-Bissau",
              "Guyana",
              "Haiti",
              "Heard and McDonald Islands",
              "Honduras",
              "Hong Kong",
              "Hungary",
              "Iceland",
              "India",
              "Indonesia",
              "Iran",
              "Iraq",
              "Ireland",
              "Isle of Man",
              "Israel",
              "Italy",
              "Jamaica",
              "Japan",
              "Jersey",
              "Jordan",
              "Kazakhstan",
              "Kenya",
              "Kiribati",
              "Kosovo",
              "Kuwait",
              "Kyrgyzstan",
              "Laos",
              "Latvia",
              "Lebanon",
              "Lesotho",
              "Liberia",
              "Libya",
              "Liechtenstein",
              "Lithuania",
              "Luxembourg",
              "Macao",
              "Madagascar",
              "Malawi",
              "Malaysia",
              "Maldives",
              "Mali",
              "Malta",
              "Marshall Islands",
              "Martinique",
              "Mauritania",
              "Mauritius",
              "Mayotte",
              "Mexico",
              "Micronesia",
              "Moldova",
              "Monaco",
              "Mongolia",
              "Montenegro",
              "Montserrat",
              "Morocco",
              "Mozambique",
              "Myanmar",
              "Namibia",
              "Nauru",
              "Nepal",
              "Netherlands",
              "New Caledonia",
              "New Zealand",
              "Nicaragua",
              "Niger",
              "Nigeria",
              "Niue",
              "Norfolk Island",
              "North Korea",
              "North Macedonia",
              "Northern Mariana Islands",
              "Norway",
              "Oman",
              "Pakistan",
              "Palau",
              "Palestine",
              "Panama",
              "Papua New Guinea",
              "Paraguay",
              "Peru",
              "Philippines",
              "Pitcairn Islands",
              "Poland",
              "Portugal",
              "Puerto Rico",
              "Qatar",
              "Réunion",
              "Romania",
              "Russia",
              "Rwanda",
              "Saint Barthélemy",
              "Saint Helena",
              "Saint Kitts and Nevis",
              "Saint Lucia",
              "Saint Martin",
              "Saint Pierre and Miquelon",
              "Saint Vincent and the Grenadines",
              "Samoa",
              "San Marino",
              "São Tomé and Príncipe",
              "Saudi Arabia",
              "Senegal",
              "Serbia",
              "Seychelles",
              "Sierra Leone",
              "Singapore",
              "Sint Maarten",
              "Slovakia",
              "Slovenia",
              "Solomon Islands",
              "Somalia",
              "South Africa",
              "South Georgia and the South Sandwich Islands",
              "South Korea",
              "South Sudan",
              "Spain",
              "Sri Lanka",
              "Sudan",
              "Suriname",
              "Svalbard and Jan Mayen",
              "Sweden",
              "Switzerland",
              "Syria",
              "Taiwan",
              "Tajikistan",
              "Tanzania",
              "Thailand",
              "Timor-Leste",
              "Togo",
              "Tokelau",
              "Tonga",
              "Trinidad and Tobago",
              "Tunisia",
              "Türkiye",
              "Turkmenistan",
              "Turks and Caicos Islands",
              "Tuvalu",
              "U.S. Outlying Islands",
              "U.S. Virgin Islands",
              "Uganda",
              "Ukraine",
              "United Arab Emirates",
              "United Kingdom",
              "United States",
              "Uruguay",
              "Uzbekistan",
              "Vanuatu",
              "Vatican City",
              "Venezuela",
              "Vietnam",
              "Wallis and Futuna",
              "Western Sahara",
              "Yemen",
              "Zambia",
              "Zimbabwe"
            ],
            "description": "Country where the candidate lives, as its English name exactly as listed (e.g. `Colombia`, `United States`, `South Africa`)."
          },
          "spanishLevel": {
            "type": "string",
            "enum": [
              "Native",
              "Conversational",
              "Don't speak"
            ],
            "description": "Candidate's Spanish level."
          },
          "englishLevel": {
            "type": "string",
            "enum": [
              "B1",
              "B2",
              "C1",
              "C2"
            ],
            "description": "Candidate's English level (CEFR)."
          },
          "roles": {
            "minItems": 1,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Sales Development Representative",
                "Administrative Assistant",
                "Executive Assistant",
                "Closer",
                "AI Specialist"
              ]
            },
            "description": "Open roles the candidate applies for. At least one."
          },
          "loomUrl": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500,
            "format": "uri",
            "description": "Link to a short intro video (Loom or Google Drive). Required: applications without a video are not reviewed."
          },
          "consent": {
            "type": "boolean",
            "const": true,
            "description": "Must be `true`: the candidate agrees to the privacy policy (https://baperformance.com/privacy-policy). Only send it when the person you act for has agreed."
          },
          "smsConsent": {
            "default": false,
            "type": "boolean",
            "description": "Optional, defaults to `false`. `true` only if the candidate separately and explicitly agreed to receive SMS. It is never a condition for applying, and it does not affect how the application is reviewed: do not set it to get the request accepted, and do not infer it from `consent`."
          },
          "website": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 0
              },
              {
                "type": "string",
                "const": ""
              }
            ],
            "description": "Leave empty or omit."
          },
          "turnstileToken": {
            "type": "string",
            "maxLength": 4000,
            "description": "Cloudflare Turnstile token produced by the form on the website. Required only while bot verification is enabled on the site; requests without a valid token are then rejected with 400."
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "es"
            ],
            "description": "Language of the error messages in the response. Defaults to `en`."
          },
          "eventId": {
            "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)$",
            "description": "Used by the website to deduplicate analytics events. Omit."
          },
          "attribution": {
            "type": "object",
            "properties": {
              "utmSource": {
                "type": "string",
                "maxLength": 200
              },
              "utmMedium": {
                "type": "string",
                "maxLength": 200
              },
              "utmCampaign": {
                "type": "string",
                "maxLength": 200
              },
              "utmTerm": {
                "type": "string",
                "maxLength": 200
              },
              "utmContent": {
                "type": "string",
                "maxLength": 200
              },
              "gclid": {
                "type": "string",
                "maxLength": 200
              },
              "fbclid": {
                "type": "string",
                "maxLength": 200
              },
              "referrer": {
                "type": "string",
                "maxLength": 500
              },
              "landingPath": {
                "type": "string",
                "maxLength": 200
              },
              "firstSeen": {
                "type": "string",
                "maxLength": 40
              }
            },
            "description": "First-touch campaign data captured by the website. Omit unless you have campaign parameters."
          }
        },
        "required": [
          "firstName",
          "lastName",
          "email",
          "country",
          "spanishLevel",
          "englishLevel",
          "roles",
          "loomUrl",
          "consent"
        ]
      },
      "LeadAccepted": {
        "type": "object",
        "required": [
          "ok",
          "redirectTo"
        ],
        "properties": {
          "ok": {
            "const": true
          },
          "redirectTo": {
            "type": "string",
            "description": "The confirmation page the website shows next, as a site-relative path."
          }
        }
      },
      "Problem": {
        "type": "object",
        "description": "An RFC 9457 Problem Details object. Clients must ignore members they do not recognize.",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "code"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri-reference",
            "description": "Identifies the problem type. Dereferencing it gives human-readable documentation on how to resolve it."
          },
          "title": {
            "type": "string",
            "description": "Short summary of the problem type. It does not change between occurrences."
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599,
            "description": "The HTTP status code of the response."
          },
          "detail": {
            "type": "string",
            "description": "What went wrong this time, for a person. Validation messages follow the requested `locale`."
          },
          "instance": {
            "type": "string",
            "format": "uri-reference",
            "description": "The request, as `urn:uuid:…`. It appears in the server logs: include it when reporting a problem."
          },
          "code": {
            "type": "string",
            "enum": [
              "agreement_unavailable",
              "nda_version_unknown",
              "invalid_body",
              "validation_failed",
              "verification_failed",
              "quota_exceeded",
              "method_not_allowed",
              "delivery_failed"
            ],
            "description": "Stable, machine-readable identifier of the problem. Branch on this."
          },
          "error": {
            "type": "string",
            "description": "Same text as `detail`, kept for the website forms."
          },
          "fieldErrors": {
            "type": "object",
            "description": "Validation messages per field. Present with `validation_failed`.",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "violated-policies": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "The rate-limit policies that were exceeded (draft-ietf-httpapi-ratelimit-headers). Present with `quota_exceeded`."
          }
        }
      }
    },
    "headers": {
      "RateLimit-Policy": {
        "description": "The quota policy of the endpoint (draft-ietf-httpapi-ratelimit-headers): `q` requests every `w` seconds, per client IP address.",
        "schema": {
          "type": "string"
        },
        "example": "\"per-ip\";q=5;w=60"
      },
      "RateLimit": {
        "description": "The current quota (draft-ietf-httpapi-ratelimit-headers): `r` requests remain, and the window resets in `t` seconds.",
        "schema": {
          "type": "string"
        },
        "example": "\"per-ip\";r=4;t=60"
      },
      "Retry-After": {
        "description": "Seconds to wait before sending another request.",
        "schema": {
          "type": "integer",
          "minimum": 0
        }
      },
      "Link": {
        "description": "Always includes the versioning and deprecation policy, as `<https://baperformance.com/developers#versioning>; rel=\"deprecation\"` (RFC 9745). Once a sunset date is set, also `rel=\"sunset\"`.",
        "schema": {
          "type": "string"
        },
        "example": "<https://baperformance.com/developers#versioning>; rel=\"deprecation\"; type=\"text/html\""
      },
      "Deprecation": {
        "description": "Present only once this API version is deprecated (RFC 9745): the date, as `@` followed by Unix seconds.",
        "schema": {
          "type": "string"
        },
        "example": "@1788220800"
      },
      "Sunset": {
        "description": "Present only once a retirement date is set (RFC 8594): the HTTP date after which this version stops responding, at least 180 days after deprecation.",
        "schema": {
          "type": "string"
        },
        "example": "Mon, 01 Mar 2027 00:00:00 GMT"
      }
    }
  }
}
