Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Added "tr_address_parse", "tr_business_days", "tr_iban_olustur" and 9 more (31 tools before, 43 now)
Turkish Address Parser — Splits a free-form Turkish address into neighbourhood, street, building, floor, flat, district, province and postcode. Handles the abbreviation chaos (Mah./Mh., Cd./Cad., Sk./Sok., No:12/5, K:3 D:7), cross-checks the province against the postcode, repairs misspelled district names against a dictionary, and returns a confidence score. Anything it could not place is listed in `unparsed` — nothing is dropped silently. Built for shipping, checkout and CRM systems that receive Turkish addresses typed by humans.
Turkish Business Days — Adds business days or counts them between two dates, accounting for Turkish public and religious holidays including half-day eves. Ramadan and Sacrifice feasts follow the Hijri calendar and cannot be derived reliably by formula, so announced dates are read from a table; years without an official announcement are returned with `confirmed:false` rather than guessed silently. For delivery promises, SLA clocks, payment terms and shipping estimates.
Build Turkish IBAN — Builds a Turkish IBAN from a 5-digit bank code and account number, computing ISO 7064 check digits. A Turkish IBAN is TR + 2 check digits + 5-digit bank code + 1 reserved digit + 16-character account. This pads the account on the left, defaults the reserved digit to 0, computes the mod-97 check digits, and resolves the bank name from the same national table used by IBAN validation when the code is known. Unknown bank codes still produce a structurally valid IBAN with bankName null — existence at the bank is not claimed.
Turkish e-Invoice Builder — Builds a UBL-TR e-Invoice or e-Archive XML document from plain JSON, computing every total and validating the parties. Selling into Türkiye means issuing a UBL-TR document whose element order is fixed by schema and whose totals must agree to the kuruş, or the integrator rejects it. This endpoint takes the invoice as ordinary JSON and returns the XML. Totals you send are ignored on purpose — line amounts, per-rate VAT subtotals and the payable amount are all recomputed here, because a rounding difference of one kuruş is the most common rejection. VKN and TCKN checksums are verified, and the a…
Turkish e-Invoice (UBL-TR) Parser — Turns a UBL-TR e-Invoice or e-Archive XML document into clean JSON: parties, line items, taxes and totals. Works regardless of the namespace prefix the sender used (cbc:, cac:, ns0:), normalises single-line documents into arrays, and reports amount mismatches in `warnings` instead of returning quietly wrong totals. The job that costs accounting and expense software the most engineering time.
Turkish Severance, Notice & Leave — Computes Turkish severance (kıdem), notice (ihbar) and annual-leave entitlement from service dates and the gross wage, using the official ceiling and minimum-wage tables for the given day. Payroll and HR tools in Turkey chase a parameter that changes every January and July: the severance ceiling, the SGK cap, the minimum wage. This endpoint applies the statutory formulae (Labour Law 4857 arts. 17 and 53, former 1475 art. 14) to those tables. The ceiling is applied to the monthly wage, not the total. Stamp tax (0.759%) is deducted from severance; income tax is not — kıdem is exempt. Notice pa…
Amount to Turkish Words — Writes a monetary amount out in Turkish words, the way invoices, cheques and promissory notes require. Applies the rules that trip up generic libraries: Turkish says "bin", never "bir bin"; the kuruş part is read separately; and both "1.234,56" and "1,234.56" are accepted and told apart automatically. A mandatory field on Turkish e-invoices, cheques and notes — with no off-the-shelf API until now.
Turkish Postal Code — Validates a 5-digit Turkish postal code and resolves the province from the first two digits (plate map). PTT postal codes are five digits; the leading pair matches the province plate code for the 81 provinces. This endpoint checks the shape, maps 01–81 to the province name, and returns null with confidence none when the prefix is outside that range — it does not invent a district. District-level resolution needs the full PTT directory and is out of scope here.
Turkish FAST / TR Karekod Payload — Builds a person-to-person TR Karekod (FAST) payment payload from IBAN, name and optional TRY amount. Text only — no PNG. Turkish instant payments (FAST) can start from a TR Karekod that encodes the payee IBAN and name in EMV-style TLV. This builds the person-to-person organisation (payload format indicator 750210): application template with IBAN, payee name, optional 12-digit kuruş amount, optional free-text explanation, and a CRC-16/CCITT-FALSE trailer. The Turkish IBAN is normalised and checked with ISO 7064 mod-97; non-TR IBANs and non-TRY currencies are rejected. This does not send money…
Turkish Service-of-Process Clock — Computes the deemed-received date and the HMK deadline (with holiday shifting) for a Turkish notification, from the date the underlying event actually happened. Turkish notification law (7201) ties the deadline clock to an event that is not "the date on the letter" — for electronic notification the UETS platform reports send, read AND reached dates, and only the reached date starts the clock (art. 7/a: deemed received 5 calendar days after reaching the address, whether or not it was opened). HMK adds two more rules on top: the day of notification itself does not count (art. 92 — the period s…
Turkish ID & Number Validation — Validates Turkish national ID, tax number, IBAN, licence plate, IMEI, barcodes, KEP, MERSİS, postal code and ISBN from one endpoint, with type auto-detection. Goes past a yes/no: resolves the bank behind an IBAN, the province behind a licence plate and the GS1 country prefix behind a barcode. Pure local computation — no upstream service is called, so latency is microseconds and the answer never changes for the same input.
Turkish VAT & Withholding — Splits a Turkish amount into net, VAT and (optionally) withholding: who pays the seller, who remits the withheld VAT. For invoice lines and checkout totals that have to show KDV dahil / hariç and, when the parties are in a withholding (tevkifat) situation, the split between what the buyer pays the seller and what the buyer remits to the tax office. Rates are 0, 1, 10 and 20 percent. Withholding is a fraction of the VAT (2/10 through 10/10), or a named code from the GİB partial-withholding list. The 2026 threshold (TRY 12,000 gross) is reported and compared with the amount, but `applies` is a…
Changed the definition of "pbx_calls_graph", "pbx_dictionary", "pbx_dictionary_add" and 2 more
⟨12 unchanged words⟩ Idle $0. GET /v1/pbx/calls/graph?call_id=…&stuck_at=310. Returns path, path_tr (plainplain-languageTurkishsummary), edges, and raw transfers. Compounding asset ⟨17 unchanged words⟩
⟨15 unchanged words⟩ search + Fact extract. No invented premiums. GET/v1/pbx/dictionary?domain=otel|santral_firmasi|sigorta|finans|enerji|otomotiv|msp|all/v1/pbx/dictionary?domain=hotel|pbx_provider|insurance|finance|energy|automotive|all
Removed "tr_address_parse", "tr_business_days", "tr_iban_olustur" and 9 more; changed the definition of "pbx_facts", "pbx_persons", "pbx_promises_close" and 5 more (43 tools before, 31 now)
⟨30 unchanged words⟩ Scoped by x-temsor-pbx-key. Idle $0. No DID sales.KVKK forgetRight-to-erasure ready. Advanced: own PBX/Asterisk stays on customer.
⟨33 unchanged words⟩ Scoped by x-temsor-pbx-key. Idle $0. No DID sales.KVKK forgetRight-to-erasure ready. Advanced: own PBX/Asterisk stays on customer.
Removed "ai_messages", "bic_validate", "container_validate" and 26 more (72 tools before, 43 now)
AI Messages (preview) — Single-balance access to upstream LLMs; billed per token, no subscription.
SWIFT/BIC Validation — Checks a SWIFT/BIC against ISO 9362 structure (8 or 11 characters), splits bank/country/location/branch, and names well-known institutions. Payment files reject a BIC that is the wrong length or uses a forbidden character in the location code long before they care which bank it is. This checks the ISO 9362 pattern, flags test BICs (a 0 in the location code), and treats XXX as the primary office. A handful of well-known 8-character bank codes resolve to a name; anything else returns bankName null rather than a guess. This is not a lookup in the SWIFT directory. A structurally valid BIC can st…
ISO 6346 Container Number — Validates an ISO 6346 freight-container number: owner code, category letter, serial and check digit. Bills of lading and terminal scans mistype container numbers constantly; the check digit (ISO 6346) catches almost all of those before a customs filing. The fourth letter is the category (U freight, J equipment, Z chassis, R reefer). Owner codes are not resolved to a company — BIC's owner-code register is a separate paid product. A valid number is arithmetically self-consistent, not proof the box exists.
Removed "pbx_enrich" (73 tools before, 72 now)
PBX Enrich (Gemini) — Gemini enrich: transcript → summary + structured promises. Without GEMINI_API_KEY → heuristic only (llm:false). No STT. POST /v1/pbx/enrich {text}. Uses Generative Language API (GEMINI_API_KEY) with gemini-3.6-flash (override GEMINI_MODEL). Heuristic extract always runs alongside. Not a bot rental / live receptionist. Idle $0 when unused. No Chirp / Dialogflow.
Added "pbx_enrich" (72 tools before, 73 now)
PBX Enrich (Gemini) — Gemini enrich: transcript → summary + structured promises. Without GEMINI_API_KEY → heuristic only (llm:false). No STT. POST /v1/pbx/enrich {text}. Uses Generative Language API (GEMINI_API_KEY) with gemini-3.6-flash (override GEMINI_MODEL). Heuristic extract always runs alongside. Not a bot rental / live receptionist. Idle $0 when unused. No Chirp / Dialogflow.
Changed the definition of "pbx_bridge_multi_agent", "pbx_calls_graph", "pbx_events" and 11 more
PBXMulti-Agent Handoff Bridge
Record virtualMulti-agentmulti-agenthandoff bridge intent + sharedmemory hint (openopen-promisepromises).memory. Idle$0,$0.noNo
Added "pbx_orchestra_acts" and "pbx_promises_act"; changed the definition of "pbx_dictionary", "pbx_dictionary_add", "pbx_index_partial" and 4 more (70 tools before, 72 now)
DomainManageddictionarySaaSv1domain dictionary (hotel,E4)PBX—provider,exampleinsurance,packsenergy,thickenfinance,per
Added "pbx_whisper_status"; changed the definition of "pbx_dictionary", "pbx_facts" and "pbx_whisper_suggest" (69 tools before, 70 now)
Domain dictionary v1 (hotel, PBX provider, insurance, energy, finance, automotive) — boosts search + Fact extract; includes pilot aliases. GET/v1/pbx/dictionary?domain=otel|santral_firmasi|sigorta|finans|enerji|msp|all/v1/pbx/dictionary?domain=otel|santral_firmasi|sigorta|finans|enerji|otomotiv|msp|all (msp = legacy alias for santral_firmasi). ⟨18 unchanged words⟩
⟨11 unchanged words⟩ | santral_firmasi | sigorta | finans | enerji | otomotiv (legacy msp) | all","enum":["otel","santral_firmasi","msp","sigorta","finans","enerji","otomotiv","all"],"type":"string"}} ⟨2 unchanged words⟩
Changed the definition of "pbx_dictionary", "pbx_dictionary_add" and "pbx_facts"
Domain dictionary v1 (hotel: room type,AC, check-out;PBXproviders:provider,tariffinsurance,IMEIenergy,refundfinance) — boosts search + Fact extract; includes pilot aliases. GET/v1/pbx/dictionary?domain=otel|santral_firmasi|msp|all/v1/pbx/dictionary?domain=otel|santral_firmasi|sigorta|finans|enerji|msp|all (msp = legacy alias for santral_firmasi). ⟨18 unchanged words⟩
Certificate recorded, valid to 2026-12-03
Authorization not required
First tool surface recorded: 69 tools (server version 1.0.0)
Showing the latest 13 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨6 unchanged words⟩ ":"all","description":"Domain slice:otelhotel |santral_firmasipbx_provider |sigortainsurance |finansfinance |enerjienergy |otomotivautomotive | all (legacymsp)keys|+allmsp accepted)","enum":["otelhotel","santral_firmasipbx_provider","mspinsurance","finance","energy","automotive","otel","santral_firmasi","sigorta","finans","enerji","otomotiv","msp","all"],"type":"string"}} ⟨2 unchanged words⟩
⟨23 unchanged words⟩ premiums. POST /v1/pbx/dictionary/add {term, alias, domain:otel|santral_firmasi|sigorta|finans|enerji|otomotivhotel|pbx_provider|insurance|finance|energy|automotive, scope?:pbx|global}. Managed SaaS compounding (E4 ⟨8 unchanged words⟩ invented premiums/prices. Idle $0, no LLM. Legacymspkeys→(otel,santral_firmasi.santral_firmasi, msp…) still accepted.
⟨35 unchanged words⟩ :"number"},"domain":{"default":"otelhotel","description":"Domain:otelhotel |santral_firmasipbx_provider |sigortainsurance |finansfinance |enerjienergy |otomotivautomotive (legacy keys + msp accepted).","enum":["otelhotel","santral_firmasipbx_provider","mspinsurance","finance","energy","automotive","otel","santral_firmasi","sigorta","finans","enerji","otomotiv","msp"],"type":"string"},"hint_en": ⟨84 unchanged words⟩
⟨12 unchanged words⟩ by call_id, kind, domain, q. GET/v1/pbx/facts?call_id=&kind=&domain=otel|santral_firmasi|all&q=&limit=50./v1/pbx/facts?call_id=&kind=&domain=hotel|pbx_provider|insurance|finance|energy|automotive|all&q=&limit=50. Facts come from transcript extract + domain dictionary; ⟨19 unchanged words⟩
⟨17 unchanged words⟩ ,"domain":{"description":"Domain slice:otelhotel |santral_firmasipbx_provider |sigortainsurance |finansfinance |enerjienergy | automotive | all (legacymsp)keys|+all.msp accepted).","enum":["otelhotel","santral_firmasipbx_provider","mspinsurance","finance","energy","automotive","otel","santral_firmasi","sigorta","finans","enerji","otomotiv","msp","all"],"type":"string"}, ⟨47 unchanged words⟩
HeuristicTRpromise extractor from transcript text — creates open Promise docs (idle $0, no LLM). Detects promise-like sentences (sözwe will,vaatI promise,edeceğizrefund,iadecancel,iptalcall you back,yarın…tomorrow…). Optional persist_promises=false for extract without writing. Also ⟨7 unchanged words⟩
Mark an open promise kept or broken with an optionalKVKK-safeprivacy-safe note — makes the sales demo writable, ⟨27 unchanged words⟩
⟨6 unchanged words⟩ ":"Optional short operator note. Phones/emails stripped (KVKK-safeprivacy-safe).","maxLength":200,"type":"string ⟨39 unchanged words⟩
KVKK-firstPrivacy-firstforgeterasure (default-on SaaS): clear derived index by ⟨12 unchanged words⟩ only — not a legal deletion SLA. E.3KVKK-firstPrivacy-first redaction for managed SaaS. mode=anonymize|delete. Lookup by target_id ⟨32 unchanged words⟩
⟨36 unchanged words⟩ :"string"},"reason":{"description":"KVKK (personal-data) /Personal-dataforgeterasure reason.","maxLength":200,"type":"string ⟨53 unchanged words⟩
List recentKVKK forgeterasure actions — who/what/when + tenant scope. Managed SaaS ⟨35 unchanged words⟩
⟨44 unchanged words⟩ when secret set. Idle $0. No DID sales.KVKK.Erasure-aware. Advanced: own PBX/Asterisk stays on customer.
⟨19 unchanged words⟩ when secret set. Idle $0. No DID sales.KVKK.Erasure-aware. Advanced: own PBX/Asterisk stays on customer.
Validates and normalisesaany phone number to E.164,classifies the line type,withandstructuralresolvescheckstheforprovinceeveryforcountryTurkishcallinglandlines.code. For signup and checkout flows that need to store one canonical form and reject typos early.Turkish numbersAnyarecommonhandledinputin(spaces,depth:dashes,landlinebrackets,area00codesorresolve+toprefix, aprovince,straymobilenationalandtrunkspecialzero)rangescomes(toll-freeback0800,asfixed-rateE.1640850plus national notation,premiumwith0900)thearecountryclassified,resolvedandfromeverytheacceptedcallinginputcode.comesNumbersbackwithoutinanbothinternationalE.164prefix use `defaultCountry` (US when omitted), so (415) 555-0134 andnational+1notation.415 555 0134 store the same. One thing this endpoint deliberately does not claim: the current mobile operator.Turkey hasNumbershadarenumberportableportabilityinsincemost2008markets, so a0532prefix says where a numbermaywaswellfirstbeallocated,onnotanotherwherenetworkit lives today. Competing APIs report the prefix owner as "the operator" and customers pick SMS routes on that basis.WeWhere we know the original allocation we return it as `originallyAllocatedTo` with the caveat attached, because a confident wrong answer costs more than an honest gap. Countries without a full numbering plan here are validated structurally and say so in `warnings`.
⟨13 unchanged words⟩ the number has no international prefix. Defaults toTR.US.","maxLength":2,"minLength":2,"type ⟨19 unchanged words⟩
Turkish Address Parser — Splits a free-form Turkish address into neighbourhood, street, building, floor, flat, district, province and postcode. Handles the abbreviation chaos (Mah./Mh., Cd./Cad., Sk./Sok., No:12/5, K:3 D:7), cross-checks the province against the postcode, repairs misspelled district names against a dictionary, and returns a confidence score. Anything it could not place is listed in `unparsed` — nothing is dropped silently. Built for shipping, checkout and CRM systems that receive Turkish addresses typed by humans.
Turkish Business Days — Adds business days or counts them between two dates, accounting for Turkish public and religious holidays including half-day eves. Ramadan and Sacrifice feasts follow the Hijri calendar and cannot be derived reliably by formula, so announced dates are read from a table; years without an official announcement are returned with `confirmed:false` rather than guessed silently. For delivery promises, SLA clocks, payment terms and shipping estimates.
Build Turkish IBAN — Builds a Turkish IBAN from a 5-digit bank code and account number, computing ISO 7064 check digits. A Turkish IBAN is TR + 2 check digits + 5-digit bank code + 1 reserved digit + 16-character account. This pads the account on the left, defaults the reserved digit to 0, computes the mod-97 check digits, and resolves the bank name from the same national table used by IBAN validation when the code is known. Unknown bank codes still produce a structurally valid IBAN with bankName null — existence at the bank is not claimed.
Turkish e-Invoice Builder — Builds a UBL-TR e-Invoice or e-Archive XML document from plain JSON, computing every total and validating the parties. Selling into Türkiye means issuing a UBL-TR document whose element order is fixed by schema and whose totals must agree to the kuruş, or the integrator rejects it. This endpoint takes the invoice as ordinary JSON and returns the XML. Totals you send are ignored on purpose — line amounts, per-rate VAT subtotals and the payable amount are all recomputed here, because a rounding difference of one kuruş is the most common rejection. VKN and TCKN checksums are verified, and the a…
Turkish e-Invoice (UBL-TR) Parser — Turns a UBL-TR e-Invoice or e-Archive XML document into clean JSON: parties, line items, taxes and totals. Works regardless of the namespace prefix the sender used (cbc:, cac:, ns0:), normalises single-line documents into arrays, and reports amount mismatches in `warnings` instead of returning quietly wrong totals. The job that costs accounting and expense software the most engineering time.
Turkish Severance, Notice & Leave — Computes Turkish severance (kıdem), notice (ihbar) and annual-leave entitlement from service dates and the gross wage, using the official ceiling and minimum-wage tables for the given day. Payroll and HR tools in Turkey chase a parameter that changes every January and July: the severance ceiling, the SGK cap, the minimum wage. This endpoint applies the statutory formulae (Labour Law 4857 arts. 17 and 53, former 1475 art. 14) to those tables. The ceiling is applied to the monthly wage, not the total. Stamp tax (0.759%) is deducted from severance; income tax is not — kıdem is exempt. Notice pa…
Amount to Turkish Words — Writes a monetary amount out in Turkish words, the way invoices, cheques and promissory notes require. Applies the rules that trip up generic libraries: Turkish says "bin", never "bir bin"; the kuruş part is read separately; and both "1.234,56" and "1,234.56" are accepted and told apart automatically. A mandatory field on Turkish e-invoices, cheques and notes — with no off-the-shelf API until now.
Turkish Postal Code — Validates a 5-digit Turkish postal code and resolves the province from the first two digits (plate map). PTT postal codes are five digits; the leading pair matches the province plate code for the 81 provinces. This endpoint checks the shape, maps 01–81 to the province name, and returns null with confidence none when the prefix is outside that range — it does not invent a district. District-level resolution needs the full PTT directory and is out of scope here.
Turkish FAST / TR Karekod Payload — Builds a person-to-person TR Karekod (FAST) payment payload from IBAN, name and optional TRY amount. Text only — no PNG. Turkish instant payments (FAST) can start from a TR Karekod that encodes the payee IBAN and name in EMV-style TLV. This builds the person-to-person organisation (payload format indicator 750210): application template with IBAN, payee name, optional 12-digit kuruş amount, optional free-text explanation, and a CRC-16/CCITT-FALSE trailer. The Turkish IBAN is normalised and checked with ISO 7064 mod-97; non-TR IBANs and non-TRY currencies are rejected. This does not send money…
Turkish Service-of-Process Clock — Computes the deemed-received date and the HMK deadline (with holiday shifting) for a Turkish notification, from the date the underlying event actually happened. Turkish notification law (7201) ties the deadline clock to an event that is not "the date on the letter" — for electronic notification the UETS platform reports send, read AND reached dates, and only the reached date starts the clock (art. 7/a: deemed received 5 calendar days after reaching the address, whether or not it was opened). HMK adds two more rules on top: the day of notification itself does not count (art. 92 — the period s…
Turkish ID & Number Validation — Validates Turkish national ID, tax number, IBAN, licence plate, IMEI, barcodes, KEP, MERSİS, postal code and ISBN from one endpoint, with type auto-detection. Goes past a yes/no: resolves the bank behind an IBAN, the province behind a licence plate and the GS1 country prefix behind a barcode. Pure local computation — no upstream service is called, so latency is microseconds and the answer never changes for the same input.
Turkish VAT & Withholding — Splits a Turkish amount into net, VAT and (optionally) withholding: who pays the seller, who remits the withheld VAT. For invoice lines and checkout totals that have to show KDV dahil / hariç and, when the parties are in a withholding (tevkifat) situation, the split between what the buyer pays the seller and what the buyer remits to the tax office. Rates are 0, 1, 10 and 20 percent. Withholding is a fraction of the VAT (2/10 through 10/10), or a named code from the GİB partial-withholding list. The 2026 threshold (TRY 12,000 gross) is reported and compared with the amount, but `applies` is a…
RF Creditor Reference — Validates or generates an ISO 11649 RF creditor reference (mod-97 check digits). SEPA credit transfers carry an RF creditor reference so remittance data survives the payment chain. The check digits are the same ISO 7064 mod-97 used for IBAN: RF and the two digits move to the end, letters become 10–35, remainder must be 1. If the input already starts with RF and two digits it is validated; otherwise a 1–21 character alphanumeric payload is encoded. A bad checksum is rejected with 400 — a self-inconsistent reference must not enter a payment file.
GTIN / EAN Check Digit — Validates GTIN-8, UPC-A (12), EAN-13 and GTIN-14 check digits for retail barcodes. Retail GTINs share one GS1 check-digit algorithm with length-dependent packing (8 / 12 / 13 / 14). This endpoint stays on that retail identity: it does not guess shipping carriers. For 13-digit codes the leading three digits are returned as a GS1 company-prefix hint; 868/869 mark Türkiye. A matching check digit is arithmetic consistency, not proof the SKU is listed in a brand catalogue.
EU VAT Rates — Dated EU-27 VAT rates (standard, reduced, super-reduced, parking) plus the Union OSS threshold. Not a goods classification. Invoice software that hard-codes “Germany is 19%” breaks the day a member state moves a rate, and it never knew the reduced list. This is a point-in-time schedule of published rates for the EU VAT area, keyed by country and asOf. It is a schedule of rates, not which goods fall in which reduced band — there is no HS or NACE mapping. Great Britain, Northern Ireland, Switzerland, Norway and Türkiye are recognised and returned with null rates. If the table has no row for th…
EU VAT Number Validation — Validates an EU VAT number against the official VIES register, with per-country format checks and honest handling of upstream outages. VIES is free but unreliable: member-state services drop out individually and a failed lookup can easily be mistaken for a rejection. Treating an outage as "invalid" means charging VAT to a customer who should have been exempt — an error with a price tag. So this endpoint never returns `invalid` when the service could not answer; it returns `unknown` and names the reason, and reports whether that country's service is currently up. Format is checked locally fir…
MRZ Check Digits — Parses ICAO 9303 TD1/TD3 MRZ and verifies check digits — format check, not identity proof. Machine-readable zones on passports and ID cards carry ICAO 9303 check digits (weights 7,3,1). This parses TD3 (2×44, typical passport) and TD1 (3×30, typical ID card) and reports each field check. A mismatched check digit is HTTP 200 with valid:false — the string is still an MRZ, just inconsistent. This is a format check, not identity proof: it does not confirm the document was issued or that the holder is who they claim.
ISBN Validate & Convert — Validates ISBN-10 and ISBN-13 check digits and converts between them when the 978 prefix allows it. Catalogue and retail systems still mix ISBN-10 and ISBN-13. This checks the ISBN-10 weighted mod-11 digit (X allowed) and the ISBN-13 / EAN-13 alternating 1–3 check digit. When an ISBN-10 is valid it returns the ISBN-13 form (978 + body + new check). ISBN-13 values starting with 978 convert back to ISBN-10; 979 prefixes have no ISBN-10 equivalent and isbn10 stays null. Hyphens and spaces are stripped. A valid checksum is not proof the title exists in a national bibliography.
ISIN Validation — Validates an ISIN (ISO 6166): country code, national identifier and the letter-aware check digit. Portfolio imports and corporate-action files fail on a single mistyped ISIN. The check digit is a Luhn variant that first expands letters to two digits (A=10…Z=35), so a swapped letter is caught, not just a swapped digit. XS (international), EU and other reserved prefixes are accepted as country codes even though they are not ISO 3166 territories. A valid ISIN is self-consistent. It is not proof the security exists, is listed, or is the one you meant.
LEI Lookup — Looks up a Legal Entity Identifier in the GLEIF register: legal name, registration status, country, and BIC. Checksum-valid is not the same as currently registered — a LAPSED or MERGED LEI still passes ISO 7064. This endpoint checks the digits locally first (a typo never becomes an upstream call) then GET the GLEIF lei-records API. Results are cached for 24 hours. GLEIF allows 60 requests per minute; above that, or on timeout/5xx, we return `unknown` rather than invent a registration. HTTP 404 means the service answered and the LEI is not in the index (`invalid`). This is not a replacement f…
LEI Validation — Validates a 20-character Legal Entity Identifier (ISO 17442) with the ISO 7064 mod-97 check digits. KYC and MiFID reporting reject an LEI that fails the check digits before anyone looks the entity up. The algorithm is the same family as IBAN (ISO 7064 mod 97-10) over all 20 characters; the remainder must be 1. The first 4 characters are the issuing LOU prefix, the next 14 the entity, the last 2 the check digits. This does not call GLEIF. A checksum-valid LEI can be lapsed, merged, or never issued. Use GLEIF's free API if you need "this legal entity is currently registered".
MCP Tool Surface Index — Searchable, dated archive of what every public MCP server actually exposes — tool definitions, daily change feed, and rug-pull detection. The official MCP registry publishes a server’s name and address but not its tool surface; the only way to learn what a server exposes is to connect and call `tools/list`. This endpoint does that daily across every public remote server and keeps the result. Three things become answerable that the source cannot answer: tool-level search (the registry has none), uptime, and — the one that matters for security — what a tool’s description said yesterday. In MCP…
LLM Price & Lifecycle Archive — Dated archive of LLM prices, context windows, announced retirement dates and quiet delistings across 400+ models and 50+ providers. Providers overwrite their pricing pages and drop models from their catalogs without publishing what changed. This endpoint keeps a daily record, so three otherwise unanswerable questions become answerable: what a model cost on a given date (a contract and budget question), which models were quietly removed (a dependency-audit question), and when a retirement date was first announced and whether it later moved (a migration-planning question). Price points land in…
LLM Endpoint Drift — Independent daily record of what changed behind a provider endpoint: which alias resolved to which model, and when behaviour shifted. Providers update models behind stable endpoint names. This endpoint publishes an independent measurement: a fixed probe suite is sent daily at temperature 0, three repeats per probe, and the identity a provider declares in its own response (`modelVersion`, `system_fingerprint`, region) is recorded alongside. A change is only reported as drift when the repeats agree with each other and disagree with the previous run — same-day disagreement is noise, not drift. …
EPC QR Payload — Builds an EPC069-12 v3.1 V2 (002) SCT payload. Does not send money; returns text only, no PNG. European payments often start from a QR that encodes an EPC069-12 credit-transfer payload. This endpoint builds that text in version 002 (V2): BCD, UTF-8, SCT, optional BIC, name, electronic IBAN, EUR amount. Purpose and structured remittance are left empty; unstructured remittance is copied if given. Lines are LF, not CRLF. IBAN spaces are stripped and letters uppercased; mod-97 is not required here. TRY, USD and any non-EUR currency are rejected. This does not send money and does not render a QR …
Multi-Agent Handoff Bridge — Multi-agent handoff bridge intent + shared open-promise memory. Idle $0. No live PSTN. POST /v1/pbx/bridge/multi-agent {call_id, agents:[{role,label}]}. Records a virtual multi-agent handoff bridge intent in the PBX index for co-agent orchestration. Returns shared_memory linking open promises on the call. Idle $0. No Telnyx/DID/LLM/live PSTN. Advanced: intent only — no live Asterisk/ExternalMedia.
PBX Night Twin Last Report — GET last gece-ikizi report persisted on forge volume (null if never run). Idle $0. GET /v1/pbx/night-twin/last — last report from POST /v1/pbx/night-twin/run. No LLM/Telnyx.
PBX Night Twin Run — Night scan: open promises older than N hours → unresolved candidates (iptal/iade/söz). ≤20/hour/key → 429. Idle $0, no LLM. POST /v1/pbx/night-twin/run {pbx_id?, older_than_hours?}. Heuristic night twin — still-open promises older than N hours whose text matches iptal/iade/söz. Persists last report on forge volume. No Telnyx/LLM.
Call Orchestra Act — Agent orchestration: search/promise hits → whisper / hold / transfer / PCI handoff intent. Idle $0. No live PSTN. Own PBX = advanced footnote. POST /v1/pbx/orchestra/act {call_id, action, params?, stasis_webhook_url?}. Turns search/promise/suggest hits into managed orchestra intents (handoff-ready) on Temsor runtime. No live RTP required for stub. Idle $0. Not a receptionist bot. Prefer POST /v1/pbx/promises/act for promise→graph closed loop (E1). Advanced: optional own-PBX Stasis/ARI webhook forward — not Asterisk-first glue.
PBX Orchestra Recent Acts — List recent orchestration/handoff intents (whisper/hold/transfer/PCI). Number→flow SaaS · idle $0 · no DID. Own PBX = advanced footnote. GET /v1/pbx/orchestra/acts?limit=20&call_id=. Tenant-scoped recent orchestra intents (E.5) for agent audit. Pairs with POST /v1/pbx/orchestra/act and POST /v1/pbx/promises/act (E1 closed loop). Managed SaaS runtime — idle $0 · not live PSTN. Advanced: not Asterisk-first glue; own PBX optional footnote.
PBX Synthetic Caller Run — Load demo: sample call utterances → promise extractor → stats (calls, promises_open). ≤10/hour/key → 429. Idle $0, no LLM/PSTN. POST /v1/pbx/synthetic/run {scenario:ivr_menu|promise_heavy, count:10..500}. Generates deterministic fake utterances, runs heuristic ingest/transcript extract, returns calls + promises_open. No Telnyx/DID/LLM.
Sanctions Screening — Screens a name against six official sanctions lists — US OFAC, UN, EU, UK OFSI, Switzerland SECO and Canada — with transliteration-aware fuzzy matching. Six official lists are reduced to one schema, so a name is checked everywhere at once instead of six integrations. Cyrillic and Arabic names are transliterated, titles and corporate suffixes are stripped, and known spelling families are unified — "Abd al-Rahman", "Abdul Rahman" and "Abdulrahman" reach the same record. Every hit explains itself: which name matched, whether it was an alias the source flags as weak, and how the birth year and c…
Time Series History — Returns the accumulated history of public data series with change statistics and a source receipt for every point. Currently ingesting the Turkish Central Bank daily FX bulletin (`tcmb.usd`, `tcmb.eur`, …), normalised to one unit so JPY-style 100-unit quotes stop biting. Leave `seriesId` empty to list the catalogue. `fillGaps` carries the last value across weekends and holidays; `includeEvidence` attaches the source URL and content hash for every point, so a value can still be defended years later.
Tracking Number Identification — Identifies which carrier a tracking number belongs to, validates it where a checksum exists, and returns the canonical tracking link. Built for order systems that receive numbers from many carriers and have to route the customer to the right tracking page. Turkish carriers mostly use plain numeric ranges that overlap, so a single confident answer is often impossible — this returns a ranked candidate list instead of inventing certainty, because sending a customer to the wrong carrier's page makes them think the parcel is lost. Universal Postal Union (S10) numbers are fully verified: the mod-1…
Tax Identifier Validation — Validates a tax identifier for 25+ countries: checksum where the algorithm is public, format-only where it is not. Country is required. Onboarding forms collect a tax number from whatever country the customer is in and then store garbage because they only checked the length. This applies the published checksum (SIREN/SIRET Luhn, ABN mod-89, CPF/CNPJ, NIP, BSN 11-proef, NIF/NIE, OIB, IČO, AFM, TCKN/VKN, …) and refuses to guess the country: the same 9 digits are a well-formed identifier in more than one place. Where the checksum is not published (US EIN, UK UTR, DE Steuernummer, IN PAN) the an…
Turkey Fuel Prices — Petrol, diesel and heating-oil pump prices for all 81 Turkish provinces, including the price in force on any past date. The distributor publishes today's pump price and a per-district history query, one district and one range at a time. This endpoint answers the question that actually costs money, in a single call: what was diesel in Ankara on 12 March? Pass `asOf` for the price in force on that day — if the distributor did not change prices that day, the previous price is carried forward and `effectiveFrom` says when it started, with `carriedForward: true`. Pass `from`/`to` to get the chang…
UUID Validate — Validates UUID structure and reports version (1–5, 7) and RFC 4122 variant bits. Deterministic. Accepts dashed or 32-hex compact form. Reports the version nibble, variant (NCS / RFC 4122 / Microsoft / future), and whether the layout matches a known UUID version used in practice (v1–v5 and Unix-epoch v7). A valid structure is not proof the UUID was issued by a particular system.
VIN Validation — Validates a 17-character VIN: forbidden letters, ISO 3779 check digit, WMI region/manufacturer, model year and plant. Typos in a VIN are usually a forbidden letter (I, O, Q — they look like 1 and 0) or a shifted character. This rejects those, splits WMI/VDS/VIS, and names the manufacturer when the WMI is in a conservative built-in table. The 9th-character check digit is computed and compared, but a mismatch does not fail the VIN: it is mandatory under FMVSS 115 in North America and routinely ignored in Europe. `checkDigitMatch` tells you; `valid` stays true if the 17-character form is legal.…
PBXCallGraph /HandoffTransfersGraph
GET callHandoff graph + transfer edgesfor a call— who→whom→where the promise stuck (moat). Idle $0. GET /v1/pbx/calls/graph?call_id=…&stuck_at=310. Returns path, path_tr (plain Turkish), edges, and raw transfers. Compounding asset for search/orchestration:Transferhandoff edges, not a bot transcript. Idle $0. No DIDsales.sales / no live PSTN.
PBXCall Events Ingest
IngestAsterisk programming-interface (ARI) / Stasis (call-app channel) events.call-opsOptionaleventsx-temsor-pbx-key→oropenHMAC-SHA256promisesrequest+signature.transferBodycrumbs≤256forKiBsearch/orchestration.→Optional429.HMAC. Idle $0 when no calls. Demo stores events ⟨13 unchanged words⟩ bad signature rejected when header present. BridgeEnter →transfertransfer/handoff crumbs. Utterance/text → open Promise docs via heuristic (no LLM). Idle $0. Body ≤256 KiB → 429. Advanced: ARI/Stasis batch shape when customer runs own PBX — not Asterisk-first product copy.
⟨29 unchanged words⟩ pbx-index. Scoped by x-temsor-pbx-key. Idle $0. No DIDsales; Asterisk on customer;sales. KVKK forget ready. Advanced: own PBX/Asterisk stays on customer.
PBX ARICall Orchestra Act
Query→actAgentonorchestration:managedsearch/promiseSaaShitsruntime:→ whisper / hold / transfer /pci_stop / snoop. Intent + optionalPCIwebhook.handoff≤120/hour/keyintent.→Idle429.$0. NoDIDlivesales.PSTN. Own PBXoptional= advanced footnote. POST /v1/pbx/orchestra/act {call_id, action, params?, stasis_webhook_url?}. Turns search/promise/suggest hits intoARImanaged orchestra intentson Temsor managed runtime(optionalhandoff-ready)own-PBXonwebhookTemsorforward).runtime. No live RTP required for stub. Idle $0. ⟨5 unchanged words⟩ POST /v1/pbx/promises/act for promise→graph closed loop (E1). Advanced: optional own-PBX Stasis/ARI webhook forward — not Asterisk-first glue.
List recentmanaged orchestraorchestration/handoff intents (whisper/hold/transfer/PCI). Number→flow SaaS · idle $0 · no DID. Own PBXoptional= advanced footnote. GET /v1/pbx/orchestra/acts?limit=20&call_id=. Tenant-scoped recentARIorchestra intents (E.5).for agent audit. Pairs with POST /v1/pbx/orchestra/act and POST /v1/pbx/promises/act (E1 closed loop). Managed SaaS runtime — idle $0 · not live PSTN. Advanced: not Asterisk-firstglue.glue;Idleown$0.PBXNotoptionalPSTN.footnote.
⟨32 unchanged words⟩ promise.ext. Scoped by x-temsor-pbx-key. Idle $0. No DIDsales; Asterisk on customer;sales. KVKK forget ready. Advanced: own PBX/Asterisk stays on customer.
PBXOpen Call Promises
Listbroken/openopen/broken call promisesfromfortheagentcallhandoffgraphtracking —thehotel /PBX-providerMSP salesdemodemo.list.Idle $0. GET /v1/pbx/promises?status=open returns open/unclosed promises withtransfertransfer/handoffpath.path for orchestration. Scoped by x-temsor-pbx-key when set. Idle $0. No live PSTN.
E1 moat: who→whom→promise →managedorchestra handoff intent (whisper/transfer/hold). Idle $0. No live PSTN. Own PBXoptional= advanced footnote. POST /v1/pbx/promises/act {promise_id, action?}. Loads the promise + call graph, suggests whisper/transfer/hold, records orchestra intent withsource_type=promise. Managedsource_type=promiseSaaSforruntimeagent—handoff.notManagedAsterisk-firstSaaSglue.runtime. ≤120/hour/key (shares orchestra bucket). Idle $0. carrier/pstn always false. No cross-tenant graph merge. Advanced: not Asterisk-first glue; own PBX optional footnote.
PBXVoice Archive Search
ArchiveAgent archive search over call promises and facts — voice-Google forthe PBXcall-ops, not a receptionist bot. Idle $0. Demo index + domain dictionary v0. Filters: status, date, ext, competitor, stuck_after (transfertransfer/handoff hop). Returns call-graph path + transferedges.edges for orchestration. Idle $0. No live PSTN.
Control-plane statusfor a registered PBX— promise/orchestra/search counts +idle.idle $0. No DID sales. GET /v1/pbx/status. Scoped by x-temsor-pbx-key when set.AsteriskDerivedonindexcustomer;onderivedTemsorindexforonagentTemsor.search/orchestration. Idle $0. Advanced: own PBX/Asterisk stays on customer.
⟨43 unchanged words⟩ x-temsor-signature when secret set. Idle $0. No DIDsales;sales.AsteriskKVKK.onAdvanced:customer;ownKVKK.PBX/Asterisk stays on customer.
⟨18 unchanged words⟩ HMAC when secret set. Idle $0. No DIDsales;sales.AsteriskKVKK.onAdvanced:customer;ownKVKK.PBX/Asterisk stays on customer.
Demo: ≤3 context cards;Liveprefersagentin-callhandoffpartialcardsindex(≤3):whenopenpresentpromises/facts—frommockin-calllatency_ms;index.idleIdle $0. Lab: TEMSOR_RTP_LAB=1 → lab_latency_ms. POST /v1/pbx/whisper/suggest {call_id, partial_text}. Returns open promises and facts as whispercards.cards for agent handoff. Prefers in-call partial index when present. Mock latency_msfieldunder 400ms (compat stub).OptionalIdle $0. No Telnyx/DID/live PSTN. Advanced: optional lab_latency_ms when TEMSOR_RTP_LAB=1 (measured; not prod SLA).No Telnyx/DID.
Add a synonym/aliasto the domain dictionary(pbx-scopedtenant-scoped or global demo) —compoundsE4 compounding thickens search boost + Fact extract. ≤60/hour/key → 429. Idle $0. No invented premiums. POST /v1/pbx/dictionary/add {term, alias, domain:otel|santral_firmasi|sigorta|finans|enerjiotel|santral_firmasi|sigorta|finans|enerji|otomotiv, scope?:pbx|global}.PersistsManagedtoSaaSpbx-index.compoundingSearch(E4):returnstenant-scopedmatchaliasescrumbs.thicken search + fact extract. No invented premiums/prices. Idle $0, no LLM. Legacydomain=mspmsp → santral_firmasi.
⟨42 unchanged words⟩ | santral_firmasi | sigorta | finans | enerji | otomotiv (legacy msp accepted).","enum":["otel","santral_firmasi","msp","sigorta","finans","enerji","otomotiv"],"type":"string"},"hint_en": ⟨84 unchanged words⟩
⟨41 unchanged words⟩ live. No Temsor STT/LLM — customer posts text.AsteriskManagedonSaaScustomer;in-call index; no DID sales. Own PBX optional footnote. Idle $0.
⟨17 unchanged words⟩ ≤400ms path. Idle $0 when no live call.AsteriskManagedonSaaScustomer;in-call index; no DID sales. Own PBX optional footnote.
Query→act on managed SaaS runtime: whisper / hold / transfer / pci_stop / snoop.RecordsIntentintent;+ optionalcustomer Stasiswebhook. ≤120/hour/key → 429. No DID sales. Own PBX optional footnote. POST /v1/pbx/orchestra/act {call_id, action, params?, stasis_webhook_url?}. Turnssearch/suggestsearch/promise/suggest hits into ARIactsorchestra intents onTHETemsorCUSTOMERmanagedAsteriskruntime (intent +optional own-PBX webhook forward). No liveTemsor RTP; stubsRTPOKrequiredwithoutforAsterisk.stub. Idle $0. Not a receptionist bot. Prefer POST /v1/pbx/promises/act for promise→graph closed loop (E1).
One-command KVKKKVKK-first forget (default-on SaaS): clear derived index(promises/facts/partial/audio pointers)byid or phone;id/phone; durable audit(who/what/when +scope).tenant scope. ≤30/hour/key → 429.RawManagedaudiopointerURIonlystays—onnotcustomeraPBX.legal deletion SLA.HardenedE.3redaction.KVKK-first redaction for managed SaaS. mode=anonymize|delete. Lookup by target_id or phone. Clears Person/Promise/Fact/partial index + Temsor audio pointersforintheyourtarget.tenantReturnsonlydurable(noauditcross-tenant).entry.DurableMediaaudit.filesRawremainmediacustomer-sidestays(URI-only).onListyourviaside. Not a legal deletion SLA. List: GET /v1/pbx/redact/audit.
List recent KVKK forget actions — who/what/when +scopetenant(call_id|pbx_id|promise_id).scope.RawManagedaudioSaaSstaysderived-indexonaudit;customernotPBX.a legal deletion SLA. GET /v1/pbx/redact/audit?limit=20. Durable audittrailfrom POST/v1/pbx/redact./v1/pbx/redact (E.3). Tenant-scoped. Derived indexiscleared;customer WAV/URIrawismedia not deleted by Temsor.NoNumber→flowDIDmanagedsales;SaaS;AsteriskownonPBXcustomer.optional. No DID sales.
PBX Orchestra Recent Acts — List recent managed orchestra intents (whisper/hold/transfer/PCI). Number→flow SaaS · idle $0 · no DID. Own PBX optional footnote. GET /v1/pbx/orchestra/acts?limit=20&call_id=. Tenant-scoped recent ARI orchestra intents (E.5). Pairs with POST /v1/pbx/orchestra/act and POST /v1/pbx/promises/act (E1 closed loop). Managed SaaS runtime — not Asterisk-first glue. Idle $0. Not PSTN.
Promise → Orchestra Closed Loop — E1 moat: who→whom→promise → managed orchestra intent (whisper/transfer/hold). Idle $0. No PSTN. Own PBX optional footnote. POST /v1/pbx/promises/act {promise_id, action?}. Loads the promise + call graph, suggests whisper/transfer/hold, records orchestra intent with source_type=promise. Managed SaaS runtime — not Asterisk-first glue. ≤120/hour/key (shares orchestra bucket). Idle $0. carrier/pstn always false. No cross-tenant graph merge.
⟨37 unchanged words⟩ msp","sigorta","finans","enerji","otomotiv","all"],"type":"string"},"kind" ⟨46 unchanged words⟩
⟨4 unchanged words⟩ prefers in-call partial index when present — mock<400ms;latency_ms; idle $0. Lab: TEMSOR_RTP_LAB=1 → lab_latency_ms. POST /v1/pbx/whisper/suggest {call_id, partial_text}. Returns open promises and facts as whisper cards. Mocklatencylatency_msalwaysfield under400ms.400msNo(compatTelnyx/DID,stub).noOptionallivelab_latency_msproviderwhen—TEMSOR_RTP_LAB=1CTA(measured;APInotonly.prod SLA). No Telnyx/DID.
PBX Whisper RTP Status — Capability: mode=stub|ready from TEMSOR_RTP_*. No live RTP on forge; idle $0. GET /v1/pbx/whisper/status. Reports MediaBridge config presence (TEMSOR_RTP_PATH). mode=ready means path env set — not that Asterisk RTP is flowing. live_rtp/listening always false on forge (R2–R3 IVR sidecar; R4 lab E2E harness). No ≤400ms production claim. TEMSOR_RTP_LAB=1 → optional lab_latency_ms on suggest. No DID sales.
⟨7 unchanged words⟩ "description":"Domain slice: otel | santral_firmasi | sigorta | finans | enerji (legacyalias:msp) | all","enum":["otel","santral_firmasi","msp","sigorta","finans","enerji","all"],"type":"string"}} ⟨2 unchanged words⟩
⟨22 unchanged words⟩ $0. POST /v1/pbx/dictionary/add {term, alias, domain:otel|santral_firmasiotel|santral_firmasi|sigorta|finans|enerji, scope?:pbx|global}. Persists to pbx-index. Search ⟨11 unchanged words⟩
⟨39 unchanged words⟩ ","description":"Domain: otel | santral_firmasi | sigorta | finans | enerji (legacy msp accepted).","enum":["otel","santral_firmasi","msp","sigorta","finans","enerji"],"type":"string"},"hint_en":{ ⟨24 unchanged words⟩ ","klima","check_out","iade","sku","police","hasar","yenileme","abone","kesinti","fatura","kart","iban","sube","other"],"type":"string"}, ⟨44 unchanged words⟩
⟨18 unchanged words⟩ "description":"Domain slice: otel | santral_firmasi | sigorta | finans | enerji (legacy msp) | all.","enum":["otel","santral_firmasi","msp","sigorta","finans","enerji","all"],"type":"string"}, ⟨47 unchanged words⟩