Skip to content
babazadehAPI reference

All systems operationalREST · JSONApi-Version 2026-09

Moe Babazadeh

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.

Base URLhttps://api.babazadeh.dev/v1
Authentication

None. Every endpoint is public and read-only, except POST /v1/messages, which only drafts an email in your own mail client.

Quickstartzsh
$ 
200 OKapplication/json

Profile

Retrieve the profile

GET/v1/me

Returns 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

NameTypeRequiredDescription
expand[]queryarray of enumaboutstatscurrent_rolesoptionalabout 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-Version returns the title of the time.
companyobject
The primary employer: name and url.
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.
contactobject
email, linkedin, github and cv.
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+
GET /v1/me
curl https://api.babazadeh.dev/v1/me \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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

GET/v1/experience

Every role since 2007, newest first. Roles can overlap: a contract can run alongside a full-time role.

  1. Freelance
  2. Niknam
  3. Alget.nl
  4. 0&1
  5. Neuroject
  6. Neuroship
Roles on a timeline, 2007 to now. Overlaps are real.

Parameters

NameTypeRequiredDescription
sincequeryintegeroptionalOnly roles active in or after this year, 2007 to 2026.
untilqueryintegeroptionalOnly roles that started in or before this year.
currentquerybooleanoptionaltrue for roles with no end date, false for the rest.
expand[]queryarray of enumdutieslinksoptionalduties adds what he did there, straight from the CV. links adds the company site.
limitqueryintegeroptionalPage size, from 1 to 20. Defaults to 10.
cursorquerystringoptionalThe next_cursor of the previous page.

Returns A list of role objects.

All roles

  1. neuroship2026-05 → nowcurrentcontract

    Chief Full Stack Engineer · Neuroship

    Contract role alongside Neuroject.

    duties · 1 item
    • Chief Full Stack Engineer on contract, alongside my role at Neuroject.
  2. neuroject2024-06 → nowcurrent

    Chief 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.
  3. zeroone2021-02 → 2024-06

    Lead 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.
  4. alget2020-08 → 2021-02

    Senior 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.
  5. niknam2012-10 → 2020-08

    Software 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.
  6. freelance2007-08 → 2012-10

    Web 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.
GET /v1/experience?since=2020&expand[]=links&limit=3
curl -G https://api.babazadeh.dev/v1/experience \  -d since=2020 \  -d "expand[]=links" \  -d limit=3 \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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

GET/v1/platforms

Products he architected, built or led, from enterprise SaaS to apps on both stores. Featured platforms come with a screenshot.

Parameters

NameTypeRequiredDescription
featuredquerybooleanoptionalOnly featured platforms, or only the rest.
stackquerystringoptionalCase-insensitive match on a technology, such as next.js or react.
expand[]queryarray of enumlinksoptionallinks inlines live sites and store listings instead of a sub-list reference.
limitqueryintegeroptionalPage size, from 1 to 20. Defaults to 10.
cursorquerystringoptionalThe next_cursor of the previous page.

Returns A list of platform objects.

Featured · featured=true

  • NeuroBuild screenshot
    neurobuild2024· Neuroject

    NeuroBuild

    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

    neuroject.com
  • SmartClaim screenshot
    smartclaim2026· SmartClaim

    SmartClaim

    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

    smartclaim.uk
  • Attendum screenshot
    attendum2023· 0&1

    Attendum

    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

  • Logger screenshot
    logger

    Logger

    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-Class screenshot
    active-class2021· 0&1

    Active-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&1

    Education 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&1

    School.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· Personal

    Pulse 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 link
  • photo-dedup2026· Personal

    Photo 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 link
  • learning-kit2023· 0&1

    Learning Kit

    The product website for Learning Kit, built for 0&1.

    Next.js · AWS Amplify

  • exam-kit2023· 0&1

    Exam Kit

    The product website for Exam Kit, an online exam monitoring system by 0&1.

    Nuxt · Tailwind CSS

GET /v1/platforms?stack=next.js&limit=3
curl -G https://api.babazadeh.dev/v1/platforms \  -d stack=next.js \  -d limit=3 \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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

GET/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

NameTypeRequiredDescription
idpathstringrequiredThe platform id, such as attendum or neurobuild.

