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.
Changed the definition of "find_opportunities"
⟨132 unchanged words⟩ "maxLength":512,"type":"string"},"eligibility":{"description":"WHO MAY APPLY to a remote posting, read from the posting's own text: `open` (it explicitly opens the role across borders — worldwide, anywhere, a time-zone band such as EMEA/CET hours, nearshore welcome), `restricted` (it requires residence, citizenship, work authorisation, a clearance or US W-2 status somewhere, or scopes the remote work to a region — `eligibility_region` on the row names it when stated), `unstated` (it says nothing). Combine with remote_mode=\"remote\" for the contractor abroad. AN UNSTATED ROW IS NOT AN OPEN ROW: most remote postings say nothing about where the contractor may be, so `open` sets them aside and `_meta.eligibility_undeclared` counts how many remote rows THIS call read are silent. Classified deterministically from title, location and (promoted leg) description; the site-radar leg publishes no description, so its rows are mostly `unstated`.","enum":["open","restricted","unstated"],"type":"string"},"employment_type":{"description":"Restrict to one engagement ⟨480 unchanged words⟩
⟨165 unchanged words⟩ "type":["number","null"]},"eligibility":{"description":"Who may apply, read from the posting's own text: `open`, `restricted` or `unstated`. `unstated` means the text does not say — never read it as open.","type":["string","null"]},"eligibility_region":{"description":"The ISO-3166-1 alpha-2 country, or EU / EMEA, the text names for that opening or restriction. Null when it names none.","type":["string","null"]},"employment_type":{"type":["string","null" ⟨544 unchanged words⟩
Changed the definition of "find_opportunities", "get_day_rate_benchmark" and "get_firm_intel"
⟨97 unchanged words⟩ German cities, dated (posted_at is populated onEVERYallactivebutrowa few % of the live rows of that leg —antheinvariantundatedheldrowssinceare2026-07-31,sorted
Changed the definition of "find_academy_modules" and "search_firms"
⟨263 unchanged words⟩ you decide which one your answer needs. PAGINATED WITH A KEY (a free one is enough): pass `_meta.next_cursor` back as `cursor` with the same filters until it isnull.null; without a key, first 10 rows only. Read `_meta.available_tracks` and `_meta.available_levels` — both counted on ⟨13 unchanged words⟩
⟨118 unchanged words⟩ into the answer and not the label's. PAGINATED WITH A KEY (a free one is enough): the whole matched set is reachable — ⟨5 unchanged words⟩
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "find_opportunities"
⟨5 unchanged words⟩ permanent-role posting Analytics Legends publishes to an ANONYMOUSvisitorvisitor.—Only thesameSITE RADAR leg below is the population a human browses on /opportunities/, where eachpostingof its postings has its own prerenderedpage.page; the PROMOTED leg is served to agents only — it is not listed on /opportunities/ and its rows have no page of their own (citation_scope "section_hub"). It merges the platform's TWO public legs, ⟨483 unchanged words⟩
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "find_partner_candidates" and "get_firm_intel"
⟨62 unchanged words⟩ practices, Big-4, SAP partners, platforms).CommunitiesSAP's own entities, communities, schools and public bodies are never in this population.","enum":["agency_placement","professional_services_esn","professional_services_big4","vendor_partner","vendor_sap","platform_marketplace","other"],"type":" ⟨134 unchanged words⟩
⟨162 unchanged words⟩ name":{"description":"Firm name, matchedcase-insensitively.
Changed the definition of "find_sap_clients", "get_expansion_brief" and "query_knowledge_graph"
⟨55 unchanged words⟩ are columns on every row ('verified' on~550a few hundred of~21k~15k rows — the exact counts are in _meta on every call, never in this text), and you decide what standard of proof ⟨53 unchanged words⟩
⟨125 unchanged words⟩ in this brief: call get_day_rate_benchmark per country;
Changed the definition of "get_expansion_brief"
⟨47 unchanged words⟩ never rows), live opportunities by country,professionals by country (a COUNT per country, never a person),and the BRIDGE GROUPS — brand families that ⟨120 unchanged words⟩
Changed the definition of "get_firm"
⟨29 unchanged words⟩ directory records for the firm — 0 on~97~77 % of rows (re-measured2026-08-142026-09-30 on the published tranche:9677,81 %; it read ~97 % until the 2026-09-30 brand-family pass derived 3 730 sibling links from sister entities), meaning nonedeclaredrecorded here, never that the firm has nopartners.partners; a `sibling` link is a reading of shared brand, not a declared org chart. Does not return the paid firm-intelligence profile, contacts, or any person.
Added "find_partner_candidates" and "get_expansion_brief"; changed the definition of "count_firms_by", "get_day_rate_benchmark" and "search_firms" (20 tools before, 22 now)
Count the firm directory by country, region, kind, module or SAP signal
⟨11 unchanged words⟩ call: how many organisations per country, per REGION (the six-value geography), per kind, per declared SAP module, or per ⟨116 unchanged words⟩
⟨16 unchanged words⟩ worth guessing.","enum":["country","region","kind","module","sap_signal_band"],"type":
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "find_opportunities", "get_day_rate_benchmark", "list_sap_modules" and 3 more
Search the public SAP AI & analytics contract radar
⟨7 unchanged words⟩ :true,"title":"Search the public SAP AI & analytics contract radar"}
Public SAP AI & analytics day-rate aggregate
Certificate changed, valid to 2026-12-26
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "search_firms"
⟨108 unchanged words⟩ vendor_sap","vendor_partner","platform_marketplace","community_group","training_institution","client_enterprise","other"],"type":"string"} ⟨141 unchanged words⟩
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "find_opportunities" and "get_day_rate_benchmark"
⟨309 unchanged words⟩ × region) cell. It is a SUBSCRIBER surface of the WEBSITE, not of this server:onthe radar file thispublicserverlanereadsitcarries no band since 2026-08-29, so `rate_band` is null on EVERY rowsincehere,2026-08-29with or without a key (each response's`_meta.note`
Changed the definition of "find_opportunities" and "query_knowledge_graph"
⟨331 unchanged words⟩ exactly when that translation does not exist (FR coversthe1,492liveofFR/DE1,588coveragesite-radarisrows,countedDEon1,373every—responsemeasured
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "find_opportunities" and "get_day_rate_benchmark"
⟨304 unchanged words⟩ that posting's (seniority × product × region)cell,cell.presentIt is a SUBSCRIBER surface: onmostthisrows,publicandlane it iswhatnull on EVERY row since 2026-08-29 (each response's `_meta.note` says so) — a key at Consultant tier or above reads it, and the posting's public page leadswith.with it. It is `rate_basis: "panel_inferred"` — Eursap
Changed the definition of "get_concept", "get_concept_card" and "search_concepts"
⟨15 unchanged words⟩ by a named human editor, not generated. `level` is GRADED on every active row since 2026-09-18 (the CHECK constraint accepted only the legacy vocabulary OR NULL, so the loader wrote NULL rather than fail; 108 of 330 were blank). A null, if one ever returns, means 'not graded', never 'Beginner'. The card body,why-it-matterscheat sheet,keyglossary,pointspro tip andprothetipfour analysis tables are subscriber content and are NOT returned. Why-it-matters and key points are not returned here either, but they ARE published in full on the concept page at citation_url
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Changed the definition of "get_day_rate_benchmark"
⟨9 unchanged words⟩ min/max daily rate by country, specialisation and seniority — `daily_rate_min` / `daily_rate_max` (plus `daily_rate_median`,each`daily_rate_p10`,row`daily_rate_p90`carryingwhenitstheownsourcecurrencypublishes them), every amount in the row's own `currency` — with source, source date, confidence andconfidence.
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
Certificate recorded, valid to 2026-10-28
Authorization not required, issuer https://dpopqbuhcqmlofjbuxsj.supabase.co/auth/v1
First tool surface recorded: 20 tools (server version 1.0.6)
Showing the latest 34 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨26 unchanged words⟩ :"string"},"specialisation":{"description":"One ofAthespecialisationcodescode,thematchedaggregateexactly.actuallyTheholdslive—listanalytics_all,isbw,`_meta.available_specialisations`bw4hana,onbw4hana_sac,everysac,calldatasphere—(2026-08-09;nothelistliveislistkeptcomeshere,backbecauseasa`_meta.available_specialisations`writtenononeeverywentcall).stale.TheyCodes are NOT evenly spread across countries:DE holds analytics_all only, at three seniorities, and datasphere exists for FRreadalone,theasrows amediancountrywithfilterconfidencereturns.'low'.ATherecodeisthisnoaggregatebdcdoesrownotandholdno(bdc, joulerow in)THISreturnsaggregate0—rowsbutand theplatformavailabledoescodes;priceitBDC:never`find_opportunities`widenscarriesto apanel-inferred band on the live postings, €1,000–€1,400/day P25–P75 for SeniorneighbouringBDCband.on052rowsGermanherepostingsis(2026-08-10).anAabsencecodeinthisTHIS aggregatedoes not hold returns 0onlyrows—andsee theavailable codes;toolitdescriptionneverforwidenswhattotheawebsite'sneighbouringsubscriber band,and 0covershereanddoeswherenotnomeanratetheexistsplatformatisanysilent.tier.","type":"string"}},"type":"object"}
⟨79 unchanged words⟩ glassdoor_rating, glassdoor_reviews_count and linkedin_followers are null ontheallentirebutcorpusaashandful of2026-08-10profiles, absence here is a data gap, not ⟨93 unchanged words⟩
⟨69 unchanged words⟩ :"Restrict a walk to one relation. Theserved projection carries FIVE — teaches · taught_byauthority·iscovers`_meta.available_edge_types`,·computedrelatedon·everymentionscall —and thisno list isa HINT, not thekeptauthorityhere:read `_meta.available_edge_types`, computed on every call. Aa four-name list once stood here while the projection served five,sothen`mentions`awasfive-namereachablelistandwhileundocumented.it served six (`broader`).","type":"string"},"lang":{ ⟨171 unchanged words⟩
⟨9 unchanged words⟩ ":"Count the firm directory by country, region, kind, module or SAP signal"}
⟨44 unchanged words⟩ ,"citation_url":{"type":"string"},"client_market":{"description":"india_domestic (INR, Indian client) | eu_uk_remote (EUR, India-based contractor billed to an EU/UK client). Set on the India rows only.","type":["string","null"]},"confidence":{"type":["string","null" ⟨109 unchanged words⟩ "type":["number","null"]},"daily_rate_max_inr":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_jpy":{"description":"DEPRECATED — read daily_rate_max ⟨81 unchanged words⟩ "type":["number","null"]},"daily_rate_median_inr":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_median_jpy":{"description":"DEPRECATED — read daily_rate_median ⟨92 unchanged words⟩ "type":["number","null"]},"daily_rate_min_inr":{"description":"DEPRECATED — read daily_rate_min + currency.","type":["number","null"]},"daily_rate_min_jpy":{"description":"DEPRECATED — read daily_rate_min ⟨188 unchanged words⟩ ,"source_type":{"description":"primary_agency_guide | primary_job_ads | primary_salary_survey | aggregator | marketing","type":[" ⟨32 unchanged words⟩
⟨22 unchanged words⟩ platforms and community groups — by country, region (EMEA · AMER · LATAM · APAC · AFRICA), kind, declared SAP module and free text. Returns ⟨136 unchanged words⟩
⟨252 unchanged words⟩ ","maxLength":200,"type":"string"},"region":{"description":"Region code of the HQ country — the platform's six-value geography: EMEA (Europe AND the Middle East), AMER (North America), LATAM, APAC, AFRICA (its own region, not folded into EMEA), GLOBAL (country unknown). Case-insensitive on input; anything else is refused.","enum":["EMEA","AMER","LATAM","APAC","AFRICA","GLOBAL"],"type":"string"}},"type":"object"}
Local partner or acquisition candidates for a market entry (Legend tier) — Rank the LOCAL service providers of a target country or region — the firms a practice partners with, subcontracts to, or acquires to enter a market. `local_only` (default true) keeps firms with NO sister entity in another country (read from the brand-family key of the SSOT): a subsidiary of a global group is a competitor, not a partner. Filter by kind and by DECLARED SAP module; rows carry the declared modules, the sister countries of the brand (when any), the count of declared partnerships and the public directory fields. Ordered by SAP signal, then data completeness. `country` or `region` i…
Expansion brief for a target region (Legend tier) — The one-call brief a services practice reads before opening a subsidiary in another region: providers already there (by kind and by country, and how many are LOCAL entities versus members of multi-region groups), SAP end-customers there (by country and by industry — counts from the Legend corpus, never rows), live opportunities by country, professionals by country (a COUNT per country, never a person), and the BRIDGE GROUPS — brand families that hold entities both in the target region and in your home region (or anywhere else when `home_region` is omitted). Regions are the platform's six-valu…
The PUBLIC day-rate aggregate for SAP AI & analytics freelance work: min/max daily rate by country ⟨470 unchanged words⟩
⟨458 unchanged words⟩ average). Never quote it as the SAP AI & analytics rate of its country.","type":[ ⟨116 unchanged words⟩
⟨6 unchanged words⟩ ,"readOnlyHint":true,"title":"Public SAP AI & analytics day-rate aggregate"}
SAP AI & analytics module taxonomy
⟨5 unchanged words⟩ :false,"readOnlyHint":true,"title":"SAP AI & analytics module taxonomy"}
Search the SAP AI & analytics concept encyclopaedia
Search the SAP AI & analytics concept encyclopaedia — the vocabulary of the ⟨121 unchanged words⟩
⟨6 unchanged words⟩ readOnlyHint":true,"title":"Search the SAP AI & analytics concept encyclopaedia"}
Search the SAP AI & analytics firm directory
Search the published Analytics Legends directory of SAP AI & analytics service providers — placement agencies, Big-4 and ⟨155 unchanged words⟩
⟨6 unchanged words⟩ readOnlyHint":true,"title":"Search the SAP AI & analytics firm directory"}
Search SAP AI & analytics market news
Search the Analytics Legends market-news corpus. It is watched FOR SAP AI & analytics (Datasphere, Business Data Cloud, SAC, ⟨63 unchanged words⟩ never present an unfiltered page as 'the SAP AI & analytics news'. Say what you actually got. Each ⟨76 unchanged words⟩
⟨6 unchanged words⟩ ,"readOnlyHint":true,"title":"Search SAP AI & analytics market news"}
⟨266 unchanged words⟩ MARKET ASKS MOST IT IS THE THINNER ONE.`find_opportunities`The website carries a `rate_band` per live radar posting for signed-in subscribers — a panel-inferred P25–P75 band per (seniority × ⟨4 unchanged words⟩ , Eursap n=312 plus the Analytics Legends operatorpanelpanel.—ThisbutserverONLYdoestonot serve it (`find_opportunities.rate_band` is null on every row, with or without a key).atTheConsultantgridtiercoversorEUROPEANabove:cellsononlythe—publicDACH,laneFR/Benelux,itUK/IE,isSouthernnullEU,onEasterneveryEU,rowNordicssince—2026-08-29.andItthere it prices exactly the cells this small aggregate cannot—(Senior Datasphere DACH, Senior BDC DACH—), where `specialisation:"bdc"` here returns nothing. When this tool comes back empty for a country × product: in one of those European regions, say the AGGREGATE holds norow;rowwithandathatkey,subscribers read theradarplatform'sband;bandwithoutononethe posting pages; ANYWHERE ELSE (Americas, APAC, Africa, Middle East) say the platformpricespublishes no rate for that cellforatsubscribersany tier — never thatit cannotsubscriberspricegetit.one. The two are different instruments: this one ⟨54 unchanged words⟩
⟨10 unchanged words⟩ "rows":{"items":{"properties":{"accessed":{"description":"date the source was read (YYYY-MM-DD)","type":["string","null"]},"basis":{"description":"external_published_median | external_published_range | ⟨18 unchanged words⟩ "type":["string","null"]},"conversion":{"description":"how an hourly or monthly source figure was turned into a day rate","type":["string","null"]},"country":{"type":["string","null" ⟨32 unchanged words⟩ "type":["number","null"]},"daily_rate_max_aud":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_chf":{"description":"DEPRECATED — read daily_rate_max ⟨24 unchanged words⟩ "type":["number","null"]},"daily_rate_max_hkd":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_jpy":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_nzd":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_sgd":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_median":{"description":"Median when the source ⟨4 unchanged words⟩ "type":["number","null"]},"daily_rate_median_aud":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_median_eur":{"description":"DEPRECATED — read daily_rate_median ⟨13 unchanged words⟩ "type":["number","null"]},"daily_rate_median_hkd":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_median_jpy":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_median_nzd":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_median_sgd":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"
⟨40 unchanged words⟩ "type":["string","null"]},"canonical_id":{"description":"Set when the site folded this posting into another one it judged identical: `citation_url` is then the page of THAT posting (`canonical_id`). When both are matched, only the canonical row is served and `_meta.duplicates_folded` counts the fold. Null otherwise.","type":["string","null"]},"category":{"type":["string","null" ⟨252 unchanged words⟩ "number","null"]},"salary_min":{"description":"The posting's own advertised salary, YEARLY (see `salary_period`). Null when none was published, and null when the published amount cannot be a yearly salary — `salary_withheld_reason` then says why.","type":["number","null"]},"salary_period":{"description":"`year` when salary_min/salary_max are served. Null otherwise — never a guessed unit.","type":["string","null"]},"salary_withheld_reason":{"description":"Why a published salary was NOT served: `below_annual_floor` (the low end is below any yearly salary in that currency — a monthly or daily figure filed as a salary) or `board_estimate` (the job board's own min = max estimate, not the employer's). The amount is withheld, never converted. Null when nothing was withheld.","type":["string","null"]},"seniority":{"type":["string","null" ⟨149 unchanged words⟩ advertiser's own language when it does not (FR coversthe1,492liveofFR/DE1,588coveragesite-radarisrows,countedDEon1,373every—responsemeasuredin2026-09-04`_meta.untranslated_leg`). Null when the harvest chain could not decide — on some site-radar rows too, counted in `_meta.untranslated_radar_rows` — and on every promoted-leg row, which carries ⟨62 unchanged words⟩
⟨26 unchanged words⟩ node_id → neighbour, `in` = neighbour →node_id.node_id, `both` = the relation is stored in both directions (served once — see `_meta.symmetric_edges_folded`). Walk rows only.","type":["string" ⟨87 unchanged words⟩
⟨235 unchanged words⟩ rest, so the two together are the rows THIS call read (`_meta.employment_mix_rows_read` — a window, NOT the tranche: `_meta.tranche_total_row_count` is the population) and either alone isnot.not even that. Read both before quoting amix.mix, and quote the window with it.","enum":["freelance","contract"," ⟨347 unchanged words⟩
⟨267 unchanged words⟩ ASKS MOST IT IS THE THINNER ONE. `find_opportunities`returnscarries a `rate_band`on mostper live radarpostingsposting — a panel-inferred P25–P75 band per (seniority ⟨5 unchanged words⟩ Eursap n=312 plus the Analytics Legends operator panel,and—itbutisONLYwhattoeachaposting'skey at Consultant tier or above: on the publicpagelaneleadsitwith.is null on every row since 2026-08-29. It prices exactly the cells this small aggregate ⟨25 unchanged words⟩ × product, say the AGGREGATE holds norowrow;andwithgoa key, read the radarbandband;—withoutdoone,notsayreportthe platform prices thatthecellplatformfor subscribers — never that it cannot price it. The two are different instruments ⟨56 unchanged words⟩
The FULL encyclopaedia card for one concept — body,why-it-matters, key points,cheat sheet, glossary, pro tip, and the ⟨9 unchanged words⟩ , performance facts), EN, FR and DE, plus why-it-matters and key points (those two are also published free on the concept page; here they come structured, in three languages, in the same payload) — the corpus the €29.90 Consultant Pass sells. ⟨64 unchanged words⟩
⟨20 unchanged words⟩ , tags and the editor's summary. `level` isSPARSEGRADED—onnulleveryonactive108rowofsince 2026-09-18 (the330CHECKactiveconstraintrowsaccepted only the legacy vocabulary OR NULL,measuredso2026-08-27the—loaderandwroteaNULL rather than fail; 108 of 330 were blank). A null,thereif one ever returns, means 'not graded', never 'Beginner'. These are the same fields `get_concept` returns for ONE slug. The card BODY (why-it-matters,cheatkeysheet,pointsglossary,cheatprosheet,tip and the four analysis tables) is Consultant-tier: call `get_concept_card`. Why-it-matters and key points are NOT served by this endpoint either, but they are published in full on the concept page at citation_url — follow the URL for those, a plan buys the body, not them.
⟨10 unchanged words⟩ "rows":{"items":{"properties":{"basis":{"description":"external_published_median | external_published_range | panel — see /api/market-rates.json _meta.basis_values.","type":["string","null"]},"citation_scope":{"enum":["record","section_hub" ⟨2 unchanged words⟩ ,"citation_url":{"type":"string"},"confidence":{"type":["string","null"]},"country":{"type":["string","null"]},"currency":{"description":"ISO-4217 unit of every daily_rate_* amount on THIS row (EUR, GBP, CHF) — never an envelope constant.","type":["string","null"]},"daily_rate_max":{"description":"Upper bound of the published band, in `currency`.","type":["number","null"]},"daily_rate_max_chf":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_eur":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_max_gbp":{"description":"DEPRECATED — read daily_rate_max + currency.","type":["number","null"]},"daily_rate_median":{"description":"Median when the source publishes one, in `currency`.","type":["number","null"]},"daily_rate_median_eur":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_median_gbp":{"description":"DEPRECATED — read daily_rate_median + currency.","type":["number","null"]},"daily_rate_min":{"description":"Lower bound of the published band, in `currency`.","type":["number","null"]},"daily_rate_min_chf":{"description":"DEPRECATED — read daily_rate_min + currency.","type":["number","null"]},"daily_rate_min_eur":{"description":"DEPRECATED — read daily_rate_min + currency.","type":["number","null"]},"daily_rate_min_gbp":{"description":"DEPRECATED — read daily_rate_min + currency.","type":["number","null"]},"daily_rate_p10":{"description":"10th percentile when the source publishes one, in `currency`.","type":["number","null"]},"daily_rate_p10_gbp":{"description":"DEPRECATED — read daily_rate_p10 + currency.","type":["number","null"]},"daily_rate_p90":{"description":"90th percentile when the source publishes one, in `currency`.","type":["number","null"]},"daily_rate_p90_gbp":{"description":"DEPRECATED — read daily_rate_p90 + currency.","type":["number","null"]},"note":{"type":["string","null"]},"sample_basis":{"description":"What `sample_size` counts (profiles, vacancies…), when the source says.","type":["string","null"]},"sample_size":{"description":"The sample the SOURCE states behind this row; null when it states none — never estimated.","type":["integer","null"]},"seniority":{"type":["string","null"]},"source":{"type":["string","null"]},"source_date":{"type":["string","null"]},"source_url":{"type":["string","null"]},"specialisation":{"type":["string","null"]},"trend":{"type":["string","null"]},"yoy_change_pct":{"type":["number","null"]}},"type":"object" ⟨12 unchanged words⟩