A snippet is copied from docs.blitz-api.ai and carries the URL it came from. The surface of an SDK is not deduced by analogy.
Code on the site is quoted, never invented
Six surfaces show code, from the developers hub to a lesson payload. Every one of them follows the same contract: the real base URL, the real header, field names copied from the API reference, and a source URL for every snippet.
A path written « by convention » before its doc exists is a bug on every surface: an invented enrichment path lived on the product page, the use case frame and llms-full.txt for 19 days.
person_linkedin_url, people.min_per_company, max_results, cursor, fair_usage: the names are the API’s, not the copy’s.
Geist Mono, 11 to 13px, on the ink panel (--color-ink, --radius-l). Labels uppercase, .06 to .08em. No syntax highlighting theme, no line wrapping.
Six surfaces, one look
Each surface has its fiche on the Sections, Content or Assets page. The table says what it shows and where it lives.
| Surface | File | Where | What it shows | Fiche |
|---|---|---|---|---|
| CodeTabs | hub/CodeTabs.astro | Developers hub | The same call in cURL, Python and TypeScript. Accessible tabs, no-JS safe, one verbatim source URL per snippet. | Open → |
| CodeSplit panel | product/CodeSplit.astro | Product opening A | The dark 556×448 panel receives an ASSET, not text: the code idea is drawn (api-request, terminal-command), never pasted. | Open → |
| Payload | learn/blocks/Payload.astro | Lessons | The annotated code block: numbered lines, notes anchored on the lines to adapt. | Open → |
| Endpoint | content/Endpoint.astro | Articles and lessons | The card of an endpoint: method, path, the parameters that matter, the response fields to read, the reference link. | Open → |
| api-request · terminal-command · json-* | visual-assets/BlitzAsset.astro | Any proof frame | Code as a sign: a method chip and a path, a prompt and a command, a typed key-value pair. | Open → |
| LabCode | layout-system/LabCode.astro | This lab | The reference block of the lab: label bar, copy button, ink panel. Not shipped on public pages. | Open → |
Ink panel, annotated when it teaches
A plain block states; a Payload teaches (three notes for fifteen lines); an Endpoint card lists only the fields the text talks about. The three below use the official Person Enrichment and TAM By People references.
POST https://api.blitz-api.ai/v2/enrichment/person
x-api-key: YOUR_API_KEY
Content-Type: application/json
{ "person_linkedin_url": "https://www.linkedin.com/in/antoine-blitz-5581b7373" }
{
"people": {
"job_title": { "include": ["Sales"] },
1
"location": { "country_code": ["US"] },
"min_per_company": 3
2
},
"company": {
"industry": { "include": ["Software Development"] },
"employee_range": ["51-200", "201-500"]
},
"max_results": 50,
3
"cursor": null
}
- Keyword match by default; wrap a title in [brackets] for an exact match.
- The persona floor: 1 to 25, 0 = unset. A heavy floor can return partial pages: keep paging.
- Up to 50 companies per page, 10 by default. One result per company returned.
Retrieve a professional’s full profile and entire career history from their LinkedIn profile URL.
Send
person_linkedin_urlrequired- LinkedIn profile URL of the person to enrich
Read
found- true when the profile resolved; false returns person: null and counts nothing
person.experiences[]- Every role: company_linkedin_url, company_linkedin_id, company_domain, dates, job_is_current
fair_usage.request_id- Quote it when you contact support
What every snippet assumes
Read from the official OpenAPI v2 (docs.blitz-api.ai). If one of these facts changes, every surface above changes with it.
- Base URL
- https://api.blitz-api.ai
- Authentication
- x-api-key header, one key per workspace (app.blitz-api.ai)
- Method
- Every v2 endpoint is a POST with a JSON body (key info is the one GET)
- Pagination
- cursor-based: pass the returned cursor back until it comes back null; max_results up to 50
- Usage block
- fair_usage on every response: records_used, records_remaining, next_reset_at, rate_limit, request_id
- Not found
- found: false with a null object, nothing counted
- Errors
- 401 invalid key · 402 fair use limit reached · 404 not found · 429 too many requests
cURL · verbatim from the docs
curl -X POST https://api.blitz-api.ai/v2/enrichment/email \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"person_linkedin_url":"https://www.linkedin.com/in/example-person"}'Python · verbatim from the docs
from blitz_api import BlitzAPI
client = BlitzAPI() # reads BLITZ_API_KEY
email = client.enrichment.email(
person_linkedin_url="https://www.linkedin.com/in/example-person"
)
if email.found:
print(email.email)TypeScript · verbatim from the docs
import { BlitzAPI } from "blitz-api-js";
const client = new BlitzAPI(); // reads BLITZ_API_KEY
const email = await client.enrichment.email({
person_linkedin_url: "https://www.linkedin.com/in/example-person",
});
if (email.found) console.log(email.email);The catalog the site speaks
One line per product, from the endpoint field of the product JSON: the same field that renders the Endpoint line of /llms-full.txt and the subtitle of the steps sections.
Machine surfaces: /llms.txt (curated index) and /llms-full.txt (the whole site in one markdown file), both generated at build from the same sources; the API reference itself lives at docs.blitz-api.ai.
Data-cta ids, configuration, schemas
The code of the site itself follows a few closed grammars. They live in config files and are checked at build or by the audit.
data-cta ids
Every conversion link carries data-cta="scope.location.intent[.plan]", built by ctaId() in config/tracking.ts. The lists are closed (tracking-contract.json); an id outside them fails the build, and the audit counts CTAs without an id.
TS
ctaId('product', 'hero', 'primary') // → "product.hero.primary"
ctaId('pricing', 'pricing_card', 'choose', 'full') // → "pricing.pricing_card.choose.full"
scopes: global · home · pricing · product · use_case · team · developers · integrations · about · contact · legal · other
locations: nav · nav_mobile · hero · pricing_card · plan_matrix · plan_compare · embedded_band · cta_section · inline · footer · unknown
plans: core · plus · fullContent schemas
src/content.config.ts types every collection: products (family, endpoint, seo, hero, sections, faq, docsUrl, relatedProducts), useCases, teams, blog, courses, lessons. A section kind outside the enum fails the build; a missing optional field does not, which is why the templates list what each section requires.
TS · content.config.ts
const section = z.object({
kind: z.enum(['features', 'showcase', 'split', 'steps', 'usecases', 'apis']),
title: z.string().optional(),
subtitle: z.string().optional(),
asset: z.string().optional(), // BlitzAssetId
signature: z.string().optional(), // BlitzSignatureId
items: z.array(sectionItem),
});Configuration files
config/site.ts: NAV, PRODUCT_FAMILIES, USE_CASES, TEAMS, FOOTER, EXTERNAL, CONTACT_FORM, PRIVACY_FORMconfig/pricing.ts: SEPT, PLANS, PRICING_FAQ, EMBEDDED, COPY: every offer figureconfig/signature-bands.ts: FAMILY_BANDS, USECASE_BANDS, HUB_BANDS, TEAM_BANDSconfig/tracking.ts+tracking-contract.json: loader, consent, data-cta grammarconfig/testimonials.ts: slides, QUOTES_ARE_PLACEHOLDERS guard
Build and checks
npm run build: 47 pages, sitemap, llms.txt and llms-full.txtpython3 scripts/audit-sept.py dist: links, banned routes, forbidden terms, SEO bounds, JSON-LD, offer facts, sitemap, trackingnode scripts/rhythm-harness.mjs: rails, gutter, vertical intervals, overflow at 1440 / 991 / 767 / 375node scripts/capture.mjs <url> <width> <out.png>: full-page capture with real device emulation- Push on main deploys to production (Vercel) in about two minutes: build and audit first, always