Test version. Listings marked Example are made up for testing and are not real services. Please don’t rely on this site for drug checking yet. Feedback: m@a.cab

Open data

Use the atlas data

The atlas’s public listings, upcoming events and labs are available as JSON, free to reuse for non-commercial purposes. Build a local map, a chatbot answer or a printed leaflet: just say where the data came from.

Endpoints

Open data endpoints
URLWhat it returns
/api/v1/services.jsonEvery live listing in the open data
/api/v1/events.jsonUpcoming published events of those listings
/api/v1/labs.jsonThe lab registry
/api/v1/places.jsonThe finder’s place index: regions and countries, and links to its parts (?part=names, more, zips, fsa)
/api/v1/coverage/<slug>.geojsonWhere one listing reaches people, as GeoJSON
/api/v1/coverage.geojsonWhere every live listing in the open data reaches people, as one GeoJSON file

What is in it. Only what each program leaves public. A program can keep any of its answers off its public listing (some funders restrict what may be advertised), and those are never in these files. A program can also keep its whole listing out of this download: it is still on the site, in the finder and on the map, but not in these files. The finder reads its own feed (/api/v1/finder/…) for that; it is for this site’s pages only and is not open data.

Hidden areas still match searches. Where a team travels, where a mail-in service takes mail from, and who may post a sample can be kept off a listing and still be matched by searches. They are shown nowhere: not on the listing, the result cards or the map. Because the finder matches in your browser, they are included, not displayed, in its search data (/api/v1/finder/services.json, under match_only), where anyone who reads that file can see them. They are never in the open data.

All endpoints are read-only GET requests. No key or account is needed, responses can be cached for five minutes, and each carries an ETag so you can ask with If-None-Match and get a short 304 when nothing changed. Cross-origin requests are allowed. Please don’t poll more than once every few minutes.

Each JSON file has the same envelope: generated_at, license, license_url, license_note, attribution, count, and the list itself.

Example

curl https://a.cab/api/v1/services.json

{
  "generated_at": "2026-10-09T17:00:00+00:00",
  "license": "CC BY-NC 4.0",
  "attribution": "A.CAB (Atlas of Community Analysis Bureaus), https://a.cab",
  "count": 1,
  "services": [{
    "slug": "example-drug-checking",
    "name": "Example Drug Checking",
    "country": "US", "region": "US-CA",
    "ways": {"walkin": true, "events": false, "mail": false},
    "methods": ["Fentanyl test strips", "Xylazine test strips", "Other test strips", "FTIR"],
    "strips_other": "Ketamine strips",
    "offers": [{"way": "walk", "method": "FTIR", "via": "self", "lab": null, "measures": false}],
    "cost": "free", "quantifies": "",
    "supplies": ["Naloxone (Narcan)", "Sterile syringes", "Wound care supplies", "Other"],
    "supplies_other": "Bus passes",
    "other_services": ["Peer support"],
    "sites": [{"city": "Oakland", "region": "US-CA", "area": "US-06001",
               "visibility": "full", "street": "1 Example Street",
               "lat": 37.77, "lon": -122.22, "approximate": false,
               "hours": {"Tue": {"open": true, "from": "16:00", "to": "20:00"},
                         "Thu": {"open": true, "from": "10:00", "to": "14:00", "appointment": true}},
               "timezone": "America/Los_Angeles"}],
    "coverage": {"site": ["US-06001"], "travel": [], "mail": []},
    "id_check": "no",
    "verified_at": "2026-09-14T17:00:00+00:00",
    "timezone": "America/Los_Angeles",
    "updated_at": "2026-10-02",
    "confirmed_at": "2026-09-14",
    "out_of_date": false
  }]
}

Listings: services.json

