Snipget.ai

Releases

What's new in the Snipget API: new utilities, verticals, and platform improvements, newest first.

  1. Tell us whether support actually solved it

    A follow-up to today's support release. After we answer a support request, you can now say whether the answer solved your issue and close the request yourself. Your feedback goes straight into how we measure our own support, so telling us an answer missed is genuinely useful.

    • When a request has an answer from us, the thread offers a simple choice: solved or didn't solve. Choosing solved lets you close the request in one step. Choosing didn't solve gives you a box to tell us what's still wrong, which reopens the conversation and puts it back in our queue; you can also just close it anyway if you'd rather move on.
    • Requests we marked resolved can be rated too. If we closed your request and the answer didn't actually hold up, saying so takes one click, and replying at any time reopens the request.
    • Your team sees the outcome on each request in the portal, and we track solved and unsolved outcomes on our side so unsolved closes get reviewed instead of counted as finished business.
  2. Support conversations in the customer portal

    Your dashboard now has a Support area. Open a request from inside the portal, on any plan, and the whole conversation stays there: our replies appear in the thread, you can respond, and you can see the status of every request your team has open. Email is only used to let you know something happened, never to carry the conversation.

    • A new Support page in the portal lets you open a request with a category (general question, billing, tool question, bug report, feature request, or sales). Tool questions and bug reports can name the exact tools involved and attach recent calls from your own usage history, which shares only call metadata (which tool, when, and the outcome), never the data you sent. The more of that you attach, the faster we can pin down what happened.
    • Conversations persist and stay honest. Everyone on your team can see your organization's requests, reply notifications go only to the person who asked, and a resolved request reopens itself the moment you reply to it, so nothing gets closed out from under you.
    • Messages sent through the public contact form can now receive direct email replies from us, with a reference code in the subject line so follow-ups stay connected to the original message.
    • Behind the scenes, support requests are wired into our internal monitoring with priority ordering, so new requests get noticed and answered quickly, and every support action our side takes leaves an audit trail.
  3. Size-stable batch summaries across the entire catalog

    One consistency release that finishes what the last one started. The previous release made nine validate-batch summaries keep their full key set on an empty batch; this one extends the same guarantee to every batch tool in the catalog, and adds a whole-catalog test so the inconsistency cannot come back.

    • Calling any batch tool with an empty list on the MCP surface now returns the same summary shape as a populated call. Tools whose summaries carry derived counts (valid and invalid, matched and unmatched, format_valid and format_invalid) report them as zeros instead of dropping the keys. This covers 73 tools across addresses, biotech, chemistry, money, dates, JSON, encoding, hashing, networking, numbers, text, timezones, units, and URLs, so code that reads a summary count never breaks on the empty path. Populated batches are byte-identical to before.
    • A new whole-catalog invariant test walks every batch tool and derives its expected empty-batch summary from its own populated behavior, so a future tool cannot ship with the old inconsistency. REST behavior is unchanged: REST batch endpoints require at least one item, so the empty path only exists on the MCP surface.
  4. Empty batches keep their full summaries, corrected state-normalize docs, and around-the-clock operational monitoring

    A small consistency release plus an investment in how we watch the service. Validation batch summaries now keep their complete key set even when the batch is empty, one tool description that promised the wrong field names tells the truth, and a new internal operations surface lets our monitoring keep continuous watch on signups, support messages, and system health.

    • Validating an empty batch now returns the same summary shape as a non-empty one. Across the whole validate-batch family (genes, proteins, CAS numbers, SMILES strings, cron expressions, dates, JSON, IP and MAC addresses), the summary carries its full documented counts, zeroed, on the MCP surface where empty batches are accepted, so code that reads a count never breaks on the empty path.
    • jurisdictions_state_normalize's description now names the fields the response actually returns, iso_code and type, instead of two names that never existed. The behavior is unchanged; the docs were wrong.
    • Behind the scenes, a new internal operations surface gives our monitoring continuous visibility into waitlist signups, unanswered support messages, and system issues, with every operator action leaving an audit trail. It is not part of the public catalog and changes nothing about the tools you call; you should simply see issues get noticed and handled faster.
  5. Richer failure detail on identifiers, complete batch summaries, and smarter catalog suggestions

    A follow-up polish pass from the latest full-catalog test sweep. Identifier checks that fail now show you what did parse, batch summaries spell out every documented count, mistyped tool names get similarity-ranked suggestions, and a well-formed clinical trial ID that simply doesn't exist is a confident not-found instead of an upstream error.

    • Identifier validators now follow one two-shape rule. An input that parses cleanly but fails its check digit (a Luhn number, IBAN, ISBN, CUSIP, ISSN, UPC, or ABA routing number) returns the positional fields the parser extracted, like an IBAN's country and BBAN, so you can see exactly what almost validated; an input too malformed to parse stays uniformly bare. A failed ISSN also reports its normalized form with the standard hyphen now.
    • Batch summaries carry their full documented key set on both the REST and MCP surfaces. DEA validation summaries always include the format-check pair, NPI lookup summaries count valid and invalid explicitly (and during a registry outage, unreachable items are counted as errors rather than silently folded into invalid), gene and protein lookups report found and not_found, and deduplicating an empty list still reports its unique_count.
    • Mistyping a tool name in catalog_describe now earns suggestions ranked by similarity to what you typed; 'biotech_trial_lokup' suggests biotech_trial_lookup first, with prefix matching only as a fallback.
    • encoding_jwt_decode failures name the offending segment. why_invalid now says whether the header, payload, or signature is the problem instead of a generic malformed-token message.
    • Looking up a well-formed clinical trial ID that doesn't exist, like NCT00000000, now returns a confident not-found at the standard lookup cost instead of reporting an upstream service error at no cost; genuine registry outages still report as outages. And validating an empty gene symbol now reports zero confidence, keeping full confidence for real verdicts.
  6. Hints that fully resolve, complete responses on every path, and honest empty answers

    A consistency pass from the latest full-catalog test sweep. Resolving an ambiguous timezone abbreviation or currency symbol with a country hint now returns a genuinely unambiguous answer, edge-case responses carry the same fields as their happy paths, and a valid-but-empty answer is no longer confusable with an unrecognized input.

    • A country hint that resolves an ambiguous input is now treated as resolved. timezones_abbreviation_resolve and money_currency_symbol_resolve used to answer a hinted call with the right pick but still flag it ambiguous and echo every candidate; both now return is_ambiguous false with the candidate list narrowed to the zones or currencies matching your hint, chosen entry first, at full confidence. Unhinted calls still refuse to guess and hand back the full candidate list.
    • Responses keep the same shape on every path. A family of tools dropped result keys on their edge paths that their success paths carry (empty acronym expansions, checksum validity flags, per-item confidence in name-cleaning batches, empty-batch summaries in the semver family, and more); degenerate inputs now return the complete documented key set, and batch summaries carry their full counts regardless of item count.
    • jurisdictions_children now tells 'this code has no children' apart from 'this code is not recognized'. A known childless jurisdiction, like a US state, returns a confident empty list at full confidence; an unknown code returns is_valid false with a reason.
    • urls_platform_classify no longer accepts a bare word as a URL. Scheme-less input still works for pasted domains like twitter.com/jack, but the host must contain a dot; a word like 'not-a-url' is rejected with a reason instead of being reported as a valid unknown site. Add a scheme explicitly if you really mean a single-label host.
    • Documentation catch-ups: credential parsing docs now explain that fuzzy matching deliberately never applies to a leading name segment, so names are never misread as credentials; and the Markdown-to-text docs say precisely what happens to lists (markers are normalized to '- ' bullets, not stripped).
  7. Batch limits that are actually enforced, stricter receipt handling, and smarter typo suggestions

    A hardening pass from the latest full-catalog test sweep. Every batch tool's documented item limit is now advertised in its schema and enforced up front, the include_receipt flag is validated like any real parameter, and a handful of edge responses got more consistent.

    • Batch item limits are real now. Every batch tool advertises its documented cap as maxItems in its input schema, and an oversize batch is rejected before any per-item work or upstream lookups run, as a standard INVALID_REQUEST naming the limit, at no cost. Previously the caps lived only in the descriptions. A few large list inputs outside the batch family (matching candidates and deduplication items at 10,000, statistics values at 100,000) carry the same advertised bounds, and jurisdiction list batches accept the same five types on both the REST and MCP surfaces.
    • include_receipt is validated like its sibling include_trace: boolean-ish strings such as 'true' or 'yes' engage the receipt, a value that doesn't parse as a boolean is rejected clearly instead of silently producing no receipt, and tools that don't offer receipts (the HMAC pair and the catalog/status meta-tools) reject the flag exactly as their schemas advertise.
    • Unknown-parameter suggestions got pickier. A plausible but wrong name like 'extra' no longer earns a misleading "did you mean 'include_trace'?" suggestion; suggestions now appear only for close typos like 'txet' or 'seperator', where they are almost always right.
    • matching_best_match echoes your query in every response shape, including when the candidate list is empty; before, that one shape returned query: null even though a query was supplied.
    • names_cert_board_clean keeps recognized certifying-board acronyms in caps when they appear inside a phrase, so 'Diplomate, ABPN' stays ABPN instead of becoming 'Abpn'. The list is curated (ABMS and its member boards, common osteopathic boards, and the major nursing, PA, and midwifery certifying bodies), so ordinary words are never promoted to acronyms.
    • Small consistency fixes: masking an empty value with identifiers_ssn_redact returns the standard fully-masked placeholder like every other non-SSN input, and invalid cron expressions report a single curated reason ('not a valid cron expression') across validate, describe, and next-occurrence enumeration.
  8. Real Quartz cron support, honest US-only addresses, and country names that just work

    A sixteen-item polish pass across the catalog. Quartz cron strings parse the way Quartz means them, DEA numbers report their registrant type per current DEA guidance, 'USA' and 'UK' finally resolve, non-US addresses are refused honestly instead of silently mangled, and hyphenated company names keep their shape.

    • Cron: real Quartz support. The '?' day token is accepted, Quartz strings parse seconds-first with Quartz's own weekday numbering (1=Sunday — '0 0 12 ? * 2-6' means Monday through Friday, and weekday 7 is a valid Saturday), and a year-bounded schedule that runs out of occurrences ends cleanly with an exhausted flag instead of an internal error.
    • DEA validation now reports registrant_type derived from the number's first letter per current DEA guidance — including modern F- and G-series practitioner numbers, which the commonly circulated legacy table mislabels as distributors and researchers. Both DEA and NPI validators explain failures with the standard why_invalid field.
    • Jurisdictions: 'USA', 'UK', 'United States of America', 'Czechia', 'South Korea', and some thirty other common country variants resolve at full confidence with matched_by: alias — they were all misses before, despite full names being accepted.
    • Addresses: the standardizer is US-only and now says so — a postal code that isn't a ZIP or ZIP+4 (like Canada's 'K1A 0B1') returns is_valid: false with a clear reason instead of being silently truncated at full confidence. Batch summaries count valid/invalid addresses.
    • Names: intra-word hyphens keep their shape and casing — 'WAL-MART PHARMACY' cleans to 'Wal-Mart Pharmacy', not 'Wal - Mart' — and the Dutch surname particles den, ten, ter, and op now lowercase mid-name like van and von always did ('Pieter den Haag').
    • Trial and protein validation: exists is null whenever the registry or reference set was never consulted (a malformed id), and false only as a confirmed negative — a format typo no longer reads as 'this trial doesn't exist'. Chemistry synonym lookups pick a real name for canonical_name, never a CAS registry number.
    • Dates: business-day results count only the holidays that fell inside the computed range, timezone conversion reports the source offset actually used (an input carrying its own offset is no longer echoed as whatever from_tz you passed), and seconds-bearing UTC offsets render correctly.
    • Docs: the FAQ now explains the edge 403 that greets an empty or default-urllib User-Agent, with the one-line fix.
  9. Every mistake gets a real answer: structured errors everywhere, and misspelled parameters are caught

    A hardening pass on how Snipget says no. Malformed calls, unknown tools, denials, and crashes all return the standard response envelope now — no more raw validation text — and misspelled parameters are rejected with a did-you-mean instead of being silently ignored on a billed call.

    • Fixed: calling an MCP tool with a wrong-typed or missing argument returned raw validation text — no error code to branch on, no request ID to quote. It now returns the standard envelope: INVALID_REQUEST with a details list naming each problem field, exactly matching the REST API's 422 shape. Never billed.
    • Fixed: when Snipget denied a call over MCP — maintenance, rate limit, monthly quota, or an exhausted allowance — the denial envelope itself was lost in transit and agents saw a cryptic 'Output validation error' instead. Denials now arrive intact, so a throttled agent sees the error code, the retry_after_seconds hint, and a request ID.
    • Misspelled and unknown parameters are rejected instead of silently ignored. Previously a plausible-but-wrong name (names_format called with first_name instead of first) was dropped without a word and the call billed as if the parameter had worked. Both the REST API and MCP now return an unbilled INVALID_REQUEST naming every unknown key, and MCP adds a suggestion: sending txet says "did you mean 'text'?".
    • Every schema now declares the exact parameter contract (additionalProperties: false) — on the MCP tool list, in catalog_describe, and across all published REST request schemas — so agents can read up front that unknown keys are rejected rather than discovering it by trial.
    • Calling a tool name that doesn't exist returns UNKNOWN_TOOL with the closest real names ranked by similarity — the typo text_slug_slugfy suggests text_slug_slugify first — plus a pointer to catalog_search_semantic.
    • In the rare case a tool crashes, the response is now a clean INTERNAL_ERROR envelope whose request_id matches our internal failure record exactly — quote it to support. The crash detail goes to our logs, never into your context window.
  10. One bad item never takes down a batch, and summaries count what failed

    Reliability and honesty fixes from our latest full-surface test run. An empty jurisdiction lookup no longer crashes the call (or the batch around it), batch summaries count rejected items instead of hiding them, ambiguous timezone abbreviations stop scoring like certain ones, and company-name cleaning keeps LLC looking like LLC.

    • Fixed: asking for the child jurisdictions of an empty or missing parent code returned a raw validation error instead of a result — and inside a batch, one empty item took down the whole call. It now returns a clean zero-children verdict at zero confidence, and the other items in the batch are untouched.
    • Batch summaries now report an errors count whenever any item was rejected (wrong type, missing field, upstream outage), so a partially-failed batch is visible from the summary alone. Data verdicts are never miscounted: an 'invalid JSON' answer from the JSON validator is the tool doing its job, not an error.
    • Batch summaries also gained valid/invalid counts for version comparison, version-range checks, and currency formatting, matching the rest of the validation family.
    • Company-name cleaning keeps entity suffixes in their conventional casing: 'ACME HOLDINGS LLC' now cleans to 'Acme Holdings LLC', not 'Acme Holdings Llc'. The same holds for PLLC, LLP, LP, PLC, PC, and PA, while Inc, Corp, Co, and Ltd stay title-cased as convention writes them.
    • Timezones: normalizing an ambiguous abbreviation like 'EST' (US Eastern or Australian Eastern?) without a country_hint now scores 0.5 instead of full confidence on a silent default pick; pass a resolving country_hint and the answer is back to 1.0. The strict abbreviation resolver now also scores a hint-resolved answer at full confidence.
    • Email canonicalization folds googlemail.com into gmail.com (Google documents them as the same mailbox), with a domain_alias entry in rules_applied. Other look-alike provider pairs (hotmail/outlook, yahoo/ymail) are deliberately not merged: they are separate registrations.
    • Number extraction keeps a leading plus sign: '+3.5' now extracts with its sign, matching how minus already worked.
    • Docs: acronym expansion documents all four supported industries (healthcare, IT, legal, general), scheme-less URLs like 'twitter.com/jack' are documented as accepted by design in platform classification, and the language normalizer's coverage is stated honestly as the 184 languages with two-letter codes.
  11. Dates that disagree with themselves get flagged, and redaction no-ops are never silent

    The last accuracy items from our latest full-surface test run. Date parsing flags self-contradictory and placeholder-heavy inputs, the phone and card maskers signal when there was nothing to mask, and identifier classification recognizes space-separated SSNs, ITINs, and EINs.

    • Date parsing: a weekday that contradicts the date it accompanies is now flagged — 'Sunday, June 15, 2024' is actually a Saturday, so the result carries weekday_conflict: true at reduced confidence instead of silently reporting a different weekday than you wrote. The explicit date always wins; the disagreement is just never hidden.
    • Date parsing: an input with no day of month ('3pm', 'June 2024', '2024') fills the missing pieces with documented placeholder values — that fill is now capped at confidence 0.7, so a fabricated day never scores like a real parse. A missing year alone ('March 5') is the normal way people write dates and keeps full parse confidence.
    • Redaction: the phone and credit-card maskers now tell you when the input had no digits to mask. The value still passes through unchanged (a digit masker with no digits has nothing to do), but the result carries phone_shaped / card_shaped: false at reduced confidence — matching the email and SSN maskers — so a bulk redaction job can catch values that were never phone or card numbers.
    • Identifiers: classification now recognizes space-separated SSNs ('123 45 6789'), ITINs, and EINs at slightly reduced confidence versus the dashed forms, with structural guards so phone-number spacing is never mistaken for a tax ID.
    • Token generation now echoes the alphabet it drew from on every charset, matching the nanoid generator.
    • Docs: json_path's found: false is documented as a confident negative (the document was fully walked, so 'not there' scores full confidence), and the language normalizer's misspelling support is documented as a curated list rather than fuzzy matching.
  12. URL tools validate what they touch, and number parsing tells you when it loses precision

    Two cross-tool consistency upgrades. Every URL tool now agrees on what counts as a URL, and the loose number parsers coerce consistently and flag lossy conversions instead of hiding them.

    • URLs: all five URL tools (validate, normalize, parse, query-edit, platform-classify) now share one RFC 3986 authority check, so text like 'ftp://bad url' is rejected everywhere instead of being silently treated as a URL by some tools and rejected by others. Internationalized domain names like bücher.de remain fully supported.
    • URL query editing now validates its input: editing the query string of something that is not a URL returns a clear invalid-input verdict instead of pretending to succeed.
    • URL percent-decoding is strict: a '%' not followed by two hex digits is rejected with an explanation (a literal percent belongs in a URL as '%25') rather than passed through unchanged at full confidence.
    • Number parsing: numeric strings now coerce to booleans the same way native numbers do ('5' means true, '0.0' means false), matching the documentation.
    • Integer parsing flags lossy coercions: '12.7' still parses to 12, but the result now carries truncated: true at reduced confidence, and batch summaries count truncations, so a bulk import can spot silently-rounded values.
    • Fixed: sending the non-standard JSON literals NaN or Infinity to the integer parser returned an internal error; all three parsers now treat non-finite values as a clean could-not-parse verdict.
  13. Honest answers everywhere: date parsing stops guessing, batch errors explain themselves

    A catalog-wide accuracy pass from our latest full-surface test run. Sixteen fixes across dates, chemistry, biotech, identifiers, names, numbers, hashing, and encoding, focused on one theme: when a tool cannot answer confidently, it now says so clearly instead of returning something that merely looks right.

    • Date parsing: relative expressions like 'next tuesday' or 'Friday June 2024' are now rejected with a clear explanation. The parser reads no clock, so it has no anchor to resolve them against; previously they returned a fabricated date at moderate confidence.
    • Batch calls: when an individual item is rejected, the entry now carries the same why_invalid explanation the single-value tool gives, across every batch tool in the catalog. Batch summaries also gained validity counts for the gene, protein, trial, DEA, CAS, and taxonomy-hierarchy tools.
    • Chemistry: exact-mass batch items accept chemical_formula, matching the single tool, and hazard classification no longer repeats the same GHS hazard statement once per data source.
    • Redaction: email and SSN masking now return an explicit email_shaped / ssn_shaped verdict, so bulk callers can tell 'masked a real value' from 'input was not the expected shape' without decoding confidence scores.
    • Identifiers: hyphenated ISBNs now classify correctly, with guards so phone-number-shaped input is never mistaken for an ISBN.
    • Also fixed: number spelling supports quadrillions as documented, nickname lookups only flag genuine ambiguity, confident negative answers score full confidence, the checksum docs list all 14 supported algorithms, and malformed-JWT errors read cleanly instead of exposing library internals.
  14. Get started faster: your first API key is created for you, plus a real usage analytics page

    Two portal upgrades. New accounts get their first API key created automatically and shown once on the dashboard, next to copyable MCP connector links, SDK pointers, and a quick-start tour. The usage page grows a time-range picker, month-over-month trends, and charts.

    • Dashboard: your first sign-in creates a Default API key automatically and shows it exactly once, with copy-to-clipboard. A get-started card carries the MCP connector URLs (full catalog, starter pack, and your custom pack), the REST API reference, and links to the Python and JavaScript SDKs. A quick-start tour opens on first visit and can be reopened anytime.
    • Usage page: pick the window you care about — the last 15 minutes up to 12 months, your current or previous billing cycle, or a custom date range — and see calls, cost units, and error rate for exactly that window, plus a per-endpoint breakdown.
    • Usage charts: calls over time and error rate over time at minute, hour, day, week, or month granularity, a 12-month monthly view, and a month-over-month comparison of this month to date against the same days of last month.
    • Fixed: a malformed date filter on the usage endpoints now returns a clear invalid-input error instead of an internal error.
  15. URL tools handle malformed addresses gracefully, plus two healthcare parsing fixes

    Three fixes from a full-catalog verification run. The URL tools now answer malformed web addresses with a normal is_valid: false result instead of an internal error, and two healthcare text cleaners stop losing or mangling tokens on messy roster input.

    • URL parsing, normalization, validation, and query editing: a malformed address (such as a broken IPv6 host like 'https://[oops') now returns a normal answer with is_valid: false and a why_invalid reason, on single and batch calls alike. Previously it surfaced as an internal error, and one bad address could fail a whole batch.
    • Credential parsing: an undelimited name ending in a hyphenated credential ('Jane Doe APRN-CNP') now returns every recognized credential and routes the name words to the unknown list. Previously parts of the input could silently disappear from the result.
    • Certification-board cleanup: a trailing board acronym in parentheses is removed regardless of how it was capitalized — '(abim)' is treated the same as '(ABIM)'. A value that is only a parenthesized acronym now unwraps to the acronym itself instead of coming back empty.
  16. Chemistry SMILES fields restored, plus a catalog-wide accuracy sweep

    A cleanup pass over eight small correctness issues found in this week's full-catalog test run. Chemistry lookups return canonical SMILES again after an upstream data-source rename, date parsing reports honest confidence, and several tools stop overstating what they did.

    • Chemistry: compound lookup and SMILES validation return canonical_smiles and isomeric_smiles again. PubChem renamed these properties upstream, which had silently dropped the fields from every result.
    • Cron descriptions: the locale parameter is now honest — descriptions are English-only, and any other locale is a free INVALID_INPUT error instead of a billed English answer that echoed your locale back.
    • Date parsing: confidence reflects the input format. An ISO date like 2024-03-04 or a written month like 'March 5, 2024' is no longer flagged ambiguous at reduced confidence; only genuinely swappable digit-order dates like 03/04/2024 are.
    • Slug generation: a zero or negative max_length is a free INVALID_INPUT error instead of silently truncating the slug from the wrong end.
    • SSN redaction: input that is not a nine-digit SSN still comes back fully masked, but now at reduced confidence (0.5) so you can tell a real redaction from a blanket mask — matching email redaction.
    • Area-code lookup: toll-free codes like 800 report full confidence alongside is_toll_free, instead of confidence 0 next to a valid answer.
    • Acronyms: executive titles are in the catalog — CEO, CFO, COO, CTO, CIO, CMO, CHRO, CISO, plus healthcare's Chief Medical and Chief Nursing Officer — resolvable in both directions.
    • State normalization: unmatched batch items now carry parent_code: null like the jurisdictions tools, so result shapes stay consistent between matched and unmatched rows.
  17. Status page watches the MCP server itself

    The status page's uptime sampler now checks the MCP server's own health endpoint on every pass, so an unresponsive MCP service shows as degraded even while the databases behind it are healthy. Previously that failure mode could read as fully operational.

    • The MCP component on the status page now reflects the MCP server's real ability to answer, not just the health of its backing services; if it stops responding, the uptime history records those samples as degraded.
    • Verified the MCP transport's resilience with a ~50,000-call load replay across four client-disconnect abuse patterns: zero failures, no resource buildup.
  18. One billing rule for the lookup tools too, plus text-cleanup fixes

    The billing rule from yesterday now also covers the healthcare, chemistry, and biotech lookup tools. A mistaken lookup type, an unknown query_type or an unsupported structure input_format, is a free INVALID_INPUT error instead of a billed answer. You are still billed only when a tool actually consults its reference data. Alongside it, three small corrections to the text-cleanup helpers.

    • Drug, compound, gene, protein, and hazard lookups: an unknown query_type now returns a free INVALID_INPUT error before any reference lookup runs, matching the rest of the catalog. An empty or unmatched query still bills normally, because the tool did the work.
    • Structure conversion: an unsupported input_format, including a name or InChIKey (which are reverse lookups), returns a free INVALID_INPUT error that points you to the compound-lookup tool.
    • Emoji normalization: two different emoji sitting next to each other are now counted and replaced as two, not merged into one. Real multi-part sequences such as family emoji, skin tones, and flags still count as one.
    • Number extraction from text: scientific notation like '1e3' is now pulled out as a single number instead of being split into '1' and '3'.
    • Redaction: asking to keep the whole value now always masks at least one character, rather than masking everything or revealing it in full. Redacting something that is not an email address reports lower confidence so you can tell it applied a blanket mask.
  19. Healthcare accuracy + one billing rule everywhere

    Two healthcare fixes and a billing consistency pass. The certification-status and credential-parsing tools no longer produce confident answers from corrupted input: a garbled date or an undelimited name word now yields an honest 'unknown' with the reason, never a fabricated status or board certification. And the billing rule shipped earlier today now holds on every tool in the catalog: a mistaken parameter (an unknown mode, style, algorithm, or an out-of-range count) is a free INVALID_INPUT error. You are only ever billed when a tool actually answers about your data.

    • Certification status from dates: a supplied-but-unparseable date returns status 'unknown' with why_invalid naming the bad field, instead of silently ignoring it and reporting a confident wrong status.
    • Credential parsing: fuzzy typo-matching is confined to explicitly delimited credential lists, so name words in undelimited roster strings ('Jane Doe MD') can no longer be guessed into degrees or board certifications. Measured on 149k real provider strings: exact-set accuracy up 10 points, recall cost under 0.1%.
    • One billing rule everywhere: ~30 tools that billed a verdict for a mistaken parameter now return a free INVALID_INPUT error naming the problem. A bad shared parameter on a batch call errors the whole call at cost 0 instead of billing every item.
    • Batch hardening: a bad per-item parameter (an unknown jurisdiction type, an empty name-components row) is isolated and unbilled while sibling items still answer.
    • Legacy error codes INVALID_STYLE and INVALID_TARGET are now the canonical INVALID_INPUT. One code for one kind of mistake.
  20. Correctness & fairness sweep: honest billing, resilient batches, international text

    A focused reliability pass across the catalog. The headline is billing fairness: when a paid data-lookup tool (NPI, drug, compound, currency, and the rest) rejects your input locally without ever calling its upstream source, the call now costs 1 unit instead of the full 2 — you pay for the work actually done. A tool answering with a verdict (including 'this value is invalid') still bills normally; only a true service failure bills nothing. Alongside that, batch calls are now crash-proof against a single bad item, bad parameters surface as clear errors instead of silently doing the wrong thing, and international text is handled correctly across readability, email extraction, and name matching.

    • Pay for work performed: a locally-rejected input on a paid data-lookup tool bills 1 unit, not 2. Cached and 'not found' answers still bill the full rate — they consulted the source.
    • Resilient batches: one malformed item in a batch (a wrong type, a short pair, an empty separator) no longer fails the whole call — it comes back as a per-item error, unbilled, while every good item is answered.
    • Bad parameters are now honest errors: an unknown query_type, strategy, or a negative limit returns INVALID_INPUT instead of silently falling back to a default or an empty result.
    • International text: readability scores accented English the same as its plain-ASCII form, email extraction now finds SMTPUTF8 and internationalized-domain addresses, and person-name match keys fold accents so 'Renée' and 'Renee' match.
    • Country dial-code lookup returns the principal country first for shared prefixes (+7 is Russia, not Kazakhstan).
    • Provider search by name was retired: the NPI tools now cover validation (by check digit) and lookup/enrichment (by NPI number) — bring the NPI, not a name.
  21. Execution receipts: verify any call after the fact

    Pass include_receipt=true on any utility call (free, like include_trace) and the response carries meta.receipt: the call's own request_id, the exact build that answered, and sha256 hashes over the RFC 8785 (JCS) canonicalization of the arguments you sent (input_hash) and the result (result_hash). Because every utility is deterministic, the same input on the same build reproduces the same result_hash — so a stored receipt lets you, or anyone you hand the response to, re-check later that a given input really produced a given output.

    • Works on both transports: REST as the ?include_receipt=true query parameter (advertised on every utility operation in the OpenAPI spec), MCP as an include_receipt boolean on every tool.
    • Reproduce either hash with any RFC 8785 library: input_hash = sha256(jcs({"tool": <tool name or REST path>, "args": <your args minus include_trace/include_receipt>})); result_hash = sha256(jcs(result)).
    • Batch calls get one receipt covering the whole result (items + summary). Generators (UUID, token, password) still get receipts as output commitments — replay doesn't apply to random output.
    • hashing_hmac is deliberately excluded: a hash over your HMAC key would be a shareable brute-force target.
    • Every MCP response now also carries meta.request_id (previously REST-only) — quote it in support requests; it correlates any response, including rate-limit denials, to its usage record.
  22. Stricter contracts, honest batch summaries, richer confidence

    A live-agent review wave hardened the envelope contract: ambiguous calls that used to silently pick a mode are now rejected with a clear reason, batch summaries always tell the truth, and cert-status normalization reports how it matched. Four new guided workflows join the catalog.

    • BREAKING for callers relying on silent precedence: dates_business_days rejects end together with days; chemistry_molarity rejects mixed input shapes and formula together with molar_mass; chemistry_exact_mass rejects a nonzero charge alongside an adduct. Each returns confidence 0 with a why_invalid reason — pass exactly one mode.
    • healthcare_cert_status_normalize is now two-pass: exact synonym matches return confidence 1.0, keyword matches on messy variants (negation-aware) return 0.8, unmatched returns 0.
    • Batch summaries derive centrally on both transports: total is always present; valid/invalid and matched/unmatched counts appear only when every item carries the boolean, so a partial count can never read as a verdict on the whole batch.
    • Four new guided workflows (workflow_list to browse): clean-contact-list, redact-pii, validate-financial-identifiers, and dedupe-entity-records join clean-healthcare-roster.
    • identifiers_classify is now stamped heuristic (ranked best-effort candidates), matching how it actually behaves.
  23. Full catalog by default; tool packs by URL

    Your MCP connector now advertises the full Snipget catalog by default — modern agents load tools on demand and handle it well. Tool packs (a smaller advertised set for clients that fail past a tool budget, notably ChatGPT) are now opt-in via the connector URL instead of an account-wide default: connect with ?load=custom for the pack you built on the MCP Tools page, or ?load=starter for the curated data-cleanup pack. This replaces the previous behavior where every connection got a curated default pack unless it opted into ?load=all.

    • Plain connector URL (and ?load=all) → all tools. One account can run a full-catalog connector and a pack connector side by side — the URL decides, not the account.
    • ?load=custom → your saved pack (the starter pack until you save one); ?load=starter → the curated ~62-entry cleanup pack, no configuration needed. Copy-paste URLs on the MCP Tools page.
    • On pack connections, catalog and workflow discovery results carry advertised:true|false plus how-to-enable notes, and catalog_list reports advertised_tool_count / advertised_catalog_version so agents compare staleness against their own pack, not the full catalog.
    • The starter pack grew to ~62 advertised entries: dates and timezone cleanup (dates_parse, dates_validate, dates_format, dates_convert_tz, timezones_normalize) plus the exact-comparison tools LLMs famously get wrong (numbers_math_compare, semver_compare).
  24. Choose the MCP tools your agent sees

    Your MCP connector no longer advertises the full 318-tool catalog to every agent — many agent platforms fail outright past a tool budget. Each account now advertises a curated set: pick whole buckets (healthcare, dates, json, …) or individual utilities on the new MCP Tools page in your dashboard, up to 80 advertised tools. Accounts that haven't picked get a sensible cross-industry default set. Selection changes apply the next time your agent connects — most clients cache the tool list, so in ChatGPT remove and re-add the connector.

    • New portal page: MCP Tools — tick buckets (they grow automatically as the catalog grows) or individual utilities, with a live n/80 counter. Batch variants count toward the 80.
    • The discovery tools (catalog_list, catalog_search_semantic, catalog_describe, workflow_list, workflow_describe, service_status) are always advertised and don't count against your limit — an agent can always find and call any tool in the catalog by name, even ones not in your advertised set.
    • Full-catalog escape for clients that handle large tool sets (e.g. Claude with Tool Search): configure the connector URL as https://mcp.snipget.ai/mcp?load=all.
    • No preference set yet? You get the curated default: ~20 everyday validation, normalization, parsing, and redaction utilities plus their batch variants.
  25. One clean naming scheme for every tool (breaking)

    Every utility now carries a subject-first name that matches its bucket, its REST path, and its docs page — phone_validate at /v1/phone/validate, dates_parse at /v1/dates/parse. The legacy common_* and tiny_* prefixes and the /v1/common and /v1/tiny paths are gone. This is a breaking rename across the whole catalog: update REST integrations to the new paths, and remove and re-add any connected MCP connector so it picks up the new tool names.

    • All 318 tools renamed to subject_verb (phone_validate, dates_parse, json_flatten, healthcare_npi_lookup) — the name, the REST path, the MCP tool, the docs tag, and the /tools page all agree, so what you discover is what you call.
    • REST paths moved to /v1/<bucket>/... for all 27 buckets; the old /v1/common/* and /v1/tiny/* paths were removed, not aliased.
    • Discovery tools renamed too: catalog_list, catalog_describe, catalog_search_semantic, workflow_list, workflow_describe, and service_status (formerly common_catalog_* / common_workflow_* / common_service_status).
    • Redaction tools moved to their subjects: email_redact, phone_redact, money_credit_card_redact, identifiers_ssn_redact, and text_redact.
    • BREAKING for MCP clients: connectors cache the tool list, so remove and re-add the Snipget connector to see the new names. REST callers: swap paths one-for-one — every tool kept its bucket-qualified name, only the prefix scheme changed.
  26. Browse the catalog: the Tools pages

    A new public Tools section you can browse: every utility on its own page with copy-paste examples, snippets for cURL, JavaScript, Python, the SDKs, and MCP, and a plain-language FAQ. The whole catalog is now organized into one clean set of named, searchable buckets.

    • Browse 165 utilities (300+ endpoints counting batch) at /tools, grouped into Industries and everyday buckets, with instant search.
    • Every tool page has a worked example, single and batch request bodies, snippets in five forms, related tools, and a deep link into the full API reference.
    • Plain-language FAQs on every tool, honest about what each one does and does not do.
    • The catalog is organized on one clean set of named buckets (dates, JSON, identifiers, redaction, and more), reflected in the API reference tags as well.
  27. Everyday developer utilities

    A big horizontal expansion of the common catalog: dates and times, JSON, encoding, URLs and networking, identifier generators, number and unit math, and hashing — all deterministic, all on REST and MCP.

    • Dates and times: parse messy dates, convert timezones, add intervals and business days, diff, and humanize — never reading the wall clock, so results are reproducible.
    • JSON: validate (with the exact error location), minify, prettify, flatten, query by path, diff, and deep-merge.
    • Encoding: base64, URL, HTML-entity, and hex encode/decode, plus JWT decode for inspection (no signature verification).
    • URLs and networking: parse and normalize URLs, edit query strings, validate and classify IPs, CIDR math, and MAC formatting.
    • Generators: UUID (v1/v4/v5/v7), ULID, nanoid, random tokens, and passwords, with a count for many at once.
    • Numbers: base conversion, formatting, spell-out, Roman numerals, exact decimal comparison (no more 0.9 vs 0.11 mistakes), and unit conversion across length, mass, volume, temperature, and more.
    • Hashing: identify a hash by its shape, compute HMACs, an extended checksum set (SHA-3, BLAKE2), and pull emails/URLs/numbers from text.
    • Every utility on both REST and MCP, with single and batch calls.
  28. Agent observability and reliability

    Gave agents a way to check whether Snipget is healthy, told every response which build answered, and fixed the catalog's not-found responses.

    • New common_service_status MCP tool — agents can check overall and per-component (API, MCP, dashboard) status, incidents, and scheduled maintenance before relying on a call.
    • Every response now reports the deployed build in meta.build, so you can tell exactly which build answered.
    • The tool catalog reports live_tool_count and catalog_version, so a connector can detect a stale tool list and re-sync.
    • Fixed the catalog and workflow describe tools so an unknown name returns a clean error with suggestions instead of failing.
  29. Chemistry quantitative pack

    Extended the chemistry vertical with mass-spectrometry masses, solution-prep math, and offline structure conversion — all local, no network needed.

    • Exact mass for mass spectrometry: monoisotopic, average, and nominal mass, plus ion m/z for named LC-MS adducts.
    • Solution calculators: molarity, and normality with an explicit equivalence factor (it never guesses the factor).
    • Offline structure conversion between SMILES and InChI to canonical forms, backed by RDKit.
    • Every utility on both REST and MCP, with single and batch calls.
  30. Biotech pack

    A new biotech vertical for gene, protein, drug, and clinical-trial identity — so agents stop inventing gene symbols, accessions, and NCT numbers.

    • Gene lookup and symbol validation backed by HGNC (44,997 approved human genes) — no network needed.
    • Protein lookup and accession validation backed by UniProt (20,431 reviewed human Swiss-Prot entries) — no network needed.
    • Drug normalization and synonyms backed by RxNorm (Tylenol, acetaminophen, and paracetamol all resolve to one concept).
    • Clinical-trial lookup and NCT validation backed by ClinicalTrials.gov.
    • Every utility on both REST and MCP, with single and batch calls.
  31. Chemistry pack

    A new chemistry vertical for compound data, structure validation, and safety classification — so agents stop inventing CAS numbers and molecular formulas.

    • Compound lookup, synonyms, and SMILES validation backed by PubChem (115M+ compounds, NIH).
    • Local CAS Registry Number validation and molecular weight plus composition from a formula — no network needed.
    • GHS hazard classification (signal word, pictograms, hazard statements) for safety-aware workflows.
    • Every utility on both REST and MCP, with single and batch calls.
  32. API and MCP parity, /v1 versioning, and richer schemas

    Put the REST and MCP surfaces on one stable, versioned contract and made both advertise precise result shapes.

    • Mounted the whole utility surface under a /v1 path prefix, with a long-lived deprecation policy for future versions.
    • Aligned every REST route name to its MCP tool name and added a gate test that fails loudly on any future drift between the two surfaces.
    • Both REST (OpenAPI) and MCP now publish each utility's exact result shape, derived from one shared, typed source of truth.
  33. Agent discoverability

    Made the catalog far easier for AI agents to find the right utility and trust its output.

    • A catalog discovery front door with semantic search over the tool set.
    • Verb-first aliases and human titles so agents match intent, not just exact names.
    • An exact-versus-heuristic signal on every tool, so agents can tell an authoritative result from a best effort one.
    • Guided multi-step workflows exposed over MCP for ChatGPT and Grok.
  34. MCP connector OAuth for ChatGPT and Grok

    Standards-based OAuth 2.1 so hosted agents can connect to the MCP server.

    • OAuth 2.1 authorization for the MCP connector, proven end to end with ChatGPT's developer mode.
  35. Public status page

    A live operational status page for the API, MCP server, and dashboard.

    • Per-component status, 90-day uptime, and a past-incident timeline.
    • Stays reachable during maintenance, with scheduled-maintenance notices.