Ainoova ToolsAPI & ClaudeSign inStart free
Docs

API & Claude

Every tool is the same shape: resources you can list, create, update and delete, settings you can read and change, and a few actions. The web app is built on this API, so anything you can do on screen, Claude can do too.

Connect Claude (MCP)

OAuth 2.1 with PKCE and dynamic client registration; metadata at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource.

describe_toolsStart here. Lists the 10 tools, each resource's fields (with types and allowed values), computed fields, settings, actions, and the user's plan and usage.
todayWhat needs the user today across every tool: tasks due or overdue, note reminders, renewals to act on, charges coming, people to catch up with, new form sign-ups, habits left, journal nudge.
list_recordsList or search records. Filters are exact matches on fields (tags fields match one tag; booleans true/false); add _before/_after to a date/number field or created_at for ranges. Sort by a field, '-' for descending. Resources: notes: notes | tasks: tasks | later: links | habits: habits, checkins | journal: entries | renewals: items | subs: subs | people: people, touches | forms: forms, submissions | short: links.
get_recordFetch one record by id, with its computed fields.
create_recordCreate a record. Unknown fields are rejected with the list of valid ones; call describe_tools for field types. Returns the created record.
update_recordChange some fields of a record (merge: fields you don't send stay as they are; null clears a field). Logged and undoable.
delete_recordMove a record to the trash (restorable with restore_record or undo). permanent=true deletes it for good: only when the user explicitly asked.
restore_recordBring a trashed record back.
batchUp to 200 create/update/delete operations in one call (each runs on its own; failures are reported per operation). Use for imports and bulk edits.
get_settingsCurrent settings of a tool (defaults filled in), or app='account' for time zone and date format.
update_settingsChange some settings of a tool (or app='account'). Only the keys you send change. Logged and undoable.
run_actionRun a tool-specific action (describe_tools lists their inputs). Actions: notes: quick_capture, labels, rename_label, duplicate, delete_label, attach_image, import_keep, empty_trash | tasks: quick_add, complete, lists | later: surprise | habits: check_in | journal: today, upsert_day, stats | renewals: renew | subs: summary, roll_forward | people: log_touch, due | forms: export_csv, mark_all | short: stats.
quick_noteSave a note in Notes from free text. '- item' lines become a checklist; a short first line becomes the title.
activityRecent changes with who made them (web, an API key, or Claude) and whether they can be undone.
undoUndo one entry of the activity log (restores the previous version, un-trashes, or trashes what was created).

REST

Base https://tools.ainoova.com/api/v1, JSON in and out, Authorization: Bearer ainv_… (create keys in Account). Machine-readable: /openapi.json.

GET /apps every tool, field, setting and action GET /today what needs you today, across tools GET /{app}/{resource}?q=&sort=&limit=&offset=&trashed=&<field>=&<field>_before=&<field>_after= POST /{app}/{resource} create GET /{app}/{resource}/{id} PATCH /{app}/{resource}/{id} merge: only sent fields change, null clears DELETE /{app}/{resource}/{id} to the trash (?permanent=true to erase) POST /{app}/{resource}/{id}/restore GET /{app}/settings PATCH /{app}/settings POST /{app}/actions/{action} POST /batch up to 200 create/update/delete operations GET /activity POST /activity/{id}/undo GET /export everything as JSON

Errors: { "error": "…", "fields": { "due_date": "is required" } }. 402 means a free-plan limit was reached: reads keep working, Pro removes the limit.

Notes /notes

Quick notes and checklists, like Keep, that Claude can read and tidy.

/notes/notes A text note or a checklist. Deleting moves it to the trash (restorable for 30 days).
titlestringTitle
bodytextText. Plain text; line breaks are kept
kindtext | checklistKind
itemslist of {text, done, indent}Checklist items. Used when kind is checklist
colordefault | red | orange | yellow | green | teal | blue | cerulean | purple | pink | brown | grayColour
labelstagsLabels
pinnedboolPinned
archivedboolArchived
reminder_atdatetimeReminder. Notifies on your devices and shows in Today from this moment
reminder_repeatnone | daily | weekly | monthly | yearlyRepeat reminder
Settings: default_color (default | red | orange | yellow | green | teal | blue | cerulean | purple | pink | brown | gray)layout (grid | list)new_checklist_items_at (bottom | top)move_checked_to_bottom (bool)labels (tags)
Actions:
  • quick_capture Create a note from free text. Lines like '- [ ] milk' or '- milk' become a checklist; a short first line becomes the title.
  • labels List every label in use with how many active notes carry it.
  • rename_label Rename a label on every note (merge into an existing label if the new name is already used).
  • duplicate Make a copy of a note (same text, checklist, colour, labels and images; not pinned, no reminder).
  • delete_label Remove a label from every note (the notes stay).
  • attach_image Attach an image to a note (or start a new image note when note_id is empty). Send the image as base64; JPEG, PNG, WebP or GIF up to 5 MB.
  • import_keep Import notes from a Google Takeout export of Keep. Pass the parsed JSON objects of the .json files (one per note). Trashed notes are skipped; notes already imported are skipped.
  • empty_trash Permanently delete every note in the trash. Cannot be undone.

Tasks /tasks

A to-do list you can type into like a sentence and Claude can work through.

/tasks/tasks A to-do. Completing a repeating task moves it to its next date instead of closing it.
title*stringTask
notestextNotes
duedateDue
liststringList
prioritynone | low | medium | highPriority
statusopen | doneStatus
recurrencenone | daily | weekdays | weekly | monthly | yearlyRepeats
subtaskslist of {text, done}Subtasks
tagstagsTags
done_atdatetime · read-only
overduebool · read-only
due_inint · read-onlyDays until due (negative when overdue)
subtasks_doneint · read-only
Settings: default_list (string)show_overdue_in_today (bool)upcoming_days (int)
Actions:
  • quick_add Create a task from a sentence: 'pay rent friday #home !high every month'. Understands today, tomorrow, weekdays, 'in N days', 'next week', YYYY-MM-DD, DD/MM, #list, !high/!medium/!low and every day/weekday/week/month/year.
  • complete Mark a task done (repeating tasks move to their next date). Set done=false to reopen.
  • lists Every list with its number of open tasks.

Later /later

A read-later shelf you fill from the share sheet and Claude empties.

/later/links A saved web page.
url*urlURL
titlestringTitle. Filled in from the page when left empty
notetextNote
tagstagsTags
statusunread | read | archivedStatus
favoriteboolFavourite
read_atdatetime · read-only
sitestring · read-onlyHost name of the URL
Settings: fetch_titles (bool)open_marks_read (bool)
Actions:
  • surprise Pick one random unread link, optionally within a tag.

Habits /habits

Tap once a day. Watch the streak. Let Claude keep you honest.

/habits/habits Something to do every day or a few times a week.
name*stringName
emojistringEmoji
target_per_weekintTimes per week
colorteal | amber | rose | sky | violet | lime | slateColour
archivedboolArchived
done_todaybool · read-only
this_weekint · read-onlyCheck-ins this week
streakint · read-only
streak_unitstring · read-onlydays or weeks
recenttags · read-onlyDates checked in over the last 84 days
/habits/checkins One habit done on one day. At most one per habit per day.
habit_id*id of habitsHabit
datedateDay. Defaults to today
notestringNote
Settings: week_starts (monday | sunday)show_in_today (bool)
Actions:
  • check_in Mark a habit done for a day (default today). Set done=false to undo. Idempotent.

Journal /journal

One line a day, a mood and an energy score. Claude spots the patterns.

/journal/entries One journal entry per day (date is unique).
datedateDay. Defaults to today; one entry per day
moodintMood (1–5)
energyintEnergy (1–5)
texttextEntry
promptstringPrompt answered
tagstagsTags
Settings: prompts (tags)nudge_after_hour (int)
Actions:
  • today Today's entry (or null) and today's prompt.
  • upsert_day Create or update the entry for a day (default today). Text is appended when append=true.
  • stats Average mood and energy, the daily series, entry streak and tag counts over the last N days (default 30).

Renewals /renewals

Every ID, policy and contract that expires, with the day you must act.

/renewals/items Something that expires or renews on a date.
name*stringName
categoryid | insurance | vehicle | property | contract | subscription | domain | health | tax | otherCategory
due_date*dateDue / expiry date
notice_daysintNotice (days). Act this many days before the due date
recurrencenone | monthly | quarterly | yearly | every_2_years | every_3_years | every_5_years | every_10_yearsRepeats
auto_renewsboolRenews automatically
statusactive | doneStatus
referencestringReference / policy no.
notestextNotes
linkurlLink
act_bydate · read-onlydue_date minus notice_days
days_leftint · read-onlyDays until due_date (negative when overdue)
stateoverdue | act_now | upcoming | ok | done · read-only
Settings: default_notice_days (int)upcoming_window_days (int)
Actions:
  • renew Mark an item as renewed: moves due_date forward by its recurrence (or to new_due_date). Items that don't repeat become done.

Subs /subs

What you pay for every month, in one honest number.

/subs/subs A recurring charge.
name*stringName
amount*numberAmount
currencystringCurrency
cycleweekly | monthly | quarterly | yearlyBilled
next_chargedateNext charge
categorysoftware | media | utilities | finance | health | home | transport | learning | otherCategory
statusactive | trial | paused | cancelledStatus
payment_methodstringPaid with
cancel_urlurlCancel link
notestextNotes
monthly_costnumber · read-onlyamount per month in its own currency
yearly_costnumber · read-only
monthly_cost_basenumber · read-onlyper month in the base currency (null if no FX rate set); 0 when paused/cancelled
days_to_chargeint · read-only
Settings: base_currency (string)fx_rates (json)warn_days (int)
Actions:
  • summary Totals per month and per year in the base currency, by category, plus subscriptions missing an FX rate.
  • roll_forward Move every next_charge date that is in the past forward by its cycle. Runs daily on its own.

People /people

A light personal CRM: who to call, when you last did, and what you talked about.

/people/people Someone you want to stay in touch with.
name*stringName
emailemailEmail
phonestringPhone
companystringCompany
rolestringRole
tagstagsTags
cadence_daysintCatch up every (days). 0 = no rhythm
last_contactdateLast contact
birthdaydateBirthday. Year is ignored; use 1900 if unknown
notestextNotes
pinnedboolPinned
next_followupdate · read-only
duebool · read-onlynext_followup is today or earlier
days_since_contactint · read-only
next_birthdaydate · read-only
days_to_birthdayint · read-only
/people/touches A moment you were in contact with someone. Updates the person's last_contact.
person_id*id of peoplePerson
datedateDay. Defaults to today
channelcall | whatsapp | message | email | meeting | otherHow
notetextNote
Settings: default_cadence_days (int)birthday_notice_days (int)
Actions:
  • log_touch Record that you were in touch with someone (default today).
  • due People due for a catch-up, most overdue first.

Forms /forms

Waitlists and contact forms that work on any site, with no backend.

/forms/forms A form with a hosted page at /f/{id} and a public endpoint at /api/public/forms/{id}.
name*stringName
introtextIntro text. Shown above the hosted form
fieldslist of {name, label, type, required, options}Fields
button_labelstringButton label
success_messagestringThank-you message
redirect_urlurlRedirect after submit. Optional; otherwise the thank-you message is shown
allowed_originstagsAllowed sites. Origins allowed to POST from the browser, e.g. https://example.com. Empty = any
activeboolAccepting submissions
public_urlurl · read-only
post_urlurl · read-only
submissionsint · read-only
new_submissionsint · read-only
last_submission_atdatetime · read-only
/forms/submissions One response to a form. Created by the public endpoint; you can triage, edit or delete them.
form_id*id of formsForm
data*jsonAnswers
statusnew | done | spamStatus
notetextYour note
Settings: show_in_today (bool)honeypot (bool)
Actions:
  • export_csv All submissions of a form as CSV text (semicolon-safe, UTF-8).
  • mark_all Set the status of every submission of a form that currently has from_status.

Short /short

Short links on a domain you trust, with honest click counts.

/short/links A slug that redirects to a URL at /s/{slug}. Slugs are unique across the service.
slugstringSlug. Leave empty for a random one
url*urlDestination URL
titlestringTitle
tagstagsTags
activeboolActive
expires_atdatetimeExpires
clicksint · read-only
last_click_atdatetime · read-only
short_urlurl · read-only
Settings: slug_length (int)permanent_redirects (bool)
Actions:
  • stats Total clicks and the most-clicked links.

Account settings /me

timezone (string)locale (en-GB | en-US | es-ES | ca-ES)