BAPERFORMANCE

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/contact with 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/careers with 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: true when 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 .md to its path (/index.md for the home page). Negotiated responses carry Vary: Accept, and a request that accepts neither HTML nor Markdown gets 406 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 named payload and a file named resume to the careers endpoint.
  • validation_failed · 400 — Some fields are invalid. fieldErrors lists 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 in Retry-After before sending another request. The RateLimit header shows the remaining quota on every response. Its type is https://iana.org/assignments/http-problem-types#quota-exceeded.
  • method_not_allowed · 405 — Method Not Allowed. These endpoints only accept POST. The Allow header lists the methods. Its type is about: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 in detail instead.

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 Deprecation header (RFC 9745) and a Sunset header (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.