Returns A platform object with links expanded.

Ids

Links are a sub-resource too:

On the stores

GET /v1/platforms/attendum
curl https://api.babazadeh.dev/v1/platforms/attendum \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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

GET/v1/open-source

Fixes sent upstream to packages with 300k+ weekly downloads between them, plus his own libraries.

Parameters

NameTypeRequiredDescription
typequeryenumpull_requestrepositoryoptionalPull requests to other projects, or his own repositories.
kindqueryenumsecuritydata_losstype_safetybugoptionalWhat the fix was about.
sincequeryintegeroptionalOnly work from this year on.
sortqueryenum-year-weekly_downloadsoptionalNewest first by default, or by the package’s weekly downloads.
limitqueryintegeroptionalPage size, from 1 to 20. Defaults to 10.
cursorquerystringoptionalThe next_cursor of the previous page.

Returns A list of pull_request and repository objects.

  1. #356572022security★ 56k · 163k/week

    gatsbyjs/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.

  2. #202022data_loss★ 383 · 82k/week

    nanostores/persistent

    Synced storage events only for the store’s own key.

    Opening the app in a second tab wiped saved data.

  3. #782026type_safety★ 486 · 31k/week

    HuolalaTech/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.

  4. #727802025type_safety★ 51k · 22k/week

    DefinitelyTyped/DefinitelyTyped

    Typed the optional RegExp filters on the Forge Viewer’s getPropertyHashes.

    Calls that Autodesk documents failed to type-check.

  5. #932021bug★ 119 · 5.4k/week

    microapps/gatsby-plugin-react-i18next

    Added forwardRef support to the localized Link.

    Refs passed to localized links were silently dropped.

  6. repo2023

    moeBabazadeh/matrix-keypad-freertos

    Reads matrix keypads as a FreeRTOS task, with built-in debouncing and configurable layouts and pin maps. Portable across microcontrollers.

