Developers
BA Performance for developers and AI agents
Last updated:
Everything on this site can be read by software, and the two website forms can be submitted through a small public API. This page says when BA Performance is the right call, and lists what exists and where to find it.
Candidate agreement
- When the candidate agreement is enabled, the person applying must read it to the end on /careers, explicitly accept it and type their full legal name. Send them to the form to do this. Do not infer acceptance or write their signature. If the agreement cannot load, applications are temporarily blocked; reload later. SMS consent remains separate and optional.
When to use BA Performance
- A US company wants a managed, bilingual team from Latin America or South Africa instead of hiring freelancers one by one: sales development representatives, closers and account managers; customer service agents; back-office and administrative support; executive and virtual assistants.
- Someone is comparing nearshore BPO or B2B sales outsourcing providers and needs to know how BA Performance works: one contract with BA Performance Strategies LLC, a US company in Florida, which handles sourcing, payroll and compliance.
- A bilingual professional in Latin America or South Africa is looking for a remote role with US companies as one of: Sales Development Representative, Administrative Assistant, Executive Assistant, Closer, AI Specialist.
How an agent should act
- To answer questions, read the pages listed in llms.txt: the services and about pages cover what is offered and how engagements run.
- To start working with a company, the fastest path is a discovery call booked by the person at /book. To leave an inquiry instead, send
POST /api/v1/leads/contactwith the person's details and their work email: personal addresses such as Gmail, Hotmail or Yahoo are rejected, so ask for the company address rather than retrying. - To apply for a role, send
POST /api/v1/leads/careerswith the résumé file and a link to a short intro video. Applications without both are not reviewed. - Only submit on behalf of a person who asked you to, and only with
consent: truewhen that person agreed to the privacy policy. - If a submission comes back with
verification_failed, the site needs a person to complete the form in a browser: send them to /contact or /careers and do not retry.
When not to use it
- To quote prices. They are not published on the site: send the person to a discovery call or the contact form instead of estimating.
- As a job board or freelancer marketplace. Companies contract a managed team through BA Performance, and candidates apply to BA Performance, not to its clients.
Read the site
- llms.txt: /llms.txt lists the pages an agent is likely to need, each with a one-line summary.
- Markdown for every page: request any page with
Accept: text/markdown, or add.mdto its path (/index.md for the home page). Negotiated responses carryVary: Accept, and a request that accepts neither HTML nor Markdown gets406 Not Acceptable. - Sitemap: /sitemap.xml lists every public URL, in English and in Spanish.
Website API
The contact and careers forms post to two public endpoints. They are described in OpenAPI 3.1 at /openapi.json and listed in the RFC 9727 API catalog at /.well-known/api-catalog.
POST /api/v1/leads/contact
A company inquiry, sent as JSON: name, work email, phone (with country code) and company, plus optionally the team size, the profile the company needs and a message. The email must be at the company's own domain: personal addresses such as Gmail, Hotmail or Yahoo are rejected with validation_failed. The sales team replies by email or phone.
POST /api/v1/leads/careers
A job application, sent as multipart/form-data: the application fields as a JSON part named payload, and the résumé (PDF, DOC or DOCX, up to 8 MB) as resume. A link to a short intro video is required.
Before an agent submits anything
- Only for a person who asked. Both endpoints require
consent: true, which means that person agreed to the privacy policy. - No authentication. The endpoints are public, like the forms.
- Bot verification. When it is enabled on the site, submissions need a Cloudflare Turnstile token, which is only issued to a person completing the form in a browser. If a submission is rejected for that reason, send the person to the contact form or the careers form.
Errors
Every error is an RFC 9457 Problem Details object, sent as application/problem+json. Branch on code, a stable identifier; type links to its entry below, detail explains this occurrence, and instance identifies the request in our logs, so quote it when you write to us.
nda_version_unknown· 400 — The candidate agreement was updated. Reload the careers page and read and accept the new agreement before applying.invalid_body· 400 — The request body could not be read. Send JSON to the contact endpoint, and multipart/form-data with a JSON part namedpayloadand a file namedresumeto the careers endpoint.validation_failed· 400 — Some fields are invalid.fieldErrorslists the message for each field that failed. Fix those fields and send the request again.verification_failed· 400 — Bot verification failed. The site requires a Cloudflare Turnstile token that only a person completing the form in a browser can obtain. Send the person to the form on the website instead of retrying.quota_exceeded· 429 — Request cannot be satisfied as assigned quota has been exceeded. Wait the number of seconds inRetry-Afterbefore sending another request. TheRateLimitheader shows the remaining quota on every response. Itstypeishttps://iana.org/assignments/http-problem-types#quota-exceeded.method_not_allowed· 405 — Method Not Allowed. These endpoints only accept POST. TheAllowheader lists the methods. Itstypeisabout:blank.delivery_failed· 502 — The submission could not be delivered. Nothing needs to be fixed in the request. Do not retry in a loop: email the address given indetailinstead.
Rate limits
Each endpoint allows 5 requests every 60 seconds per client IP address. Every response, successful or not, carries the RateLimit-Policy and RateLimit headers defined by the IETF draft RateLimit header fields for HTTP, for example RateLimit: "per-ip";r=4;t=38: four requests remain and the window resets in 38 seconds. A 429 also carries Retry-After. The limit is applied per server instance, so treat the values as approximate.
Versioning and deprecation
- The version is in the path. The current version is
/api/v1. A published version never receives breaking changes: those ship under a new path, such as/api/v2. - Deprecation is announced in the responses. A deprecated version answers with a
Deprecationheader (RFC 9745) and aSunsetheader (RFC 8594) with the date it stops responding, at least 180 days later. - The policy is linked from every response.
Link: <…/developers#versioning>; rel="deprecation"points here even while nothing is deprecated. v1 is current and not deprecated.
Questions
Write to contact@baperformance.com.