Cite as
Addai, D., SectraTEK Lab (2026). What the OfferUp app leaves on an iPhone. LAB-0008, version 1.0. https://lab.sectratek.com/research/lab-0008/
Methodology note
Drafted with AI assistance and reviewed by the author before publication.
Summary
- OfferUp's listings, chat, offers and meet-up arrangements are held by the service. In the two containers that carry the app we found no listing, no chat message and no meet-up detail in any store the parser reads.
- What is on the phone is narrower: account and device identifiers, search and posting areas, recent searches, listing identifiers kept for the feed, unsent chat drafts, session timing and a small cache of requests.
- Public records describe offenders using marketplace sales to lure sellers and buyers into robberies. They describe the offenders' conduct, and the app is a legitimate service used by millions.
- An empty chat or listing table is "cannot say", not "no contact". The phone cannot answer that question, and the service can.
- Counts here describe two containers from research images. They are not rates.
What the app does and who uses it
OfferUp is a mobile marketplace for buying and selling, mostly locally. Its App Store listing describes a place to buy and sell new and secondhand goods such as furniture, electronics, clothing and used cars. Items can be filtered by category, price and location. Buyers and sellers message each other inside the app, and ratings and profiles are there to build trust. People can meet in person or search nationwide. The listing carries an age rating of 16+ and about 4.4 million ratings. The company's own page adds jobs, rentals and services, and states more than 40 million active users and more than 30 million transactions a year. Those are the company's figures, and we have not checked them.
Its legitimate users are ordinary: someone clearing a garage, a small seller, a family buying a used car. For the meeting stage, OfferUp announced Community MeetUp Spots in 2017: public, well-lit places under surveillance, set up with local police, with more than 450 signs installed since the summer of that year. It then said it worked with more than 800 police departments. The app's scheduling tool helps people find a verified spot.
The point for an examiner is in that description. The app is a front end to a service. The listing, the other person's profile and the conversation are things the service holds and the app shows. That shapes everything below.
Why this app matters to an examiner
A marketplace sale ends in a meeting between strangers, often with cash or a valuable item. Police and prosecutors have described offenders turning that into a lure. Figure 1 sets out the public record we read, with the publisher and date of each item. Each statement belongs to its source.
In Seattle, a police blotter post of 1 July 2021 said detectives were investigating a series of armed robberies connected to OfferUp sales. It described three incidents in June 2021 during attempted vehicle and motorcycle sales and purchases, with gunfire in one and a victim pistol-whipped in another. A local news report the same day gave the dates as 14, 24 and 29 June. It carried no statement from OfferUp. Police advised caution and pointed to the parking lots of three precincts as places to meet. In September 2021, a television report said Seattle police warned sellers to meet in public, in daytime, and to tell someone where they were going.
At federal level, a Tampa Free Press report of 14 August 2024 on a sentencing in the Southern District of Florida said four men were sentenced for robbing people who had listed electronics for sale through OfferUp. According to that report, the conduct ran from September to October 2022: the men contacted sellers as interested buyers and robbed them at arranged meeting places, and the sentences ranged from nearly four years to 28 years. The report names the FBI's Miami office and the Plantation Police Department as investigators. The U.S. Attorney's Office for that district has published releases on the case. The Lab's automated fetch could not load those pages, so this article does not rely on them, and a reader should read them directly.
Category-level sources describe a second kind of misuse, fraud on sellers. The Federal Trade Commission's consumer advice for online sellers, published 27 July 2022, describes fake payment notices, claimed overpayments and requests for verification codes, and suggests selling locally and taking cash. A February 2025 FTC alert describes fake checks sent to people selling cars online. Neither names OfferUp. We cite them as context for the category, and do not suggest they concern this app.
The two kinds leave different traces. A robbery lure runs through a listing, a chat and a place. A payment scam runs through a chat and a payment. In both, the part an examiner most wants sits with the service.
| Date | What the source says | Publisher | Kind of source |
|---|---|---|---|
| 2017-11-16 | OfferUp announces Community MeetUp Spots: public, well-lit places under surveillance, set up with local police. More than 450 signs since summer 2017, and work with more than 800 police departments. | OfferUp, through PR Newswire | Company statement |
| 2021-07-01 | Seattle police say detectives are investigating armed robberies connected to OfferUp sales. Three incidents in June 2021. Precinct parking lots offered for meetings. | Seattle Police Department blotter; KOMO News | Police statement |
| 2021-09-08 | Seattle police warn sellers: meet in public, in daytime, and tell someone where you are going. | FOX 13 Seattle | News report |
| 2022-07-27 | FTC advice for online sellers: fake payment notices, overpayment requests, verification-code requests. No platform named. | Federal Trade Commission | Regulator, category |
| 2024-08-14 | Report of a federal sentencing in the Southern District of Florida: four men sentenced for robbing people who listed electronics on OfferUp, September to October 2022. | Tampa Free Press | News report of a court outcome |
| 2025-02-27 | FTC alert on fake checks sent to people selling cars online. No platform named. | Federal Trade Commission | Regulator, category |
Why the Lab chose it
We compared the apps found in the Lab's research images with what the open-source iLEAPP parser reads. Across the 9 distinct iPhone images, 731 non-stock apps appeared; 51 were parsed by iLEAPP, 4 partly, and 676 not at all (against the project's main branch on 6 November 2026). We ranked the gaps by public-record relevance. OfferUp came third of ten.
That ranking rests on app-specific sources, namely the Seattle statements and the Florida case, and not on category context alone. It does not rest on how often the app turns up: it is in only 2 of the 9 images, which is also why the parser was built from two containers, not twenty. The ranking is a judgment about usefulness to an examiner. It is not a measure of how common misuse is. The inventory counted 36 database-like files, 85 JSON files and 688 media files for the app, and most of the container's files are image caches.
Method
We worked read only on research images. For each container we listed the files, identified the store formats, and recorded schema names and counts, never values. Four store families carry the app's own state: redux-persist and Statsig data held in MMKV files, React Native AsyncStorage (a manifest plus overflow files), the app's preference file, and the URL cache database. A fifth, a Core Data database, had four tables with no rows, and the Apollo cache file was empty in both images.
We then wrote an iLEAPP module that reads seven artifacts and tested it on synthetic containers we generate: one shaped like the newer build, one like the older, and a decoy container from a different app that uses the same Documents/mmkv folder names, which must produce no rows. The module accepts MMKV stores only from a container that its metadata file or a bundle-named path identifies as OfferUp. Thirteen of thirteen test-case units pass, ten unit tests pass, and the project's own claim-language, path and safety checks pass. No data from any research image leaves the Lab, and the fixtures are invented.
One method point matters for readers. The module, like most parsers, returns an empty table with no error when a store is missing or unreadable. The Lab's earlier study of silent parser failures found that about 18 percent of the iOS artifacts of one open-source suite matched a file and returned nothing (LAB-TR-0006). Our module's notes therefore say which store each artifact needs, so that an empty result can be told apart from a store that was never there. LAB-0005 sets out the four states we use: present, absent, unreadable and cannot say.
What is on the device and what is not
Figure 2 follows a sale from search to rating and asks, at each step, what the service does and what the phone keeps. The right-hand column is short, and the later rows are empty.
| Stage | What the service does | What the phone keeps |
|---|---|---|
| 1. Search and browse | Filters items by category, price and location | Search area, recent searches, listing and category identifiers kept for the feed (newer build) |
| 2. Open a listing | Sends the listing, photos and seller profile | Image cache files, which the parser does not read. Listing text and profile are not in a store it reads. |
| 3. Message | Delivers chat over a realtime connection and holds the conversation | Unsent drafts per conversation key, and connection details in the cache. No messages. |
| 4. Agree and meet | Holds offers; a scheduling tool suggests meet-up spots | Nothing found: no time, place or other party |
| 5. Rate | Holds ratings and profiles | Not established: no store listed |
Figure 3 lets you pick the kind of evidence you hope to find and see where it lives. Tags use words and shapes as well as colour.
This figure needs JavaScript. The table under it holds the same content.
The panel changes as you choose. Counts are those of two containers, not rates.
Show this figure as a table
| Evidence a reader hopes for | Where it lives | What the parser reads | Limit |
|---|---|---|---|
| Chat messages, sent and received | Server-side. On the service. The app receives chat over a realtime connection to a third-party messaging provider and displays it. No store the parser reads holds a message table. | Nothing. Cached realtime requests in the URL cache held connection details only, with no message content, in both images. 0 messages in both images. | An empty result here means cannot say, not no messages. The conversation is held by the service. |
| Unsent chat text | On the phone. React Native AsyncStorage, key chat_draft_message, one entry per conversation key. | Chat Drafts artifact: the conversation key and the draft text. 1 row in one image, 0 in the other. | Only text typed and not sent. Whether the app clears a draft on send is not established, so a draft does not show the message was never sent. The key is not a person's name. |
| Listings the person posted, viewed or saved | Server-side. On the service. The redux stores for the person's own listings and jobs were empty, the Apollo cache was empty in both images, and the four Core Data tables in LRATSDatabase.sqlite had 0 rows. | Nothing. 0 listings in both images. | A listing's title, price, description and photos are not kept in a store the parser reads. Listing identifiers appear only in the feed store (see below). |
| Which listings interested the person | On the phone. redux-persist store feedAffinity: listingAffinities (listing id and category id) and a last-viewed-categories entry. Present only in the newer build. | Listing Affinity artifact. 0 rows in the older build, 20 in the newer. | Identifiers only. Whether an entry means viewed, saved or only suggested is not established. The title and the seller are on the service. |
| Offers, meet-up arrangements and completed sales | Server-side. On the service. | Nothing. No offer, meet-up time, meet-up place or other party was found in any store. 0 in both images. | Do not look for them in this app's container. The report states that no meet-up details are kept on the device in the containers examined. |
| Who the other person is: name, rating, profile | Not established. Not found in the stores the parser reads. The report lists no store for other people's profiles or ratings. | Nothing. Not counted. | The App Store listing describes ratings and profiles as features of the service. Whether the app caches another person's profile anywhere on the device was not established, so do not report it as absent. |
| What the person searched for | On the phone. AsyncStorage keys ou-recent-searches and recent_searches_rentals. In the earlier layout the list sits in the overflow file React Native names with an MD5 of the key. | Recent Searches artifact. 44 rows in the older build, 1 in the newer. | A recent list, not a history. How many entries the app keeps and for how long was not measured. |
| Where the person searched or posted | On the phone. redux store search (location: city, location name, area, state, postal code, latitude, longitude) and AsyncStorage key ou_post_flow_preferences (location and a did-use-GPS flag). | Search and Posting Locations artifact, with KML output. 3 rows in the older build, 2 in the newer. | A chosen or suggested search area. It does not show the phone was there. What the GPS flag means beyond its name was not established. |
| Which account and device | On the phone. redux stores core, onboarding, ads and root; the app's preference file (software development kit identifiers); AsyncStorage key names that carry an account number. | Account and App State artifact: account number read from a key name, advertising identifier, app device identifier, app versions, onboarding steps, push permission state, install times. 28 rows in the older build, 33 in the newer. | An account number shows the app was signed in on this device at some point. It does not show who was using the phone, or when. |
| When the app was used | On the phone. Statsig session records in the MMKV store (session identifier, start, last update), push registration time, prompt counters, last realtime heartbeat, install times in the preference file. | Activity and Timing artifact. 18 rows in the older build, 10 in the newer. | Windows of activity, not a log of actions. Superseded sessions collapse to the latest, so earlier ones are lost. The meaning of one registration-time suffix and one location-timestamp key is not established. |
| What the app contacted | On the phone. Library/Caches/<bundle>/Cache.db, the URL cache. | Cached Network Responses artifact, for OfferUp and the realtime provider's hosts only: status, MIME type, body size and top-level JSON keys, never body text. 11 rows in the older build, 12 in the newer. | A cache is a sample of recent requests, not a record of all of them. Most cache entries are advertising and analytics hosts, which the parser leaves out. |
Table 2 lists the seven artifacts the module produces, with the file or table each is read from, what it holds, its value and its limits.
| Artifact | Source file or table | What it holds | Value to an examiner | Limits |
|---|---|---|---|---|
| Account and App State | MMKV Documents/mmkv/redux (core, onboarding, ads, root stores); AsyncStorage key names; app preference file | Account number, advertising and app device identifiers, versions, onboarding steps, push permission, install times | Ties the container to an account and a device; dates first use | The account number is read from a key name. It does not show who held the phone. |
| Search and Posting Locations | redux search store; AsyncStorage ou_post_flow_preferences | City, area, postal code, latitude and longitude of a search or posting area | Shows the area in which the person looked or posted | A chosen or suggested area, not a position fix. |
| Recent Searches | AsyncStorage ou-recent-searches, recent_searches_rentals; overflow file in the older layout | The recent search terms the app keeps | Shows interest at a point in time | A short list. Length and retention not measured. |
| Listing Affinity | redux feedAffinity store (newer build only) | Listing and category identifiers kept for the feed | Links the phone to listing identifiers the service can resolve | Meaning (viewed, saved, suggested) not established. Identifiers only. |
| Chat Drafts | AsyncStorage chat_draft_message | Unsent text per conversation key | Shows a conversation existed and text was typed | Clearing on send not established. No sent or received messages. |
| Activity and Timing | MMKV statsig; AsyncStorage counters and registration keys; redux root; preference file | Session start and last update, push registration, prompt counters, last heartbeat, install times | Windows in which the app ran | Not a log of actions. Superseded sessions collapse. Some key meanings not established. |
| Cached Network Responses | Library/Caches/<bundle>/Cache.db | For OfferUp and realtime-provider hosts: status, MIME type, body size, top-level JSON keys | Shows which service endpoints the app used | A sample, not a log. No body text. Chat content absent in both images. |
Figure 4 shows how many rows the module read from each container. The counts are not comparable between artifacts, because a row means something different in each. They are comparable between the two builds, and they show the layout shifting: the feed store appears only in the newer build, and recent searches moved from a long list in the older to a single entry in the newer.
Show this figure as a table
| Artifact | Older build | Newer build | Synthetic fixture (current layout) |
|---|---|---|---|
| Account and App State | 28 | 33 | 31 |
| Search and Posting Locations | 3 | 2 | 3 |
| Recent Searches | 44 | 1 | 3 |
| Listing Affinity | 0 | 20 | 6 |
| Chat Drafts | 1 | 0 | 2 |
| Activity and Timing | 18 | 10 | 12 |
| Cached Network Responses | 11 | 12 | 4 |
Several other files exist and are not read. The cache holds mostly advertising and analytics hosts. Other SQLite files belong to software development kits or to the system. A large catalogue of vehicle data sits in one overflow file and is not about the user. Image caches make up most of the container's files, and the module does not interpret them.
What an examiner can and cannot conclude
Can say, with the file and key named. The app was installed and run on this device, and signed in under an account number at some point. A given area was set as a search or posting area. Certain search terms were in the recent list when the image was taken. An unsent draft existed under a conversation key. The app ran in particular windows of time. It contacted OfferUp and realtime-provider endpoints.
Cannot say from the phone. That a listing existed, that two people messaged, that a meeting was agreed, where or when it took place, or that a sale happened. The container holds none of these, so their absence is "cannot say". A reader who writes "no messages found" without that qualifier reports the limit of the evidence as a fact about the person.
Where the rest is. Records of listings, conversations and arrangements are held by the service. How an investigator obtains them is a legal and procedural question outside this article, and the first step is to record that the phone could not answer it.
Take care with the weak signals. A search area is not the phone's position. An affinity identifier is not proof the person opened that listing. A timing window is not an action. Each is an indicator, consistent with use of the app, and does not prove who was using it or why.
What this does not prove
Read these before you report a finding
- That OfferUp or any person acted wrongly. The public sources describe conduct of third parties who used a legitimate service, and each statement belongs to its publisher.
- That other builds, other iOS versions or managed devices store the same. The counts rest on two containers and two builds.
- That a missing local record shows an event did not occur. Chat, listings and meet-ups are held by the service.
- That a search area shows where the phone was, that an identifier shows what the person viewed, or that a draft shows what was never sent.
- That the app is a common route to harm. The ranking is a judgment about usefulness, and the cases are examples, not rates.
- The vendor can change the stores at any release. Example values here are synthetic.
Sources
Every claim and number, with the publisher and date. Web pages were read on 6 November 2026 unless noted. The U.S. Attorney's Office pages for the Florida case could not be loaded by automated fetch and are not relied on. The OfferUp help-centre pages also could not be loaded, so company statements come from the pages listed. Numbers that could not be sourced were left out. LAB-TR-0006 is on Zenodo (doi:10.5281/zenodo.23717928).
| Claim or number | Source |
|---|---|
| Local marketplace for new and secondhand goods; filters by category, price and location; in-app messaging; ratings and profiles; local or nationwide; age rating 16+; about 4.4 million ratings; developer OfferUp Inc. | Apple App Store listing, "OfferUp Buy & Sell Marketplace", apps.apple.com/us/app/offerup-buy-sell-marketplace/id468996152. Apple. Read 2026-11-06. |
| Buy and sell, jobs and rentals, services; more than 40 million active users; more than 30 million annual transactions (company figures); profiles, ratings and in-app chat before meeting. | OfferUp, company page, about.offerup.com. OfferUp. Undated. Read 2026-11-06. |
| Community MeetUp Spots: public, well-lit places under surveillance, with local police; more than 450 signs since summer 2017; work with more than 800 police departments; scheduling tool finds a verified spot. | OfferUp, "OfferUp announces Community MeetUp Spots program", PR Newswire, 2017-11-16. |
| Detectives investigating armed robberies connected to OfferUp sales; three incidents in June 2021 during vehicle and motorcycle sales and purchases; gunfire in one, pistol-whipping in another; precinct parking lots offered for meetings. | Seattle Police Department, SPD Blotter, "SPD investigating armed OfferUp robberies", spdblotter.seattle.gov, 2021-07-01. |
| Incident dates 14, 24 and 29 June 2021; police urge caution; report carried no statement from OfferUp. | KOMO News, "Seattle Police warn of armed OfferUp robberies", komonews.com, 2021-07-01. |
| Seattle police advice to sellers: meet in public, in daytime, tell someone where you are going. | FOX 13 Seattle, "Seattle police warning of several online marketplace armed robberies", fox13seattle.com, 2021-09-08. |
| Four men sentenced in the Southern District of Florida for robbing people who listed electronics through OfferUp; conduct September to October 2022; contacted as buyers, robbed at arranged places; sentences from nearly four years to 28 years; FBI Miami and Plantation Police Department investigated. | Tampa Free Press, "Four Florida men sentenced to federal prison for OfferUp online marketplace robberies", tampafp.com, 2024-08-14. A news report of a court outcome. |
| Fake payment notices, overpayment requests and verification-code requests aimed at online sellers; sell locally and take cash where possible. | Federal Trade Commission, Consumer Advice, "Selling stuff online? Here's how to avoid a scam", consumer.ftc.gov, 2022-07-27. Category context; no platform named. |
| Fake checks sent to people selling cars online. | Federal Trade Commission, Consumer Advice, "Fake check scam targets online car sellers", consumer.ftc.gov, 2025-02-27. Category context; no platform named. |
| 731 distinct non-stock apps in 9 distinct images; 51 parsed by iLEAPP, 4 partly, 676 not; OfferUp ranked third of ten; present in 2 of 9 images; 36 database-like, 85 JSON and 688 media files; OfferUp builds 2026.3.0 and 2026.9.0. | Lab iOS app inventory, report and inventory table, 2026-11-06 (iLEAPP main branch, 512 plugin files). |
| Store families and schema names; Core Data tables with 0 rows; empty Apollo cache; no listings, chat or meet-up details; chat over a realtime provider; cached bodies held connection metadata only; row counts per artifact (28/33, 3/2, 44/1, 0/20, 1/0, 18/10, 11/12); feed store only in the newer build; empty table with no error on a missing store; meanings not established. | Lab parser report for OfferUp, 2026-11-06. Aggregate counts and schema names only. |
| Synthetic fixture rows 31, 3, 3, 6, 2, 12 and 4; two layouts and a decoy container; 13 of 13 test-case units and 10 unit tests pass. | Lab parser report for OfferUp; Lab contribution guide for the OfferUp module, 2026-11-06. |
| About 18 percent of the iOS artifacts of one suite matched a file and returned nothing. | LAB-TR-0006, Abstract (Zenodo, concept DOI 10.5281/zenodo.23717928). |
Version history and corrections
| Version | Date | Change |
|---|---|---|
| 1.0 | 2026-11-06 | First publication. |
Corrections log
No corrections have been published for this article. Corrections to any article are listed on Corrections, with the version they apply to.