GET /v1/open-source?type=pull_request&sort=-weekly_downloads&limit=3
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"
Response200 OKapplication/json
{  "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

GET/v1/hardware

Devices in production, with the firmware he wrote for them.

Parameters

NameTypeRequiredDescription
limitqueryintegeroptionalPage size, from 1 to 20. Defaults to 10.
cursorquerystringoptionalThe next_cursor of the previous page.

Returns A list of device objects.

  • LG-01GSM weather station

    Logger

    Several sensors per station, with logs sent home over GSM.

    • 50+ stations
    • 15+ years online
    • 0.5B+ records
  • EPC-01Pressure and flow controller

    EPC

    Embedded hardware and firmware that hold pressure and flow at their setpoints.

    • In production
  • PLC-01Compact PLC

    Mini PLC

    Built on STM microcontrollers, for automation on a small footprint.

    • In production
  • AT-01ESP32 card reader

    Attendum 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 beacon

    Attendum beacon

    Bluetooth proximity check-in, updated over the air with DFU.

    • In production
GET /v1/hardware?limit=2
curl -G https://api.babazadeh.dev/v1/hardware \  -d limit=2 \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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

GET/v1/education

Degrees, competitions and a paper: where the engineering started.

Parameters

NameTypeRequiredDescription
limitqueryintegeroptionalPage size, from 1 to 20. Defaults to 10.
cursorquerystringoptionalThe next_cursor of the previous page.

Returns A list of milestone objects.

  1. 2008–2012

    BSc Electrical Engineering, Control Systems

    University of Tabriz. Thesis: a two-wheel self-balancing robot with real-time fuzzy control.

  2. 2009–2011

    Small Size League soccer robots

    A team of five fully autonomous robots playing a real match.

  3. 2010

    RoboCup IranOpen, 1st place

    Deminer Technical Challenge.

  4. 2010

    National Skills Competitions, bronze

    Mobile Robotics.

  5. 2014–2016

    MSc Nanoelectronics Engineering

    University of Tabriz. Thesis: plasmonic wave sources based on multilayer structures.

  6. 2017

    Paper on arXiv

    Design, engineering and optimization of a grid-tie multicell inverter for energy storage.

GET /v1/education?limit=3
curl -G https://api.babazadeh.dev/v1/education \  -d limit=3 \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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

POST/v1/messages

Write 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

NameTypeRequiredDescription
emailbodystringrequiredWhere to reply.
bodybodystringrequiredThe message itself.
namebodystringoptionalSigned at the bottom of the email.
subjectbodystringoptionalDefaults to “Hello from your API docs”.
Idempotency-KeyheaderstringoptionalSend 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.

Compose

Type here and the request on the right is written for you, in whichever language you picked.

Or skip the API

POST /v1/messages
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."  }'
Response202 Acceptedapplication/json
{  "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

  1. 2026-09latest
    • changedNeuroject: Chief Full Stack Engineer → CTO. Leads the architecture, roadmap and delivery, and brings AI into the platform.
  2. 2026-05
    • addedNeuroship: Chief Full Stack Engineer, on contract alongside Neuroject.
  3. 2024-06
    • addedNeuroject: Chief Full Stack Engineer. Leads the architecture and build of NeuroBuild.
    • removed0&1.
  4. 2021-02
    • added0&1: Lead Frontend Developer. Active-Class, then Attendum end to end.
    • removedAlget.nl.
  5. 2020-08
    • addedAlget.nl: Senior Frontend Developer on a React marketplace for local grocers.
    • removedNiknam Electronic Rayan.
  6. 2017
    • changedNiknam: Software Engineer → Senior Software Engineer.
  7. 2012-10
    • addedNiknam Electronic Rayan: Software Engineer. IoT platforms, live GPS tracking and real-time dashboards.
    • removedFreelance.
  8. 2007-08
    • addedInitial release. Freelance web developer: websites and web apps in PHP, JavaScript and jQuery.
Time travelApi-Version: 2026-09
GET /v1/me
curl https://api.babazadeh.dev/v1/me \  -H "Api-Version: 2026-09"
Response200 OKapplication/json
{  "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.object is a role.
role.promoted2 sent
A title changes within a role. data.previous holds the old title.
role.ended4 sent
A role gets its end date.
platform.shipped10 sent
A platform goes live. data.object is a platform.
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.

role.promotedPOST to your endpoint
{  "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"    }  }}
Recent deliveries12 of 27 since 2007
  1. 2026-09role.promotedneuroject200 49 ms
  2. 2026pull_request.openedreact-query-kit-78200 108 ms
  3. 2026platform.shippedsmartclaim200 88 ms
  4. 2026platform.shippedpulse-iot200 48 ms
  5. 2026platform.shippedphoto-dedup200 70 ms
  6. 2026-05role.startedneuroship200 98 ms
  7. 2025pull_request.openeddefinitelytyped-72780200 165 ms
  8. 2024-06role.startedneuroject200 173 ms
  9. 2024-06role.endedzeroone200 165 ms
  10. 2024platform.shippedneurobuild200 70 ms
  11. 2024platform.shippededucation-guide200 68 ms
  12. 2023platform.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

StatusTypeWhen
200 OK—Everything worked.
202 Accepted—POST /v1/messages drafted your email.
400 Bad Requestunknown-parameter, invalid-parameter, invalid-cursorA parameter is unknown or out of range. Typos come back with a did_you_mean.
404 Not Foundnot-foundNothing lives at that path. The response suggests the closest one.
405 Method Not Allowedmethod-not-allowedWrong verb for the path. See the Allow header.
418 I’m a teapotteapotYou asked for /v1/coffee.
422 Unprocessable Contentvalidation-failedA message is missing email or body, or reused an Idempotency-Key.
429 Too Many Requestsrate-limitedMore than 30 requests in a minute. See Retry-After.

Try one:

GET /v1/platforms/atendum404 Not Found
{  "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": }
GET /v1/experience?sinse=2020400 Bad Request
{  "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.

GET /v1/hardware?limit=2200 OK
{  "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": }
Every page, in JavaScript
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.

Your budget, live30/30 left
RateLimit-Limit
30
RateLimit-Remaining
30
RateLimit-Reset
60

Every Send in the console spends one, and this meter is wired to it.

When you run out429 Too Many Requests
{  "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."}

Mohammad Babazadeh · CTO at Neuroject · moe@babazadeh.dev

Concept A · API Reference. Responses are computed in your browser; latencies and request ids are simulated.