slug, name, parent, description
Identity. The listing’s page is https://a.cab/s/<slug>.
country, country_name, region
ISO country code; region codes look like US-CA or CA-ON.
website, socials, contact
The service’s public website, social links (platform, handle, url), and how to reach them. A service’s phone numbers and email addresses are not in the contact fields (nor in links that are one, such as a wa.me or email booking link), so they cannot be harvested from them: each service’s page shows them to a person who presses its “Show phone and email” button. Free-text fields such as description and notes are published as the service wrote them. The data says whether a service has them (contact.has_email, contact.has_phone, and contact.revealable when its page has anything to show on request), and what the phone takes (contact.phone_takes: calls, texts). Messaging apps are in contact.messaging (app, name, handle, and a url for apps that have web links, such as Telegram and Threema); an app reached by a phone number or an email address, such as WhatsApp, has hidden true and no handle or link. contact.links_hidden is true when the website or the “Other” social link is itself a phone number or an email address, and is left out of website and socials.
ways
How people reach them: walkin, events (events and outreach) and mail.
testers, methods, offers
Who tests (self, a partner lab, or a handout people use themselves), every method, and each method by way and tester, honouring “not at events” style exceptions. An offer’s measures is true when it can say how much of a drug is in a sample (a measuring method, and for a registry lab only when the lab says it measures); an offer from a partner lab the service didn’t name, or whose methods it wasn’t sure of, has method null.
Method names
Test strips by kind: Fentanyl test strips, Xylazine test strips, Medetomidine test strips, Benzodiazepine test strips, Nitazene test strips and Other test strips (a listing saved before each kind was named may use Other test strips for xylazine, benzodiazepine and nitazene strips together; when its hand-out answer shows that, strips_other says “xylazine, benzos, nitazenes” until the service names them); Reagent tests; instruments used on site: FTIR, Raman, Paper spray MS; and lab instruments: GC-MS, LC-MS / HPLC, DART-MS, NMR.
strips_other, method_other, handout
Which other test strips, as the service wrote it (only when Other test strips is among its own methods or what it hands out; may be empty); any other method it named; and what it hands out for people to test their own (the strip names above, or Reagent kits).
labs, unlisted_labs
Partner labs from the registry, and how many other labs they use that A.CAB has not yet confirmed (not named).
quantifies
Whether they can say how much of a drug is in a sample: yes, some (for some drugs), no, or empty. Only a service that offers a method able to measure (GC-MS, LC-MS / HPLC, NMR, Paper spray MS, itself or at a partner lab that says it measures) has yes or some: FTIR, Raman and DART-MS alone can’t.
waits, forms, results
Typical wait by tester (self, or a lab’s name), the sample forms they take, and how results are given.
sites
Walk-in sites. visibility is full (street and exact pin), area (city and an approximate pin rounded to about 1 km) or hidden (only the county served: no city, street or pin). Also hours by weekday (Mon to Sun, each open, from and to as 24-hour HH:MM local time; to earlier than from runs past midnight, the same time means all day; "appointment": true means that day is by appointment only during those hours, and when visit is appointment every listed day is), IANA timezone, visit (dropin, appointment, both), booking (a web link; a site booked by email, or through a link that is a phone number such as wa.me, has booking_hidden true instead, and booking_by_email true when it is by email; organizers has the same fields) and access.
event_kinds, travel, organizers
For outreach teams: the kinds of events they do, the areas they travel to and what event organizers need to know.
mail
For mail-in services: how (codes) and how_labels, the analysing lab (lab_unlisted is true when it is a lab A.CAB has not confirmed yet, which is not named), and the areas they post to.
supplies, supplies_other
What people can take home for free besides test kits (those are in handout), in this order and these words: overdose response (Naloxone (Narcan), Rescue breathing masks); safer use (Sterile syringes, Injection supplies (cookers, cottons, tourniquets), Sharps containers, Safer smoking supplies, Safer snorting supplies, Other safer-use supplies); sexual health (Safer sex supplies (condoms, lube), Pregnancy tests, Emergency contraception, HIV self-tests); health and hygiene (Wound care supplies, First aid kits, Hygiene kits, Period products); basic needs (Food and snacks, Water, Clothes, Socks and underwear, Blankets and sleeping bags, Tents, Hand warmers, Phone chargers); and Other, with what else in supplies_other as the service wrote it (may be empty). What they usually have: stock changes. A program can keep any one of them off its listing, and then it is not here. Data downloaded before these fields were added had naloxone and safer-use supplies in other_services (Naloxone, Safer-use supplies); they are here now, as Naloxone (Narcan) and Other safer-use supplies.
cost, fee, currency, limits, for_friend, languages, other_services, notes
Practical details: free, sliding or fee (empty: ask them); who can use it; whether you can bring a sample for a friend (Yes, No or empty); other services alongside testing (such as Naloxone training, Drug education or counselling, Referral to treatment, Medical care, Peer support: services only, never supplies); and more. (Earlier versions also had legal, which is no longer published.)
results_published, alert_networks
Where they publish what they find, and alert networks they share with.
coverage
Area codes by kind: site (a site’s county), travel and mail. Codes are countries (US), regions (US-CA), US counties by FIPS (US-06001) or Canadian census divisions (CA-3520).
id_check
Whether people have to show ID to get a sample checked: no, age (only to check age, and nothing is written down) or yes. Listings from before the question was asked are no: they had told A.CAB they never asked for ID.
promise, verified_at, updated_at, confirmed_at, timezone, out_of_date
What every listed service has told A.CAB about privacy (the same words on every listing: A.CAB volunteers check each listing, but can’t inspect how a service runs day to day), when an A.CAB volunteer last checked the listing, the date (YYYY-MM-DD) its details last changed, the date the service last confirmed it (every 4 months, or once a year for a small team), the time zone those two dates are given in (the listing’s own, an IANA name such as America/Los_Angeles), and whether the confirmation was long enough ago that it may be out of date.

Events: events.json

id, title, starts_on, ends_on (dates), start_time, end_time (local HH:MM), timezone, venue, city, region, area and their labels, lat/lon, methods the team brings, audience (public or ticket holders), notes, url, and the host listing’s slug and name.

Labs: labs.json

id, name, aliases, operator, country, region, website, access (who can send samples), methods, quantifies, turnaround, cost, results_url, and checked: the date (YYYY-MM-DD) a volunteer last checked the entry again, in the quarterly check, or null before its first one.

Coverage: coverage/<slug>.geojson

A GeoJSON FeatureCollection with one feature per area. US counties have a generalised outline (from the US Census Bureau’s 1:20,000,000 cartographic boundaries); Canadian census divisions have an approximate point; a whole region or country has no geometry. Properties: area, label, kind (site, travel, mail), level.

coverage.geojson has the same features for every live listing in the open data, one per area, with the listings that reach it as services (a list of slug and kind).

Licence

Since 21 October 2026 the directory data is published under the Creative Commons Attribution-NonCommercial 4.0 licence (CC BY-NC 4.0): share and adapt it, with credit, but not for commercial purposes. Data downloaded before 21 October 2026 was released under CC BY 4.0, and those copies keep that licence. Credit “A.CAB (Atlas of Community Analysis Bureaus)” with a link to this site. The place index is built from US Census Bureau data (public domain) and GeoNames (CC BY 4.0), and stays under CC BY 4.0. Canadian census divisions: Source: Statistics Canada, Standard Geographical Classification (SGC) 2021. Reproduced and distributed on an “as is” basis with the permission of Statistics Canada. Files that include Canadian areas carry this statement in their attribution; please keep it when you reuse them.

Listings change. Please show when you fetched the data, and point people to the listing page for the latest details.