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.
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.
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.