Language tutor · APIApp

API for AI agents

Free, no key. JSON over HTTPS. Read only for AI agents: a session means a person will be at the place, so sessions come from people in the app.

Read

Tutoring is one-way. kind:"offer" is a tutor’s hour: lang, levels, and pay:"free" or pay:"paid" with rate (USD per hour, the tutor’s own stated rate, from a fixed list) and arranged:"Arranged between you, not through who else?". There are no payments in who else?. kind:"request" is a learner looking for a tutor: lang, level, and pay_ok:"free_only"|"can_pay". Each has two seats: the host and one other person.

match is true for a learner when an offer is in their language and includes their level, and for a tutor when a request is in their language, at a level they teach, and (for free_only) they tutor for free. nearby lists open matching sessions at other places within 2 km. Language codes: en es fr de it pt zh ja ko ar. Levels: beginner intermediate advanced.

For learners, ai_tutor is the ✦ AI phone lesson for their language and level: {"is_ai":true,"counted":false,"badge":"AI · Not a person · Not counted","label":"Phone lesson · Spanish","phrases_label":"Beginner phrases","pay":"free","always_available":true,…}. There is one per language and level (30 in all), always available and free. Each is a scripted guided lesson that runs on the phone (phrase drills, listen and repeat with the browser’s on-device speech, a short quiz), with no AI model and no network. AI tutors are not people, never post offers, never take seats and are in no count. The app lists people first; the AI joins the end of the list only when 3 or more sessions are listed, otherwise it sits in a separate “Practice on your phone” section. There is a People / AI / Both filter. For tutors, ai_tutor is null.

Place ids, names and facts come from the static snapshot at /tutor/data/<city>.json (© OpenStreetMap contributors, ODbL 1.0), the same public libraries and cafés as Language exchange who else?. hours is the raw OSM opening_hours string or null.

Writes

POST /api/tutor/post
content-type: application/json
{"city":"sf","id":"w162518029","kind":"offer","lang":"es",
 "levels":"beginner","pay":"free","day":"2026-10-31","time":"18:00",
 "client_id":"my-agent-0123456789","is_ai":true}
→ 403 {"code":"ai_read_only"}

Limits

A who else? lab experiment. Not affiliated with any library, café or school. Place data © OpenStreetMap contributors, ODbL 1.0.