{"openapi":"3.1.1","info":{"title":"Brownsmith Dynamics Public API","version":"1.0.0","summary":"Public, unauthenticated website information and contact endpoints.","description":"Read public business and directory information, or submit a contact request. The API exposes only the capabilities described here.","termsOfService":"https://brownsmithdynamics.com/content-policy","contact":{"name":"Brownsmith Dynamics","url":"https://brownsmithdynamics.com/contact"}},"externalDocs":{"description":"Human-readable API guidance and examples","url":"https://brownsmithdynamics.com/docs"},"servers":[{"url":"https://brownsmithdynamics.com","description":"Brownsmith Dynamics website"}],"security":[],"tags":[{"name":"Discovery","description":"Public facts and machine-readable guidance."},{"name":"Directories","description":"Public discovery data."},{"name":"Privacy","description":"Consent-region guidance."},{"name":"Contact","description":"User-initiated contact submissions."}],"paths":{"/api/public-business-information":{"get":{"tags":["Discovery"],"operationId":"getPublicBusinessInformation","summary":"Read public business information","description":"Returns the canonical public business profile, catalogue entries, contact options, and related documentation links.","externalDocs":{"description":"API usage and examples","url":"https://brownsmithdynamics.com/docs"},"security":[],"responses":{"200":{"description":"Public business information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicBusinessInformation"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/ai-instructions":{"get":{"tags":["Discovery"],"operationId":"getAiInstructions","summary":"Read agent usage instructions","description":"Returns plain-text instructions pointing agents to authoritative public business information and explaining how to handle uncertainty.","externalDocs":{"description":"API usage and examples","url":"https://brownsmithdynamics.com/docs"},"security":[],"responses":{"200":{"description":"Plain-text agent instructions.","content":{"text/plain":{"schema":{"type":"string"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/blogs":{"get":{"tags":["Directories"],"operationId":"listBlogs","summary":"List public blog summaries","description":"Returns ten public blog summaries in published-date order. Continue with the returned nextOffset; limit is fixed at 10.","externalDocs":{"description":"API usage and pagination examples","url":"https://brownsmithdynamics.com/docs"},"security":[],"parameters":[{"name":"offset","in":"query","required":false,"description":"Zero-based offset; defaults to 0.","schema":{"type":"integer","minimum":0,"default":0},"example":10},{"name":"limit","in":"query","required":false,"description":"Page size. Only 10 is accepted; defaults to 10.","schema":{"type":"integer","const":10,"default":10},"example":10}],"responses":{"200":{"description":"A page of public blog summaries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlogPage"}}}},"400":{"description":"Invalid offset or limit; code INVALID_QUERY.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/coding-tools":{"get":{"tags":["Directories"],"operationId":"listCodingTools","summary":"List open-source coding tools","description":"Returns the current public directory metadata. Project licenses remain those of the upstream projects.","externalDocs":{"description":"API usage","url":"https://brownsmithdynamics.com/docs"},"security":[],"responses":{"200":{"description":"Coding tool directory.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodingToolsResponse"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/coding-tools.csv":{"get":{"tags":["Directories"],"operationId":"downloadCodingToolsCsv","summary":"Download coding tools as CSV","description":"Downloads directory metadata with columns name, description, github_url, and website_url. Missing URLs are empty cells.","externalDocs":{"description":"API usage","url":"https://brownsmithdynamics.com/docs"},"security":[],"responses":{"200":{"description":"CSV file attachment.","headers":{"Content-Disposition":{"schema":{"type":"string"},"description":"Suggested filename."}},"content":{"text/csv":{"schema":{"type":"string"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/consent-region":{"get":{"tags":["Privacy"],"operationId":"getConsentRegion","summary":"Check whether analytics consent is required","description":"On Vercel, evaluates the hosting platform's country signal. Unknown region and self-hosted requests require opt-in. The result is private and not cached.","externalDocs":{"description":"API usage","url":"https://brownsmithdynamics.com/docs"},"security":[],"responses":{"200":{"description":"Consent requirement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsentRegionResponse"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/contact":{"post":{"tags":["Contact"],"operationId":"submitContactRequest","summary":"Submit an intentional contact request","description":"Accepts a user-initiated contact form submission as JSON. Request bodies are limited to 8192 bytes. When Origin is supplied it must match the request origin. Best-effort rate limits are 3 requests per 15 minutes per normalized email-or-phone key and 20 per minute per running process; limits are process-local and not a distributed guarantee. No CORS access is promised. Prefer the contact page for human visitors.","externalDocs":{"description":"Contact page and API guidance","url":"https://brownsmithdynamics.com/docs"},"security":[],"requestBody":{"required":true,"description":"Standard contact requests require email. Scoping requests may use email or an international phone number. The website field is a spam honeypot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"},"examples":{"contact":{"summary":"General contact request","value":{"name":"Asha Rao","email":"asha@example.com","phone":"","message":"I would like to discuss workflow automation.","website":""}},"serviceScoping":{"summary":"Service scoping request","value":{"source":"service-scoping","name":"Asha Rao","email":"asha@example.com","phone":"+919876543210","message":"Current workflow details","website":""}}}}}},"responses":{"200":{"description":"Request accepted. A honeypot submission is silently accepted without delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactSuccess"}}}},"400":{"description":"Malformed JSON or invalid fields; code INVALID_JSON or VALIDATION_ERROR.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"403":{"description":"Origin mismatch; code INVALID_ORIGIN.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"405":{"description":"Method not allowed. The Allow header lists supported methods.","headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"413":{"description":"Request body exceeds the byte limit; code PAYLOAD_TOO_LARGE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"415":{"description":"Request Content-Type is not application/json; code UNSUPPORTED_MEDIA_TYPE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Rate limit exceeded; code RATE_LIMITED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds before retrying.","schema":{"type":"integer","minimum":1}}}},"502":{"description":"Notification delivery failed; code DELIVERY_FAILED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"503":{"description":"Contact delivery is not configured; code SERVICE_UNAVAILABLE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"securitySchemes":{},"schemas":{"ApiError":{"type":"object","required":["ok","error","code","message","hint","documentation"],"properties":{"ok":{"type":"boolean","const":false},"error":{"type":"string","description":"Human-readable compatibility message."},"code":{"type":"string","description":"Stable machine-readable error code."},"message":{"type":"string"},"hint":{"type":"string"},"documentation":{"type":"string","format":"uri"}},"additionalProperties":false},"PublicCatalogueEntry":{"type":"object","required":["id","name","description","url"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"}},"additionalProperties":false},"PublicBusinessInformation":{"type":"object","required":["schemaVersion","updatedAt","company","services","capabilities","products","courses","contact","documentation"],"properties":{"schemaVersion":{"type":"string","const":"1.0.0"},"updatedAt":{"type":"string","format":"date"},"company":{"type":"object","required":["name","description","positioning","canonicalUrl","profiles","founder"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"positioning":{"type":"object","required":["category","corePromise","implementationApproach","commercialOutcome","targetAudience"],"properties":{"category":{"type":"string"},"corePromise":{"type":"string"},"implementationApproach":{"type":"string"},"commercialOutcome":{"type":"string"},"targetAudience":{"type":"string"}},"additionalProperties":false},"canonicalUrl":{"type":"string","format":"uri"},"profiles":{"type":"object","required":["linkedin","googleBusinessProfile"],"properties":{"linkedin":{"type":"string","format":"uri"},"googleBusinessProfile":{"type":"string","format":"uri"}},"additionalProperties":false},"founder":{"type":"object","required":["name","portfolio","github","role"],"properties":{"name":{"type":"string"},"portfolio":{"type":"string","format":"uri"},"github":{"type":"string","format":"uri"},"role":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"services":{"type":"array","items":{"$ref":"#/components/schemas/PublicCatalogueEntry"}},"capabilities":{"type":"array","items":{"$ref":"#/components/schemas/PublicCatalogueEntry"}},"products":{"type":"array","items":{"$ref":"#/components/schemas/PublicCatalogueEntry"}},"courses":{"type":"array","items":{"$ref":"#/components/schemas/PublicCatalogueEntry"}},"contact":{"type":"object","required":["primary","whatsappUrl","email","emailUrl","meetingUrl"],"properties":{"primary":{"type":"string","const":"WhatsApp"},"whatsappUrl":{"type":"string","format":"uri"},"email":{"type":"string","format":"email"},"emailUrl":{"type":"string"},"meetingUrl":{"type":"string","format":"uri"}},"additionalProperties":false},"documentation":{"type":"object","required":["llms","structuredData","businessEfficiencyService","apiDocs","openapi"],"properties":{"llms":{"type":"string","format":"uri"},"structuredData":{"type":"string","format":"uri"},"businessEfficiencyService":{"type":"string","format":"uri"},"apiDocs":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"}},"additionalProperties":false}},"additionalProperties":false},"BlogItem":{"type":"object","required":["slug","title","description","publishedLabel","readingTime","category","imageSrc","imageAlt"],"properties":{"slug":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"publishedLabel":{"type":"string","description":"Formatted publication date, for example 3 Oct 2026."},"readingTime":{"type":"string"},"category":{"type":"string"},"imageSrc":{"type":"string"},"imageAlt":{"type":"string"}},"additionalProperties":false},"BlogPage":{"type":"object","required":["items","nextOffset","total","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BlogItem"}},"nextOffset":{"type":"integer","minimum":0},"total":{"type":"integer","minimum":0},"hasMore":{"type":"boolean"}},"additionalProperties":false},"CodingTool":{"type":"object","required":["name","shortDescription"],"properties":{"name":{"type":"string"},"githubUrl":{"type":"string","format":"uri"},"websiteUrl":{"type":"string","format":"uri"},"shortDescription":{"type":"string"}},"additionalProperties":false},"CodingToolsResponse":{"type":"object","required":["name","license","count","tools"],"properties":{"name":{"type":"string"},"license":{"type":"string"},"count":{"type":"integer","minimum":0},"tools":{"type":"array","items":{"$ref":"#/components/schemas/CodingTool"}}},"additionalProperties":false},"ConsentRegionResponse":{"type":"object","required":["requiresOptIn"],"properties":{"requiresOptIn":{"type":"boolean"}},"additionalProperties":false},"ContactRequest":{"type":"object","properties":{"source":{"type":"string","enum":["service-scoping","building-with-ai"]},"name":{"type":"string","maxLength":100},"email":{"type":"string","maxLength":254,"description":"Required for general contact. For a scoping request, email or phone is required."},"phone":{"type":"string","maxLength":32,"description":"Optional international number beginning with +; scoping requests may use it instead of email."},"message":{"type":"string","maxLength":2000,"description":"Required and non-empty for scoping requests."},"website":{"type":"string","maxLength":200,"description":"Spam honeypot; leave empty."}}},"ContactSuccess":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}},"additionalProperties":false}}}}