This map traces placement paths through Florida foster care — each dot is a placement, sized by how long they stayed. The maps are generated from the real placement history of 346,398 children in Florida's foster care system — a few cases go back as far as 1982, with the full population covered from 2002 through 2025.
Step 1
Pick a case
See an example, browse by group, filter, or enter any AFCARS ID directly
or
or
or
Loading groups…
Want to narrow one of these down further — by age, gender, county, and more? Pick it from the Group dropdown in Filter instead.
–
–
–
Step 2
About the child
Demographics, removal history, and maltreatment codes for this caseCase —
Step 3
See the placement path
Press play to watch placements unfold in order, or step through them yourselfCase —
Round ticks mark each placement; a diamond ◆ marks the first placement of a new removal episode. The ruler below marks roughly when the child turned each age.
Dot size scales with length of stay. Hover a dot for provider, placing agency, length, end reason, and zip. Scroll/drag to zoom and pan.
Step 4
Explore the patterns
Click a row to highlight matching placements on the map aboveCase —
Time Breakdown
Share of time spent in each placement type
Click a row to highlight that category's dots on the map above. Click it again to clear the highlight.
These percentages are of this case's whole timeline, including "Out of System" gaps — so they'll read lower than the Filter's Placement Type percentage for the same category, which only counts days actually spent in a placement.
Placement Endings
Number of placements by how they ended
Click a row to highlight placements that ended that way on the map above. Click it again to clear the highlight.
How this was made — what each stat means
- De-identified data
- This map uses de-identified public-records data. The case identifier is an internal FSFN/AFCARS record ID, not the child's name — see "Caregiver name anonymization" below for how provider names are handled.
- Case ID
- The internal FSFN/AFCARS record ID for this child — not their name. Each option in the Case dropdown was picked at random from a different placement-count bracket (1, 10–24, 30–44, 45–59, 60–74, 75–89, 90–104, 105–119, and 120+ total placement rows), so the set spans very simple to highly complex cases rather than being a typical child.
- Gender / Race & Ethnicity
- From the FSFN demographics table. Race/ethnicity collapses the raw race flags and Hispanic-origin flag into one category, using this priority order: Hispanic → Multiracial → White, non-Hispanic → Black, non-Hispanic → Asian → American Indian → Unknown.
- Placements Mapped / Providers
- Placements Mapped counts placement rows that have a plottable location (see "Excluded From Map" below). Providers counts unique
provider_idvalues across this child's whole placement history. - Age Range
- Date of birth (FSFN demographics) subtracted from the earliest
placement_begin_dateand, separately, from wherever the last placement ends — shown as a span (e.g. "15–18 years") rather than one number, since a long case can cover several ages. Only shown as a clean year-to-year range once both ends are at least 2 years old; a case that starts younger pairs the same "N weeks/months/years" buckets used elsewhere on this page instead (e.g. "3 months – 15 years"). - Time Covered
- The full calendar span from the first placement's start to the last placement's end — this includes out-of-system gaps (reunification, trial home visits, etc.), not just the days actually spent in a placement.
- Distance Moved (est.)
- Straight-line ("as the crow flies") distance between each consecutive mapped placement's zip code, added up across the whole case — not driving distance, and a zip code's geocoded center is itself already an approximation of the actual address. This is meant to give a general sense of scale, not a precise mileage figure. A move immediately before or after a "Not mapped" placement isn't counted, since there's no coordinate to measure from on that end.
- How This Ends
- The
discharge_reasonrecorded for this child's most recent removal episode, grouped into a plain-language outcome (Reunified, Adopted, Guardianship/permanent relative placement, Aged out, Child died, Runaway, Case dismissed by court, or Case transferred to another agency). Reads "Still in care" if the most recent placement has no end date yet, or "Married"/"Entered military service" if the last placement's own end reason was one of those — Florida'sdischarge_reasonfield has no option for either, so those two outcomes can only be read from the placement-level field instead. - Maltreatment Codes
- Every Y/N flag column on the placement-history table (physical abuse, neglect, domestic violence, and so on) that's marked "Y," grouped by removal episode — these flags are recorded per removal, not per placement, so a code only applies to the placements that share that removal_date.
- Time Breakdown chart
- Share of total placement-days spent in each placement category, plus one "Out of System — X" row per reason for the calendar gaps between mapped placements — the same gaps the map animation pauses on. If an administrative placeholder record (e.g. "Statewide Visitation Provider") actually covers the gap, X is that provider's name, spelled out from its all-caps form; otherwise X is inferred from the preceding placement's end reason (Reunification, Guardianship, Runaway, Aged Out, and so on). Those rows are informational only (there's no dot to highlight); click any other row to highlight that category's dots on the map.
- Placement Endings chart
- Count of placements (all rows, including "Not mapped" ones) grouped by
placement_end_reason. Click a row to highlight the placements that ended that way on the map; this and the Time Breakdown filter are mutually exclusive — picking one clears the other. - Map, dots, and animation
- Each dot is one placement, sized by length of stay, with color marking its category. Runaway episodes and placements with no usable zip code don't get their own dot or sequence number, but they aren't invisible — they still show up as an "Out of System" gap in the sequence, animation, and Time Breakdown chart, and are kept in the table below, marked "Not mapped." The Play/Reverse animation grows each dot over its own length of stay, fades completed dots to a trail, and pauses on an "Out of System" banner during those gaps. Playback has no maximum-length cap on purpose — a multi-year placement really does take minutes to play out at slower speeds, so the pacing reflects how long that stretch of time actually was. The scrubber jumps directly to any step if you don't want to wait it out.
- Caregiver name anonymization
- Any provider name recorded in "Last, First" format is treated as a personal name and abbreviated to initials (e.g. "Jones, Patricia" → "Pat. Jon."). Provider names without a comma (group homes, shelters, and other institutional providers) are shown as recorded.