Changelog
Live

Tags now remember when they were added

Tag history on contacts, tasks and assets, so time in stage is something you can read straight from the API. Plus tag filters that match any or all, a new endpoint for asset tags, task filtering by external id, and a set of fixes.

Tags are how work is labeled in NOAN: the stage a deal is in, the agent a task is for, the kind of thing an asset is. From today the API records when each tag was added, keeps what is already on a record when you replace the rest, and lets you filter by tags precisely. The full reference is at api.getnoan.com/docs.

Tags say when they were added

Every tag on a contact, task or asset now carries the moment it went on. That is the piece that turns a label into a measurement: how long a deal has sat in Proposal, how long a lead waited before anyone called, how long a task has carried a needs-human tag. Time in stage, from the same tags your team and your agents already use, with no separate pipeline tool to keep in step.

Replacing tags keeps the ones already there

Replacing tags, assignees or linked contacts no longer clears the list and writes it again. The entries already on the record stay exactly as they are, and only the difference is applied. Their timestamps survive, so the history above stays true even when an agent updates the same record every day.

An asset's tags in one call

PUT /assets/{assetId}/tags replaces an asset's tags, the way tasks already work. Anything your agents produce can be filed and refiled without touching the rest of the asset.

Filter contacts by tag, matching any or all

Contacts can be filtered by tag, matching any of the tags you name or all of them. all follows the same logic as the app, so a list you build in the app and a list you pull over the API agree.

Filter tasks by external id, and know when a filter is wrong

GET /tasks filters by external_id, so a system that created a task can find it again by its own reference. Unknown query parameters are now rejected instead of quietly ignored, so a typo in a filter fails loudly rather than returning everything.

List filters take repeated or comma separated values

Pass a filter more than once or separate the values with commas. Both forms work on list endpoints, so whatever your client library does with arrays, the request means what you expect.

Blocks say where they live

GET /blocks returns the stack's title and whether the stack is managed, so a tool reading your fact layer can show where a block sits and know before it writes whether the stack accepts new blocks.

Fact approval, on the fact endpoints

The fact endpoints now expose approval, so anything reading a fact over the API can see whether a person has verified it rather than assuming. That difference is the whole point of a fact layer: an agent can decline to quote what nobody has verified, an app can show what stands behind a number, and a site can render only what has been signed off.

Clearer errors

A tag id that does not exist returns a 404 naming the tag it could not find, instead of a 500.

Fixed

A partial update to a contact could leave that contact unfindable by email, phone or notes afterwards. Searches now keep working after any update.

Together these make the API safer to run agents against every day: they can label and relabel records without destroying history, filter for exactly the records they mean, and fail loudly when a query is wrong.