Research / LAB-0008

What the OfferUp app leaves on an iPhone

OfferUp is a legitimate local marketplace, and public records describe third parties using marketplace sales as a lure for robbery. An examiner who opens the app on a seized or surrendered iPhone hopes for the chat, the listing and the meeting. This article shows that those live on the service, and what the phone does keep instead.

  • Daniel Addai, SectraTEK Lab
  • Version 1.0
  • 2026-11-06
  • CC BY 4.0
  • Early research

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/

Citation guide

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.

Figure 1. Dated public record about marketplace sales and misuse, with the publisher and the kind of source
DateWhat the source saysPublisherKind of source
2017-11-16OfferUp 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 NewswireCompany statement
2021-07-01Seattle 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 NewsPolice statement
2021-09-08Seattle police warn sellers: meet in public, in daytime, and tell someone where you are going.FOX 13 SeattleNews report
2022-07-27FTC advice for online sellers: fake payment notices, overpayment requests, verification-code requests. No platform named.Federal Trade CommissionRegulator, category
2024-08-14Report 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 PressNews report of a court outcome
2025-02-27FTC alert on fake checks sent to people selling cars online. No platform named.Federal Trade CommissionRegulator, category
Figure 1The public record we read, in date order. The 2024 entry reports conduct in 2022. Entries marked "category" describe online selling in general. Source: the pages listed in Sources. The table is the text alternative.

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.

Figure 2. Stages of a sale, what the service does at each stage, and what the iPhone keeps
StageWhat the service doesWhat the phone keeps
1. Search and browseFilters items by category, price and locationSearch area, recent searches, listing and category identifiers kept for the feed (newer build)
2. Open a listingSends the listing, photos and seller profileImage cache files, which the parser does not read. Listing text and profile are not in a store it reads.
3. MessageDelivers chat over a realtime connection and holds the conversationUnsent drafts per conversation key, and connection details in the cache. No messages.
4. Agree and meetHolds offers; a scheduling tool suggests meet-up spotsNothing found: no time, place or other party
5. RateHolds ratings and profilesNot established: no store listed
Figure 2A sale in five stages. The service does the work at every stage. The phone keeps traces of searching and timing, and nothing of the agreement or the meeting. Source: App Store listing and OfferUp company pages (service side); Lab parser report for OfferUp (phone side). Table is the text alternative.

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.

Show
What you hope to find

The panel changes as you choose. Counts are those of two containers, not rates.

Show this figure as a table
All 11 kinds of evidence: where each lives, what the parser reads from it, and the limit
Evidence a reader hopes forWhere it livesWhat the parser readsLimit
Chat messages, sent and receivedServer-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 textOn 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 savedServer-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 personOn 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 salesServer-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, profileNot 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 forOn 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 postedOn 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 deviceOn 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 usedOn 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 contactedOn 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.
Figure 3Where the evidence a reader hopes for lives: on the phone, on the service, or not established. Source: Lab parser report for OfferUp; App Store listing for the service-side description. Counts are for two containers.

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.

Table 2. The seven artifacts: source, content, value and limits
ArtifactSource file or tableWhat it holdsValue to an examinerLimits
Account and App StateMMKV Documents/mmkv/redux (core, onboarding, ads, root stores); AsyncStorage key names; app preference fileAccount number, advertising and app device identifiers, versions, onboarding steps, push permission, install timesTies the container to an account and a device; dates first useThe account number is read from a key name. It does not show who held the phone.
Search and Posting Locationsredux search store; AsyncStorage ou_post_flow_preferencesCity, area, postal code, latitude and longitude of a search or posting areaShows the area in which the person looked or postedA chosen or suggested area, not a position fix.
Recent SearchesAsyncStorage ou-recent-searches, recent_searches_rentals; overflow file in the older layoutThe recent search terms the app keepsShows interest at a point in timeA short list. Length and retention not measured.
Listing Affinityredux feedAffinity store (newer build only)Listing and category identifiers kept for the feedLinks the phone to listing identifiers the service can resolveMeaning (viewed, saved, suggested) not established. Identifiers only.
Chat DraftsAsyncStorage chat_draft_messageUnsent text per conversation keyShows a conversation existed and text was typedClearing on send not established. No sent or received messages.
Activity and TimingMMKV statsig; AsyncStorage counters and registration keys; redux root; preference fileSession start and last update, push registration, prompt counters, last heartbeat, install timesWindows in which the app ranNot a log of actions. Superseded sessions collapse. Some key meanings not established.
Cached Network ResponsesLibrary/Caches/<bundle>/Cache.dbFor OfferUp and realtime-provider hosts: status, MIME type, body size, top-level JSON keysShows which service endpoints the app usedA 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.

Rows read per artifact in the two containers that carry the app Paired horizontal bars, rows read per artifact. Account and App State: older build 28, newer build 33; Search and Posting Locations: older build 3, newer build 2; Recent Searches: older build 44, newer build 1; Listing Affinity: older build 0, newer build 20; Chat Drafts: older build 1, newer build 0; Activity and Timing: older build 18, newer build 10; Cached Network Responses: older build 11, newer build 12. Older build Newer build 0 10 20 30 40 Account and App State 28 33 Search and Posting Locations 3 2 Recent Searches 44 1 Listing Affinity 0 20 Chat Drafts 1 0 Activity and Timing 18 10 Cached Network Responses 11 12 rows read per artifact (a row means something different in each artifact)
Show this figure as a table
Rows read per artifact in the older build, the newer build and the synthetic fixture
ArtifactOlder buildNewer buildSynthetic fixture (current layout)
Account and App State283331
Search and Posting Locations323
Recent Searches4413
Listing Affinity0206
Chat Drafts102
Activity and Timing181012
Cached Network Responses11124
Figure 4Rows read per artifact in the two containers that carry the app, with the synthetic fixture for reference. Counts of two containers, not rates. Source: Lab parser report for OfferUp (rows read from the two containers; synthetic fixture rows from the Lab's generator).

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).

Sources for the claims and numbers in this article
Claim or numberSource
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 history
VersionDateChange
1.02026-11-06First 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.