Blitz Brand Lab · Code

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.

15 PUBLISHED ENDPOINTSBASE URL api.blitz-api.aiHEADER x-api-keyGEIST MONO · INK PANEL
01Verbatim, with a source

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.

02Real endpoints only

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.

03Field names from the reference

person_linkedin_url, people.min_per_company, max_results, cursor, fair_usage: the names are the API’s, not the copy’s.

04Mono for the machine

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.

01
Where code appears

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.

6 SURFACES
SurfaceFileWhereWhat it showsFiche
CodeTabshub/CodeTabs.astroDevelopers hubThe same call in cURL, Python and TypeScript. Accessible tabs, no-JS safe, one verbatim source URL per snippet.Open →
CodeSplit panelproduct/CodeSplit.astroProduct opening AThe dark 556×448 panel receives an ASSET, not text: the code idea is drawn (api-request, terminal-command), never pasted.Open →
Payloadlearn/blocks/Payload.astroLessonsThe annotated code block: numbered lines, notes anchored on the lines to adapt.Open →
Endpointcontent/Endpoint.astroArticles and lessonsThe 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.astroAny proof frameCode as a sign: a method chip and a path, a prompt and a command, a typed key-value pair.Open →
LabCodelayout-system/LabCode.astroThis labThe reference block of the lab: label bar, copy button, ink panel. Not shipped on public pages.Open →
api-request
terminal-command
json-field
key-info
02
The panel and the blocks

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.

3 BLOCKS
HTTP · the canonical request
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" }
POST https://api.blitz-api.ai/v2/company/tam-by-peoplejson

          
          {
          
        
          
            "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
          
        
          
          }
          
        
  1. Keyword match by default; wrap a title in [brackets] for an exact match.
  2. The persona floor: 1 to 25, 0 = unset. A heavy floor can return partial pages: keep paging.
  3. Up to 50 companies per page, 10 by default. One result per company returned.
POST/v2/enrichment/personAPI reference

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
03
API contract

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.

7 FACTS
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"}'
source: docs.blitz-api.ai/api-reference/people-enrichment/find-work-email →
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)
source: docs.blitz-api.ai/sdks/python →
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);
source: docs.blitz-api.ai/sdks/typescript →
04
Published endpoints

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.

15 ENDPOINTS

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.

05
Site code conventions

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.

4 GRAMMARS

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 · full

Content 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_FORM
  • config/pricing.ts: SEPT, PLANS, PRICING_FAQ, EMBEDDED, COPY: every offer figure
  • config/signature-bands.ts: FAMILY_BANDS, USECASE_BANDS, HUB_BANDS, TEAM_BANDS
  • config/tracking.ts + tracking-contract.json: loader, consent, data-cta grammar
  • config/testimonials.ts: slides, QUOTES_ARE_PLACEHOLDERS guard

Build and checks

  • npm run build: 47 pages, sitemap, llms.txt and llms-full.txt
  • python3 scripts/audit-sept.py dist: links, banned routes, forbidden terms, SEO bounds, JSON-LD, offer facts, sitemap, tracking
  • node scripts/rhythm-harness.mjs: rails, gutter, vertical intervals, overflow at 1440 / 991 / 767 / 375
  • node 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