All systems operationalREST · JSONApi-Version 2026-09

API reference
Moe Babazadeh
I architect AI-driven platforms and scalable digital products.
CTO at Neuroject, building the alignment layer for construction enterprises. Building since 2007: robots, IoT and firmware, then web, mobile and AI platforms.
This reference documents him the way he would document a platform: typed resources, examples in five languages and a console that answers. Every response is computed in your browser from the same data as the rest of the site.
https://api.babazadeh.dev/v1- GET
/v1/meRetrieve the profileWho he is, what he does now and how to reach him. - GET
/v1/experienceList rolesEvery role since 2007, with dates and duties. - GET
/v1/platformsList platformsWhat he shipped, with live sites and store links. - POST
/v1/messagesSend a messageWrite to him. Drafts an email, sends nothing.
None. Every endpoint is public and read-only, except POST /v1/messages, which only drafts an email in your own mail client.
$ Profile
Retrieve the profile
/v1/meReturns the person behind the API: title, company, stack and how to reach him. Send an older Api-Version and you get the profile as it was then.
I started building websites as a freelancer in 2007, studied electrical engineering with a focus on control systems, and spent my university years building robots, including a 1st place at RoboCup IranOpen 2010.
Since then I’ve built for an electronics and IoT company, a grocery marketplace, an edtech company and a construction-tech company. Today I’m CTO at Neuroject, leading the platform that connects BIM, schedules, budgets and risks for construction enterprises, and bringing AI into it.
Along the way I’ve shipped apps to the App Store and Google Play, hardware that’s still logging data after 15 years, and fixes to open source projects like Gatsby and DefinitelyTyped.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
expand[]query | array of enum | optional | about adds the long version, stats the numbers, and current_roles swaps role ids for full role objects. |
Returns A person object.
The person object
titlestring- Current title. An older
Api-Versionreturns the title of the time. companyobject- The primary employer:
nameandurl. taglinestring- What he does, in one line.
building_sinceinteger- The year of the first freelance website.
current_rolesarray- Ids of roles with no end date. Expandable.
skillsarray of strings- The stack he reaches for.
contactobjectemail,linkedin,githubandcv.avatar_urlstring- A 600 × 600 photo.
skills
- TypeScript
- React & Next.js
- Laravel (PHP)
- Python & FastAPI
- AWS
- React Native & Expo
- Embedded C
- PostgreSQL & MySQL
stats · with expand[]=stats
- commits since 2021
- 11.8k+
- products live
- 10+
- devices in production
- 5
- sensor records logged
- 0.5B+
- apps on App Store and Google Play
- 2
- weekly downloads of packages I patched
- 300k+
curl https://api.babazadeh.dev/v1/me \ -H "Api-Version: 2026-09"{ "id": "moe", "object": "person", "name": "Moe Babazadeh", "full_name": "Mohammad Babazadeh", "title": "CTO", "company": { "name": "Neuroject", "url": "https://neuroject.com" }, "tagline": "I architect AI-driven platforms and scalable digital products.", "building_since": 2007, "current_roles": ["neuroship", "neuroject"], "skills": [ "TypeScript", "React & Next.js", "Laravel (PHP)", "Python & FastAPI", "AWS", "React Native & Expo", "Embedded C", "PostgreSQL & MySQL" ], "contact": { "email": "moe@babazadeh.dev", "linkedin": "https://www.linkedin.com/in/moe-babazadeh/", "github": "https://github.com/moeBabazadeh", "cv": "/resume.pdf" }, "avatar_url": "/assets/images/me.jpg"}Experience
List roles
/v1/experienceEvery role since 2007, newest first. Roles can overlap: a contract can run alongside a full-time role.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
sincequery | integer | optional | Only roles active in or after this year, 2007 to 2026. |
untilquery | integer | optional | Only roles that started in or before this year. |
currentquery | boolean | optional | true for roles with no end date, false for the rest. |
expand[]query | array of enum | optional | duties adds what he did there, straight from the CV. links adds the company site. |
limitquery | integer | optional | Page size, from 1 to 20. Defaults to 10. |
cursorquery | string | optional | The next_cursor of the previous page. |
Returns A list of role objects.
All roles
neuroship2026-05 → nowcurrentcontractChief Full Stack Engineer · Neuroship
Contract role alongside Neuroject.
duties· 1 item- Chief Full Stack Engineer on contract, alongside my role at Neuroject.
neuroject2024-06 → nowcurrentChief Full Stack Engineer → CTO · Neuroject
Built NeuroBuild, then CTO of the alignment layer for construction enterprises.
duties· 4 items- CTO since September 2026, after two years as Chief Full Stack Engineer. I lead the architecture, roadmap, and delivery of a cloud-native, multi-tenant platform that connects BIM, schedules, budgets, and risks into traceable decisions.
- Bringing AI into the platform, from natural-language access to project data to early warning on schedule and cost risk.
- Led the architecture and build of NeuroBuild on Next.js, React 19, and Laravel, hosted on AWS Amplify and Laravel Vapor, with 4,700+ commits across five codebases.
- Set the engineering bar: a permission check on every API route, audit trails, and production alarms and GuardDuty alerts kept in infrastructure as code.
zeroone2021-02 → 2024-06Lead Frontend Developer · 0&1
Active-Class LMS and proctoring, Attendum firmware and apps on both stores.
duties· 4 items- Led the frontend architecture of Active-Class, an integrated LMS and exam monitoring platform, including identity checks during live exams with the Microsoft Azure Face API.
- Shipped Attendum end to end: firmware for the ESP32 card readers and nRF52840 BLE beacons, the iOS and Android app, the staff dashboard, and a Canvas LTI app.
- Built Office.js add-ins for PowerPoint and Word, the School.how dashboard, the Education Guide app, and the Learning Kit and Exam Kit websites.
- Redesigned the CI/CD pipelines to cut build and deployment overhead.
alget2020-08 → 2021-02Senior Frontend Developer · Alget.nl
A React marketplace that took local grocers online.
duties· 3 items- Built the React frontend of a digital marketplace that helps local supermarkets and grocery businesses sell online.
- Implemented state management and client-side data handling that cut unnecessary API requests.
- Shipped MVP features quickly with the product and backend teams, and improved deployment workflows with CI/CD.
niknam2012-10 → 2020-08Software Engineer → Senior Software Engineer · Niknam Electronic Rayan
IoT platforms, live GPS tracking and connected devices.
duties· 3 items- At Niknam Electronic Rayan, built IoT platforms and connected systems for monitoring, tracking, and data visualisation across multiple industries.
- Designed web applications and real-time dashboards, and integrated hardware devices with GPS and mapping services for live tracking.
- Modernised legacy platforms for performance, usability, and maintainability. Software Engineer from 2012, Senior Software Engineer from 2017.
freelance2007-08 → 2012-10Web Developer · Freelance
Websites and web apps for clients in PHP, JavaScript and jQuery.
duties· 1 item- Built websites and web applications for clients with PHP, JavaScript, jQuery, HTML, and CSS.
curl -G https://api.babazadeh.dev/v1/experience \ -d since=2020 \ -d "expand[]=links" \ -d limit=3 \ -H "Api-Version: 2026-09"{ "object": "list", "url": , "total_count": 5, "data": [ { "id": "neuroship", "object": "role", "org": "Neuroship", "title": "Chief Full Stack Engineer", "start": "2026-05", "end": null, "current": true, "contract": true, "summary": "Contract role alongside Neuroject.", "links": { "company": null } }, { "id": "neuroject", "object": "role", "org": "Neuroject", "title": "CTO", "start": "2024-06", "end": null, "current": true, "summary": "Built NeuroBuild, then CTO of the alignment layer for construction enterprises.", "links": { "company": "https://neuroject.com" } }, { "id": "zeroone", "object": "role", "org": "0&1", "title": "Lead Frontend Developer", "start": "2021-02", "end": "2024-06", "current": false, "summary": "Active-Class LMS and proctoring, Attendum firmware and apps on both stores.", "links": { "company": "https://0and1.co.uk" } } ], "has_more": true, "next_cursor": }Endpoint
List platforms
/v1/platformsProducts he architected, built or led, from enterprise SaaS to apps on both stores. Featured platforms come with a screenshot.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
featuredquery | boolean | optional | Only featured platforms, or only the rest. |
stackquery | string | optional | Case-insensitive match on a technology, such as next.js or react. |
expand[]query | array of enum | optional | links inlines live sites and store listings instead of a sub-list reference. |
limitquery | integer | optional | Page size, from 1 to 20. Defaults to 10. |
cursorquery | string | optional | The next_cursor of the previous page. |
Returns A list of platform objects.
Featured · featured=true

