Intuit hires Software Engineers; this guide collects what candidates report about the process.
Online Assessment
reportedAutomated assessment testing core problem-solving capacity across multiple domains.
What to demonstrate
- Automated assessment testing core problem-solving capacity across multiple domains
- Depth in Java
How to prepare
- Answer aloud and timed: Implement a topological sort algorithm to solve a complex course scheduling dependency problem.
- Answer aloud and timed: Given a stream of stock price updates, write an algorithm to calculate the running median over a sliding window.
Recruiter Screening Call
reportedDiscussion of technical background, communication skills, and AI tool usage.
What to demonstrate
- Discussion of technical background, communication skills, and AI tool usage
- Depth in Java
How to prepare
- Be able to walk your CV end to end in two minutes, and say why this company specifically.
- Have your salary expectations, notice period and location constraints ready, and ask for the rest of the loop in writing.
Build Challenge
reportedHands-on practical assignment focused on real-world application development, concurrency, or API integration.
What to demonstrate
- Hands-on practical assignment focused on real-world application development, concurrency, or API integration
- Depth in Java
How to prepare
- Answer aloud and timed: Given a string representation of encoded nested data, write a function to decode and expand the string correctly.
- Answer aloud and timed: Build a production-ready REST API service in Java or Python with database persistence, proper exception handling, and full unit test coverage.
Technical Screen
reportedReview of implementation decisions made during the Build Challenge.
What to demonstrate
- Review of implementation decisions made during the Build Challenge
- Depth in Java
How to prepare
- Answer aloud and timed: Write an asynchronous implementation of a service using Spring Flux or native promises, handling error states and state transitions.
- Answer aloud and timed: Author SQL queries using multi-table JOIN statements, GROUP BY, and HAVING clauses to extract aggregated financial analytics.
Craft Demo & Virtual Onsite Panel
reportedComprehensive sessions evaluating engineering excellence, including presentations, live coding, and behavioral interviews.
What to demonstrate
- Comprehensive sessions evaluating engineering excellence
- Including presentations, live coding, and behavioral interviews
How to prepare
- Answer aloud and timed: Write a Bash script to parse multi-line log output, extract integer values, and output the computed total.
- Answer aloud and timed: Design a high-throughput parking lot system, detailing class interfaces, inheritance structures, and database persistence.
9 candidate reports. Individual accounts describe a particular role and hiring cycle.
Intuit Machine Learning Engineer Interview Experience — Measuring Meeting-Free Work Time
The report presents an Intuit AI Science technical-screen exercise reconstructed from images. The task uses a year of company meeting records to assess how much uninterrupted coding time employees have during business hours. Each attendance record identifies an employee and a meeting, together with joining and leaving times. Candidates are asked to determine the longest available interval for eac…
Read full experienceIntuit Software Engineer interview
The recruiter screen began casually with background and fit questions. They also asked for my views on AI, which felt more like checking my perspective than testing technical knowledge. That tone did not hold in every recruiter interaction. One recruiter became defensive when I was candid about my leveling expectations, and the exchange turned frustrating. In another recruiter-led rejection, the…
Read full experienceIntuit Staff Software Engineer Interview Experience — Two Long Screens and a Final-Round Rejection
Intuit's interview process had two rounds. The process was long, but HR was patient. The final round was a big production too. First round: Coding The interviewer was very nice and kept encouraging me. The first coding problem was to design a rate limiter. Requirement: design a rate limiter that allows five people through during each time period. Then the design was extended: when VIP users arriv…
Read full experienceIntuit Senior+ Software Engineer Interview Experience — 75-Minute Screen With Plus One and an LLM-Agent System Design
View report detailsIntuit Data Scientist Interview Experience — TurboTax Take-Home, Growth Team Onsite, and a Slow Recruiter Process
First there was a TurboTax home assignment, then a 45-minute presentation plus Q&A. In this part they ask about the recommendations you make based on the data, whether your assumptions are reasonable, and what other data you could look at. I remember there being a question like that, and I didn't have a good answer at the time. The task was predicting whether tax filing succeeds or not, and there…
Read full experiencePracHub editorial advice for the preparation topics above.
Going into the loop without having done this.
Prepare thoroughly for the Bash and SQL OA sections: Do not focus exclusively on algorithmic coding. Review Bash syntax for string processing and array iteration, as well as SQL JOINs, aggregations, and window functions.
Going into the loop without having done this.
Do not attempt to hide your reliance on or lack of understanding of AI tools. Intuit explicitly evaluates your practical, ethical, and effective workflow using generative AI.
Going into the loop without having done this.
Prioritize code quality in the Build Challenge: Treat the take-home or machine-coding exercise like production code. Use proper directory structures, clean naming conventions, exception handling, and comprehensive unit test coverage.
Going into the loop without having done this.
Structure your project presentation clearly: When presenting your craft project or past experience, cover the problem statement, system architecture, key trade-offs made, security considerations, and live test output.
Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.
Implement a topological sort algorithm to solve a complex course scheduling dependency problem.
Implement a topological sort algorithm to solve a complex course scheduling dependency problem.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Given a stream of stock price updates, write an algorithm to calculate the running median over a sliding windo
Given a stream of stock price updates, write an algorithm to calculate the running median over a sliding window.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Implement a thread-safe LRU Cache with constant-time lookup and eviction logic.
Implement a thread-safe LRU Cache with constant-time lookup and eviction logic.
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
Find the shortest root-to-leaf path in a binary tree containing binary values, accounting for edge cases.
Find the shortest root-to-leaf path in a binary tree containing binary values, accounting for edge cases.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Given a string representation of encoded nested data, write a function to decode and expand the string correct
Given a string representation of encoded nested data, write a function to decode and expand the string correctly.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Write an asynchronous implementation of a service using Spring Flux or native promises, handling error states
Write an asynchronous implementation of a service using Spring Flux or native promises, handling error states and state transitions.
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
Given a basic system prompt that returns inaccurate responses from an LLM, refactor the prompt to improve outp
Given a basic system prompt that returns inaccurate responses from an LLM, refactor the prompt to improve output accuracy and consistency.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
Explain how you would prevent AI-generated code or automated response mechanisms from causing failures in a li
Explain how you would prevent AI-generated code or automated response mechanisms from causing failures in a live production environment.
Approach
- Restate the input: its shape, its size, and what is guaranteed about it.
- Name the brute-force solution and its complexity before improving on it.
- Choose the data structure from the access pattern, not from familiarity.
- State the target complexity and say which constraint rules the naive version out.
Follow-up
- How does this change if the input no longer fits in memory?
- What is the worst case, and how likely is it on real data?
How do database transactions maintain ACID properties, and how do isolation levels impact query concurrency?
How do database transactions maintain ACID properties, and how do isolation levels impact query concurrency?
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
Describe memory paging, thread execution, and context switching mechanisms within modern operating systems.
Describe memory paging, thread execution, and context switching mechanisms within modern operating systems.
Approach
- Say what the runtime actually does before reasoning about the code.
- Name what is shared across threads and what owns each piece of state.
- Identify the window where an invariant is briefly untrue.
- Distinguish a value from a reference to it, and say which one you handed out.
Follow-up
- What happens if two callers reach this at the same time?
- Where could this allocate more than you expect?
Author SQL queries using multi-table JOIN statements, GROUP BY, and HAVING clauses to extract aggregated finan
Author SQL queries using multi-table JOIN statements, GROUP BY, and HAVING clauses to extract aggregated financial analytics.
Approach
- Name the grain you start from and join outward from it.
- Check whether any join is one-to-many before aggregating, or the sums inflate.
- Say which index the query would use, and what makes it unusable.
- Handle the rows that do not match: that is usually the actual question.
Follow-up
- How does the query change if that join becomes one-to-many?
- What happens to this when the table is ten times larger?
Find version gaps and relay lag with window functions
outbox_event holds event_id, aggregate_type, aggregate_id, aggregate_version, event_type, payload, status ('pending','published','dead'), attempts, created_at, published_at. A projection is missing rows and you must decide whether the relay skipped events or the consumer dropped them. Write three queries over the last seven days: one listing every aggregate_id whose published aggregate_version sequence has a hole, one giving per-day counts with a running total, and one returning the newest published event per aggregate. For each, say where the window function is evaluated relative to WHERE and LIMIT. PostgreSQL 16.
Approach
- Gaps: compute lead(aggregate_version) OVER (PARTITION BY aggregate_id ORDER BY aggregate_version) in a subquery, then filter next_version <> aggregate_version + 1 in the outer query. Window functions are evaluated after WHERE, GROUP BY and HAVING and before the outer ORDER BY and LIMIT, so the predicate cannot sit in the same WHERE clause and PostgreSQL 16 has no QUALIFY.
- Say what the seven-day filter does to the answer: it truncates every partition, so the first row per aggregate has no predecessor inside the window and a hole spanning the boundary is invisible. Widen the window, or join to resource.version as the authority for the true maximum.
- Running total: SELECT date_trunc('day', created_at) AS d, count() AS n, sum(count()) OVER (ORDER BY date_trunc('day', created_at) ROWS UNBOUNDED PRECEDING). An aggregate inside a window call is legal because grouping runs before windowing. The grouping key is unique per row here so ROWS and RANGE agree, but write the frame anyway — over ungrouped rows with tied timestamps the default RANGE frame pulls in every peer row and the total jumps.
- Newest per aggregate: DISTINCT ON (aggregate_id) ... ORDER BY aggregate_id, aggregate_version DESC is the cheap PostgreSQL-only form when an index matches that order; row_number() OVER (PARTITION BY aggregate_id ORDER BY aggregate_version DESC) = 1 is the portable form and needs a subquery for the same evaluation-order reason as the gap query.
Follow-up
- Relay failover redelivers events. Does a duplicate break the gap query, and how would you detect one from this table alone?
- Turn the gap check into a continuous monitor rather than a query someone runs after an incident. What does it watch?
Build a production-ready REST API service in Java or Python with database persistence, proper exception handli
Build a production-ready REST API service in Java or Python with database persistence, proper exception handling, and full unit test coverage.
Approach
- Say who the caller is and what they do when the call fails halfway.
- Define the identity of a request so a retry cannot double-apply it.
- Separate accepted, pending, failed and confirmed; they are different facts.
- Design the error taxonomy before the success shape; callers branch on it.
Follow-up
- What happens if the caller retries after a timeout?
- How does a client discover it is on an old version of this contract?
Write a Bash script to parse multi-line log output, extract integer values, and output the computed total.
Write a Bash script to parse multi-line log output, extract integer values, and output the computed total.
Approach
- Clarify what is being asked and what a complete answer contains.
- State your assumptions explicitly before working the problem.
- Say what you would check first and why it is the highest-information step.
- Work from the requirement backwards to the design.
Follow-up
- What assumption would you test first?
- How would you know your answer was wrong?
Design a high-throughput parking lot system, detailing class interfaces, inheritance structures, and database
Design a high-throughput parking lot system, detailing class interfaces, inheritance structures, and database persistence.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Design an AI agent capable of taking user financial requests, routing them to underlying microservices, and va
Design an AI agent capable of taking user financial requests, routing them to underlying microservices, and validating the returned payload.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Explain the four pillars of Object-Oriented Programming (OOP) and contrast interface abstraction with class in
Explain the four pillars of Object-Oriented Programming (OOP) and contrast interface abstraction with class inheritance.
Approach
- Clarify what is being asked and what a complete answer contains.
- State your assumptions explicitly before working the problem.
- Say what you would check first and why it is the highest-information step.
- Work from the requirement backwards to the design.
Follow-up
- What assumption would you test first?
- How would you know your answer was wrong?
Explain how the Token Bucket algorithm works for rate limiting and contrast it with fixed-window counters.
Explain how the Token Bucket algorithm works for rate limiting and contrast it with fixed-window counters.
Approach
- Say who the caller is and what they do when the call fails halfway.
- Define the identity of a request so a retry cannot double-apply it.
- Separate accepted, pending, failed and confirmed; they are different facts.
- Design the error taxonomy before the success shape; callers branch on it.
Follow-up
- What happens if the caller retries after a timeout?
- How does a client discover it is on an old version of this contract?
Walk through a complex technical architecture you designed in a recent project, highlighting scalability and s
Walk through a complex technical architecture you designed in a recent project, highlighting scalability and security choices.
Approach
- Fix the scope first: who calls this, how often, and what they do when it fails.
- Name the read and write paths separately; they rarely have the same bottleneck.
- Choose a partition key and say what query it makes expensive.
- State the consistency you need, and where you are willing to be stale.
Follow-up
- What breaks first when traffic grows ten times?
- How does this behave when that dependency is down for an hour?
Read latency spikes on a sixty-second sawtooth
The cached listing read path serves about 14k reads/second at an 85% hit rate. p99 sits at 35 ms for 57 seconds, jumps to 900 ms for 3, and repeats. During each spike the primary shows several hundred identical listing queries starting within the same millisecond, all carrying one large tenant's id. Cache entries use a 60-second TTL. Give the mechanism, the ordered checks, the fix, and the correctness hazard your fix must not introduce.
Approach
- Match the period to a configured number before theorising about load. A spike every 60 seconds against a 60-second TTL is an entry expiring, and you confirm it by correlating spike timestamps with the entry's write time rather than with the traffic curve. If the period had matched a cron or a GC interval instead, this is a different investigation.
- Establish the concurrency of the miss. Several hundred identical queries in one millisecond means the miss path has no coalescing: every request that arrives between expiry and repopulation recomputes. The herd size is that key's arrival rate times its recompute time, so at 1.2k reads/second for the hot key and a 250 ms recompute you expect about 300 concurrent misses, which matches what is observed.
- Add single-flight on the miss path so one caller per key recomputes under a short-lived lock while the rest wait for its result. Prefer stale-while-revalidate where the read tolerates it: return the expired value immediately and refresh asynchronously, which removes the latency spike rather than serialising it into a queue of waiters.
- De-synchronise the keys. Write TTLs with jitter, for example 60 seconds plus or minus 10%, so a deploy or a mass invalidation does not align every key on the same second and turn a per-key herd into a fleet-wide one.
Follow-up
- The same sawtooth appears on a key that is invalidated on write rather than expired. Is that the same bug?
- How does your answer change if the recompute takes 4 seconds instead of 250 ms?
Built from the rounds and topics Intuit candidates report.
Prepare, practise & reflect
One practical outcome each day. Spend longer where you need it.
0 / 7 done01Map the Intuit loop
- Write out the reported sequence: Online Assessment, Recruiter Screening Call, Build Challenge, Technical Screen, Craft Demo & Virtual Onsite Panel.
- For each round, write one sentence on what it is judging, from the description above, and mark the one you are least ready for.
Deliverable: A one-page map of the 5 reported rounds, with the weakest marked.
02Work Java
- Spend the session on Java, which Intuit candidates report being tested on.
- Write one worked example in Java and time yourself on it.
Deliverable: One timed worked example in Java.
03Work Data Structures & Algorithms (DSA)
- Spend the session on Data Structures & Algorithms (DSA), which Intuit candidates report being tested on.
- Write one worked example in Data Structures & Algorithms (DSA) and time yourself on it.
Deliverable: One timed worked example in Data Structures & Algorithms (DSA).
04Work System Design
- Spend the session on System Design, which Intuit candidates report being tested on.
- Write one worked example in System Design and time yourself on it.
Deliverable: One timed worked example in System Design.
05Answer out loud: Data Structures & Algorithms
- Answer aloud, timed: Implement a topological sort algorithm to solve a complex course scheduling dependency problem.
- Answer aloud, timed: Given a stream of stock price updates, write an algorithm to calculate the running median over a sliding window.
Deliverable: Spoken answers to 2 reported Data Structures & Algorithms question(s), under time.
06Answer out loud: Practical Engineering & Systems Craft
- Answer aloud, timed: Build a production-ready REST API service in Java or Python with database persistence, proper exception handling, and full unit test coverage.
- Answer aloud, timed: Write an asynchronous implementation of a service using Spring Flux or native promises, handling error states and state transitions.
Deliverable: Spoken answers to 2 reported Practical Engineering & Systems Craft question(s), under time.
07Answer out loud: AI Engineering & Prompt Optimization
- Answer aloud, timed: Given a basic system prompt that returns inaccurate responses from an LLM, refactor the prompt to improve output accuracy and consistency.
- Answer aloud, timed: Explain how you would prevent AI-generated code or automated response mechanisms from causing failures in a live production environment.
Deliverable: Spoken answers to 2 reported AI Engineering & Prompt Optimization question(s), under time.
Expand any day for tasks and deliverables. Your progress is saved on this device.
Behavioural rounds judge the decision you made and what it cost.
How do you handle token limits, context window constraints, and latency overhead when integrating generative A
How do you handle token limits, context window constraints, and latency overhead when integrating generative AI APIs into backend microservices?
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Describe a situation where you had a major technical disagreement with a team member and how you reached a res
Describe a situation where you had a major technical disagreement with a team member and how you reached a resolution.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Tell me about a time when a system you deployed failed in production and how you managed the incident response
Tell me about a time when a system you deployed failed in production and how you managed the incident response.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
Describe how you routinely incorporate AI tools into your daily software engineering workflow to improve code
Describe how you routinely incorporate AI tools into your daily software engineering workflow to improve code quality.
Approach
- Pick a story where you made the decision, not one where you watched it.
- State the situation in two sentences and spend the rest on the reasoning.
- Give the blast radius: what could have broken, and what you measured.
- Name the disagreement and how you resolved it with evidence.
Follow-up
- What would you do differently if you ran that again?
- How did you know your change caused the improvement?
- 01
How do you handle token limits, context window constraints, and latency overhead when integrating generative AI APIs into backend microservices?
- 02
Describe a situation where you had a major technical disagreement with a team member and how you reached a resolution.
- 03
Tell me about a time when a system you deployed failed in production and how you managed the incident response.
- 04
Describe how you routinely incorporate AI tools into your daily software engineering workflow to improve code quality.
How difficult is the Intuit interview process compared to other tech companies?
The process is moderate to challenging. While the DSA questions typically fall in the LeetCode Medium range, Intuit places a much higher emphasis on practical application building (Build Challenge / Craft Demo), CS fundamentals, and modern AI tool usage than many traditional Big Tech firms.
Intuit Software Engineer candidate reports ↗What is the role of Uptime Crew or third-party assessment services in the hiring pipeline?
Intuit partners with external recruitment and assessment teams (like Uptime Crew or Karat) to conduct early-stage evaluations, including the initial Online Assessment, recruiter screens, and Build Challenge reviews. Candidates who successfully clear these technical gates are handed over to internal Intuit engineering panels for the final loops.
Intuit Software Engineer candidate reports ↗What is expected during the Craft Demo round?
The Craft Demo involves completing a real-world coding project (either a take-home assignment or live machine coding repo) and presenting your solution to an engineering panel. You will explain your system design, choice of data structures, async patterns, unit test coverage, and answer deep-dive questions about trade-offs and scalability.
Intuit Software Engineer candidate reports ↗How deeply does Intuit test AI capabilities?
Intuit tests AI capabilities at both a practical workflow level (how you use AI tools to write and test code) and a technical conceptual level (prompt engineering, handling model non-determinism, API rate limits, and designing agentic integrations).
Intuit Software Engineer candidate reports ↗How long does the full interview process take from application to offer?
The interview process typically takes between 3 to 6 weeks. Timelines can vary depending on the candidate's speed in completing the take-home Build Challenge and panel availability for the final interviews.
Intuit Software Engineer candidate reports ↗How hard is the Intuit interview?
Candidates most commonly rate Intuit interviews as medium, based on 928 reported interviews. About 30% of candidates who interview go on to receive an offer.
Intuit Software Engineer candidate reports ↗What topics does Intuit test in interviews?
Intuit interviews most often cover Python, SQL, Functional Programming, Strategy Pattern, and System Design. The exact emphasis depends on the specific role you apply for.
Intuit Software Engineer candidate reports ↗Is Intuit a good place to work?
Employees rate Intuit 3.6 out of 5 overall, based on aggregated workplace reviews spanning career growth, work-life balance, compensation, culture, and management.
Intuit Software Engineer candidate reports ↗Where is Intuit headquartered?
Intuit is headquartered in Mountain View, CA.
Intuit Software Engineer candidate reports ↗Sources & methodology 3 sources ↗
Official role evidence, timestamped platform data and clearly labeled preparation advice.
- 01Intuit Software Engineer candidate reports ↗
Company-reported rounds, questions and FAQ.
candidate · Accessed 2026-09-22 - 02PracHub Software Engineer practice ↗
PracHub practice material, not company-reported.
platform · Accessed 2026-09-22 - 03PracHub preparation framework ↗
PracHub preparation guidance.
platform · Accessed 2026-09-22