neurobuild2024· NeurojectNeuroBuild
The alignment layer for construction enterprises: one multi-tenant platform for BIM models, WBS, quantity take-off, bills of quantities, tenders, and 4D progress reports, now with AI for natural-language questions and early risk warnings. I lead it as CTO.
Next.js · Laravel · AWS · Autodesk APS

smartclaim2026· SmartClaimSmartClaim
AI-assisted R&D tax credit claims for the UK, Ireland, Australia, and South Africa. I work across the FastAPI and pgvector API, the SvelteKit app, and the TypeScript client SDK, and added its security gates: secret scanning, Semgrep, and Trivy on every pull request.
FastAPI · OpenAI · pgvector · SvelteKit · TypeScript

attendum2023· 0&1Attendum
Attendance monitoring live at universities in the UK and US. I wrote the firmware for the ESP32 card readers (NFC, RFID, BLE, over-the-air updates) and the nRF52840 Bluetooth beacons, and built the iOS and Android app, the staff dashboard, and a Canvas LTI app. At a single university, it has more than 200 devices online, covers over 100 classrooms and 10,000 classes, and has received over 3 million records in the past two years.
ESP32 · nRF52840 · React Native · Next.js
loggerLogger
GSM weather stations that take several sensors each and send their logs home. The fleet has been online for over 15 years: more than 50 active stations and over half a billion records.
Hardware · Firmware · GSM · Sensors · Telemetry
No public link
active-class2021· 0&1Active-Class
An LMS with live exam proctoring and Azure Face identity checks. I built the user dashboard, an Office add-in that brings live polls and word clouds into PowerPoint and Word, and the product website.
React · Redux · Firebase · Office.js
More · featured=false
education-guide2024· 0&1Education Guide
A React Native app on both stores that helps students starting university get to know their course, campus, city, and career options.
Expo · React Native · TypeScript
school-how2022· 0&1School.how
Online tutoring for every child: diagnostic tests, courses, quizzes, and 1-to-1 lessons over live video. I built the dashboard and the website.
Next.js · MUI · VideoSDK · Uppy
pulse-iot2026· PersonalPulse IoT
Device telemetry on plain shared PHP hosting: ingest, rollups, alarms with hysteresis, OTA firmware, and reports. No Composer, npm, or build step.
PHP 8 · Vanilla JS · OpenAPI
No public linkphoto-dedup2026· PersonalPhoto Dedup
A native macOS app that finds duplicate and look-alike photos by how they look. Fully offline, and nothing is ever deleted.
Swift · SwiftUI · Vision
No public linklearning-kit2023· 0&1Learning Kit
The product website for Learning Kit, built for 0&1.
Next.js · AWS Amplify
exam-kit2023· 0&1Exam Kit
The product website for Exam Kit, an online exam monitoring system by 0&1.
Nuxt · Tailwind CSS
curl -G https://api.babazadeh.dev/v1/platforms \ -d stack=next.js \ -d limit=3 \ -H "Api-Version: 2026-09"{ "object": "list", "url": , "total_count": 4, "data": [ { "id": "neurobuild", "object": "platform", "name": "NeuroBuild", "description": "The alignment layer for construction enterprises: one multi-tenant platform for BIM models, WBS, quantity take-off, bills of quantities, tenders, and 4D progress reports, now with AI for natural-language questions and early risk warnings. I lead it as CTO.", "stack": ["Next.js", "Laravel", "AWS", "Autodesk APS"], "featured": true, "year": 2024, "made_at": "Neuroject", "image_url": "/assets/images/projects/neurobuild.jpg", "links": { "object": "list", "url": , "total_count": 1 } }, { "id": "attendum", "object": "platform", "name": "Attendum", "description": "Attendance monitoring live at universities in the UK and US. I wrote the firmware for the ESP32 card readers (NFC, RFID, BLE, over-the-air updates) and the nRF52840 Bluetooth beacons, and built the iOS and Android app, the staff dashboard, and a Canvas LTI app. At a single university, it has more than 200 devices online, covers over 100 classrooms and 10,000 classes, and has received over 3 million records in the past two years.", "stack": ["ESP32", "nRF52840", "React Native", "Next.js"], "featured": true, "year": 2023, "made_at": "0&1", "image_url": "/assets/images/projects/attendum.jpg", "links": { "object": "list", "url": , "total_count": 3 } }, { "id": "school-how", "object": "platform", "name": "School.how", "description": "Online tutoring for every child: diagnostic tests, courses, quizzes, and 1-to-1 lessons over live video. I built the dashboard and the website.", "stack": ["Next.js", "MUI", "VideoSDK", "Uppy"], "featured": false, "year": 2022, "made_at": "0&1", "image_url": null, "links": { "object": "list", "url": , "total_count": 1 } } ], "has_more": true, "next_cursor": }Endpoint
Retrieve a platform
/v1/platforms/{id}One platform with its links expanded: the live site, App Store and Google Play listings, and code where it is public.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
idpath | string | required | The platform id, such as attendum or neurobuild. |
Returns A platform object with links expanded.
Ids
Links are a sub-resource too:
On the stores
curl https://api.babazadeh.dev/v1/platforms/attendum \ -H "Api-Version: 2026-09"{ "id": "attendum", "object": "platform", "name": "Attendum", "description": "Attendance monitoring live at universities in the UK and US. I wrote the firmware for the ESP32 card readers (NFC, RFID, BLE, over-the-air updates) and the nRF52840 Bluetooth beacons, and built the iOS and Android app, the staff dashboard, and a Canvas LTI app. At a single university, it has more than 200 devices online, covers over 100 classrooms and 10,000 classes, and has received over 3 million records in the past two years.", "stack": ["ESP32", "nRF52840", "React Native", "Next.js"], "featured": true, "year": 2023, "made_at": "0&1", "image_url": "/assets/images/projects/attendum.jpg", "links": [ { "label": "attendum.com", "kind": "site", "url": "https://attendum.com" }, { "label": "App Store", "kind": "store", "url": "https://apps.apple.com/us/app/attendum/id6450669101" }, { "label": "Google Play", "kind": "store", "url": "https://play.google.com/store/apps/details?id=com.attendum" } ]}Open source
List open-source work
/v1/open-sourceFixes sent upstream to packages with 300k+ weekly downloads between them, plus his own libraries.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
typequery | enum | optional | Pull requests to other projects, or his own repositories. |
kindquery | enum | optional | What the fix was about. |
sincequery | integer | optional | Only work from this year on. |
sortquery | enum | optional | Newest first by default, or by the package’s weekly downloads. |
limitquery | integer | optional | Page size, from 1 to 20. Defaults to 10. |
cursorquery | string | optional | The next_cursor of the previous page. |
Returns A list of pull_request and repository objects.
#356572022security★ 56k · 163k/weekgatsbyjs/gatsby
Removed the deprecated uuid@3.4.0 from gatsby-cli and gatsby-plugin-sharp.
That version can fall back to Math.random(), which is unsafe for IDs. npm flagged it on every install.
#202022data_loss★ 383 · 82k/weeknanostores/persistent
Synced storage events only for the store’s own key.
Opening the app in a second tab wiped saved data.
#782026type_safety★ 486 · 31k/weekHuolalaTech/react-query-kit
Opt-in strictVariables: typed query variables become required at the call site.
A forgotten argument compiled fine and only failed at runtime.
#727802025type_safety★ 51k · 22k/weekDefinitelyTyped/DefinitelyTyped
Typed the optional RegExp filters on the Forge Viewer’s getPropertyHashes.
Calls that Autodesk documents failed to type-check.
#932021bug★ 119 · 5.4k/weekmicroapps/gatsby-plugin-react-i18next
Added forwardRef support to the localized Link.
Refs passed to localized links were silently dropped.
repo2023moeBabazadeh/matrix-keypad-freertos
Reads matrix keypads as a FreeRTOS task, with built-in debouncing and configurable layouts and pin maps. Portable across microcontrollers.
curl -G https://api.babazadeh.dev/v1/open-source \ -d type=pull_request \ -d sort=-weekly_downloads \ -d limit=3 \ -H "Api-Version: 2026-09"{ "object": "list", "url": , "total_count": 5, "data": [ { "id": "gatsby-35657", "object": "pull_request", "repo": "gatsbyjs/gatsby", "number": 35657, "url": "https://github.com/gatsbyjs/gatsby/pull/35657", "year": 2022, "kind": "security", "change": "Removed the deprecated uuid@3.4.0 from gatsby-cli and gatsby-plugin-sharp.", "impact": "That version can fall back to Math.random(), which is unsafe for IDs. npm flagged it on every install.", "repo_stars": "56k", "weekly_downloads": "163k" }, { "id": "persistent-20", "object": "pull_request", "repo": "nanostores/persistent", "number": 20, "url": "https://github.com/nanostores/persistent/pull/20", "year": 2022, "kind": "data_loss", "change": "Synced storage events only for the store’s own key.", "impact": "Opening the app in a second tab wiped saved data.", "repo_stars": "383", "weekly_downloads": "82k" }, { "id": "react-query-kit-78", "object": "pull_request", "repo": "HuolalaTech/react-query-kit", "number": 78, "url": "https://github.com/HuolalaTech/react-query-kit/pull/78", "year": 2026, "kind": "type_safety", "change": "Opt-in strictVariables: typed query variables become required at the call site.", "impact": "A forgotten argument compiled fine and only failed at runtime.", "repo_stars": "486", "weekly_downloads": "31k" } ], "has_more": true, "next_cursor": }Hardware
List devices
/v1/hardwareDevices in production, with the firmware he wrote for them.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
limitquery | integer | optional | Page size, from 1 to 20. Defaults to 10. |
cursorquery | string | optional | The next_cursor of the previous page. |
Returns A list of device objects.
LG-01GSM weather stationLogger
Several sensors per station, with logs sent home over GSM.
- 50+ stations
- 15+ years online
- 0.5B+ records
EPC-01Pressure and flow controllerEPC
Embedded hardware and firmware that hold pressure and flow at their setpoints.
- In production
PLC-01Compact PLCMini PLC
Built on STM microcontrollers, for automation on a small footprint.
- In production
AT-01ESP32 card readerAttendum reader
NFC, RFID, BLE and over-the-air updates. Wireless, with a battery that lasts about 16 months.
- 200+ devices online
- 3M+ records in 2 years
- 10K+ classes covered
AT-02nRF52840 BLE beaconAttendum beacon
Bluetooth proximity check-in, updated over the air with DFU.
- In production
curl -G https://api.babazadeh.dev/v1/hardware \ -d limit=2 \ -H "Api-Version: 2026-09"{ "object": "list", "url": , "total_count": 5, "data": [ { "id": "lg-01", "object": "device", "tag": "LG-01", "name": "Logger", "kind": "GSM weather station", "detail": "Several sensors per station, with logs sent home over GSM.", "figures": ["50+ stations", "15+ years online", "0.5B+ records"] }, { "id": "epc-01", "object": "device", "tag": "EPC-01", "name": "EPC", "kind": "Pressure and flow controller", "detail": "Embedded hardware and firmware that hold pressure and flow at their setpoints.", "figures": ["In production"] } ], "has_more": true, "next_cursor": }Education
List education and roots
/v1/educationDegrees, competitions and a paper: where the engineering started.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
limitquery | integer | optional | Page size, from 1 to 20. Defaults to 10. |
cursorquery | string | optional | The next_cursor of the previous page. |
Returns A list of milestone objects.
- 2008–2012
BSc Electrical Engineering, Control Systems
University of Tabriz. Thesis: a two-wheel self-balancing robot with real-time fuzzy control.
- 2009–2011
Small Size League soccer robots
A team of five fully autonomous robots playing a real match.
- 2010
RoboCup IranOpen, 1st place
Deminer Technical Challenge.
- 2010
National Skills Competitions, bronze
Mobile Robotics.
- 2014–2016
MSc Nanoelectronics Engineering
University of Tabriz. Thesis: plasmonic wave sources based on multilayer structures.
- 2017
Paper on arXiv
Design, engineering and optimization of a grid-tie multicell inverter for energy storage.
curl -G https://api.babazadeh.dev/v1/education \ -d limit=3 \ -H "Api-Version: 2026-09"{ "object": "list", "url": , "total_count": 6, "data": [ { "id": "bsc-electrical-engineering", "object": "milestone", "years": "2008–2012", "title": "BSc Electrical Engineering, Control Systems", "detail": "University of Tabriz. Thesis: a two-wheel self-balancing robot with real-time fuzzy control.", "url": null }, { "id": "small-size-league", "object": "milestone", "years": "2009–2011", "title": "Small Size League soccer robots", "detail": "A team of five fully autonomous robots playing a real match.", "url": null }, { "id": "robocup-iranopen-1st", "object": "milestone", "years": "2010", "title": "RoboCup IranOpen, 1st place", "detail": "Deminer Technical Challenge.", "url": null } ], "has_more": true, "next_cursor": }Endpoint
Send a message
/v1/messagesWrite to Moe. There is no backend: a successful request returns a mailto: link that opens your own mail client with everything filled in. Nothing leaves your browser until you press send there.
Body and headers
| Name | Type | Required | Description |
|---|---|---|---|
emailbody | string | required | Where to reply. |
bodybody | string | required | The message itself. |
namebody | string | optional | Signed at the bottom of the email. |
subjectbody | string | optional | Defaults to “Hello from your API docs”. |
Idempotency-Keyheader | string | optional | Send the same key twice and you get the same message back instead of a duplicate. |
Returns A message object with status: "drafted" and a delivery.href to open.
Or skip the API
curl https://api.babazadeh.dev/v1/messages \ -H "Api-Version: 2026-09" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 7c9e6679-7425-40de-944b-e07fc1f90ae7" \ -d '{ "email": "ada@example.com", "name": "Ada", "subject": "Platform architecture", "body": "Hi Moe, we are scaling a multi-tenant platform and would love your take on it." }'{ "id": "msg_0jfq7r9", "object": "message", "status": "drafted", "to": "moe@babazadeh.dev", "from": { "name": "Ada", "email": "ada@example.com" }, "subject": "Platform architecture", "body": "Hi Moe, we are scaling a multi-tenant platform and would love your take on it.", "delivery": { "method": "mailto", "href": "mailto:moe@babazadeh.dev?subject=Platform%20architecture&body=Hi%20Moe%2C%20we%20are%20scaling%20a%20multi-tenant%20platform%20and%20would%20love%20your%20take%20on%20it.%0A%0AAda" }, "note": "Nothing has been sent. Open delivery.href to send it from your own mail client."}History
Versioning & changelog
Versions are dates, sent in the Api-Version header. Each one is a point in the career, so pinning an older version returns the profile as it was then: the title, the company and the roles of the time. Fields added later are left out. Drag the slider, or pin a version below.
Changelog
2026-09latest- changedNeuroject: Chief Full Stack Engineer → CTO. Leads the architecture, roadmap and delivery, and brings AI into the platform.
2026-05- addedNeuroship: Chief Full Stack Engineer, on contract alongside Neuroject.
2024-06- addedNeuroject: Chief Full Stack Engineer. Leads the architecture and build of NeuroBuild.
- removed0&1.
2021-02- added0&1: Lead Frontend Developer. Active-Class, then Attendum end to end.
- removedAlget.nl.
2020-08- addedAlget.nl: Senior Frontend Developer on a React marketplace for local grocers.
- removedNiknam Electronic Rayan.
2017- changedNiknam: Software Engineer → Senior Software Engineer.
2012-10- addedNiknam Electronic Rayan: Software Engineer. IoT platforms, live GPS tracking and real-time dashboards.
- removedFreelance.
2007-08- addedInitial release. Freelance web developer: websites and web apps in PHP, JavaScript and jQuery.
Api-Version: 2026-09curl https://api.babazadeh.dev/v1/me \ -H "Api-Version: 2026-09"{ "id": "moe", "object": "person", "name": "Moe Babazadeh", "full_name": "Mohammad Babazadeh", "title": "CTO", "company": { "name": "Neuroject", "url": "https://neuroject.com" }, "tagline": "I architect AI-driven platforms and scalable digital products.", "building_since": 2007, "current_roles": ["neuroship", "neuroject"], "skills": [ "TypeScript", "React & Next.js", "Laravel (PHP)", "Python & FastAPI", "AWS", "React Native & Expo", "Embedded C", "PostgreSQL & MySQL" ], "contact": { "email": "moe@babazadeh.dev", "linkedin": "https://www.linkedin.com/in/moe-babazadeh/", "github": "https://github.com/moeBabazadeh", "cv": "/resume.pdf" }, "avatar_url": "/assets/images/me.jpg"}Events
Webhooks
Career events, delivered as they happen. Each delivery is a JSON event with a type, a date and the object that changed.
Event types
role.started6 sent- A role begins.
data.objectis arole. role.promoted2 sent- A title changes within a role.
data.previousholds the old title. role.ended4 sent- A role gets its
enddate. platform.shipped10 sent- A platform goes live.
data.objectis aplatform. pull_request.opened5 sent- A fix is opened upstream.
message.receivedby email- Someone wrote in through
POST /v1/messages. Delivered to an inbox, not to your endpoint.
Deliveries follow the Standard Webhooks spec: every request carries webhook-id, webhook-timestamp and a webhook-signature to verify against your secret. A delivery that does not get a 2xx is retried with backoff.
There is nowhere to register an endpoint yet. The quickest subscription is still an email.
{ "id": "evt_4szvea", "object": "event", "type": "role.promoted", "created": "2026-09", "api_version": "2026-09", "data": { "object": { "id": "neuroject", "object": "role", "org": "Neuroject", "title": "CTO", "start": "2024-06", "end": null, "current": true, "summary": "Built NeuroBuild, then CTO of the alignment layer for construction enterprises." }, "previous": { "title": "Chief Full Stack Engineer" } }}2026-09role.promotedneuroject200 49 ms2026pull_request.openedreact-query-kit-78200 108 ms2026platform.shippedsmartclaim200 88 ms2026platform.shippedpulse-iot200 48 ms2026platform.shippedphoto-dedup200 70 ms2026-05role.startedneuroship200 98 ms2025pull_request.openeddefinitelytyped-72780200 165 ms2024-06role.startedneuroject200 173 ms2024-06role.endedzeroone200 165 ms2024platform.shippedneurobuild200 70 ms2024platform.shippededucation-guide200 68 ms2023platform.shippedattendum200 95 ms
Real events from the CV, replayed. Delivery times are simulated.
Conventions
Errors
Errors are application/problem+json documents (RFC 9457) with a type, a title, the status and a detail written for humans. When a typo is the likely cause, the response says what you probably meant.
Status codes
| Status | Type | When |
|---|---|---|
| 200 OK | — | Everything worked. |
| 202 Accepted | — | POST /v1/messages drafted your email. |
| 400 Bad Request | unknown-parameter, invalid-parameter, invalid-cursor | A parameter is unknown or out of range. Typos come back with a did_you_mean. |
| 404 Not Found | not-found | Nothing lives at that path. The response suggests the closest one. |
| 405 Method Not Allowed | method-not-allowed | Wrong verb for the path. See the Allow header. |
| 418 I’m a teapot | teapot | You asked for /v1/coffee. |
| 422 Unprocessable Content | validation-failed | A message is missing email or body, or reused an Idempotency-Key. |
| 429 Too Many Requests | rate-limited | More than 30 requests in a minute. See Retry-After. |
Try one:
{ "type": "https://api.babazadeh.dev/problems/not-found", "title": "Not found", "status": 404, "detail": "No platform has the id atendum. Did you mean attendum?", "did_you_mean": }{ "type": "https://api.babazadeh.dev/problems/unknown-parameter", "title": "Unknown parameter", "status": 400, "detail": "sinse is not a parameter of GET /v1/experience. Did you mean since?", "param": "sinse", "did_you_mean": "since"}Conventions
Pagination
Lists are cursor-paginated. Every list response has data, has_more and a next_cursor; pass that cursor back to get the next page. Cursors are opaque and only fit the list they came from.
The next page is also in the Link header, so generic HTTP clients can follow it:
link: </v1/hardware?limit=2&cursor=cur_aGFyZHdhcmU6Mg>; rel="next"In the console, a next_cursor is a link: click it to fetch the next page.
{ "object": "list", "url": , "total_count": 5, "data": [ { "id": "lg-01", "object": "device", "tag": "LG-01", "name": "Logger", "kind": "GSM weather station", "detail": "Several sensors per station, with logs sent home over GSM.", "figures": ["50+ stations", "15+ years online", "0.5B+ records"] }, { "id": "epc-01", "object": "device", "tag": "EPC-01", "name": "EPC", "kind": "Pressure and flow controller", "detail": "Embedded hardware and firmware that hold pressure and flow at their setpoints.", "figures": ["In production"] } ], "has_more": true, "next_cursor": }const roles = [];let cursor;do { const url = new URL('https://api.babazadeh.dev/v1/experience'); url.searchParams.set('limit', '2'); if (cursor) url.searchParams.set('cursor', cursor); const page = await (await fetch(url)).json(); roles.push(...page.data); cursor = page.next_cursor;} while (cursor);Conventions
Rate limits
30 requests a minute per visitor, in a fixed window. Every response says where you stand, with the RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers from the IETF draft.
Go over and you get a 429 with a Retry-After header in seconds. Wait it out, or skip the API: email has no rate limit.
- RateLimit-Limit
- 30
- RateLimit-Remaining
- 30
- RateLimit-Reset
- 60
Every Send in the console spends one, and this meter is wired to it.
{ "type": "https://api.babazadeh.dev/problems/rate-limited", "title": "Too many requests", "status": 429, "detail": "The limit is 30 requests a minute. Try again in 42 s."}