PHPackages                             code4recovery/spec - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. code4recovery/spec

ActiveLibrary[API Development](/categories/api)

code4recovery/spec
==================

The goal of the Meeting Guide API is help sync information about AA meetings. It was developed for the Meeting Guide app, but it is non-proprietary and other systems are encouraged to make use of it.

v1.1.9(2mo ago)34129↑215.8%12[4 issues](https://github.com/code4recovery/spec/issues)[1 PRs](https://github.com/code4recovery/spec/pulls)MITPHPPHP &gt;=7.4

Since Feb 25Pushed 2mo ago15 watchersCompare

[ Source](https://github.com/code4recovery/spec)[ Packagist](https://packagist.org/packages/code4recovery/spec)[ RSS](/packages/code4recovery-spec/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (9)DependenciesVersions (11)Used By (0)

Meeting Guide API
=================

[](#meeting-guide-api)

The goal of the Meeting Guide API is help sync information about AA meetings. It was developed for the [Meeting Guide app](https://www.aa.org/meeting-guide-app), but it is non-proprietary and other systems are encouraged to make use of it.

If you have feedback, please put an issue on this repository.

Usage
-----

[](#usage)

To implement the API on your server, create a script that can take information from your database and format it in the correct specification (see below).

Your data must not break anyone's anonymity. No last names should be used in meeting data.

You may test your feed with the [Meeting Guide JSON Feed Validator](https://meetingguide.org/validate). Once it's ready, or if you have questions, see [How to Connect to Meeting Guide](https://meetingguide.helpdocs.io/article/g0ykqkdq0u-connecting-to-meeting-guide-step-by-step).

If you would like to share your script, we'll include a copy in this repository so that it might help future users.

Specification
-------------

[](#specification)

The JSON file is expected to contain a simple array of meetings. [Here is an example](https://sheets.code4recovery.org/storage/12Ga8uwMG4WJ8pZ_SEU7vNETp_aQZ-2yNVsYDFqIwHyE.json) of a live JSON feed.

```
[
	{
		"name": "Sunday Serenity",
		"slug": "sunday-serenity-14",
		"day": 0,
		"time": "18:00",
		"end_time": "19:30",
		"location": "Alano Club",
		"group": "The Serenity Group",
		"notes": "Ring buzzer. Meeting is on the 2nd floor.",
		"updated": "2014-05-31 14:32:23",
		"url": "https://district123.org/meetings/sunday-serenity",
		"types": [
			"O",
			"T",
			"LGBTQ"
		],
		"address": "123 Main Street",
		"city": "Anytown",
		"state": "CA",
		"postal_code": "98765",
		"country": "US",
		"approximate": "no",
		"entity": "District 123",
		"entity_email": "info@district123.org",
		"entity_location": "Example County, California",
		"entity_logo": "https://district123.org/images/logo.svg",
		"entity_phone": "+1-123-456-7890",
		"entity_url": "https://district123.org",
		"feedback_emails": [
			"meetingupdates@district123.org"
		],
	},
	...
]
```

Table Format
------------

[](#table-format)

Alternately, the data can be in a table format, such as in a Google Sheet ([template](https://docs.google.com/spreadsheets/d/1iA8oVtddHVEZ8gslWPlTrfBfbgJpiS0Tt6sFOTi_5dk/edit#gid=687617754)). The first row should be a header row, and the columns can be in any order. The column names should be plain-language versions of the JSON keys, for example `conference_url` becomes `Conference URL`. Column names currently must be in English, but the data can be in any language.

Field Definitions
-----------------

[](#field-definitions)

### Required Fields

[](#required-fields)

Many fields can be included in a meeting listing, but only two are required in each one: `name` and `slug`. When an optional field does not apply to a meeting it can be omitted.

#### `name`

[](#name)

Name is a required string. It should be the meeting name, where possible. Some areas use group names instead, although that's more ambiguous. 255 characters max. Best practices for meeting names:

- make the name fewer than 64 characters so it's not truncated in the app.
- don't include information that can be contained elsewhere in the listing, such as the day, time, and type
- avoid using the words `AA` and `meeting` in the name, because it is redundant

#### `slug`

[](#slug)

Slug is required, and must be unique to your data set. It should preferably be a string, but integer IDs are fine too. This is the primary key for the meeting, and is used to identify the meeting in the app, and to form bookmark URLs. It should be URL-safe, and not contain spaces or special characters. It should be 64 characters max, but ideally shorter. Usually it is a representation of the meeting name. When a name belongs to several meetings, a number can be used to disambiguate, for example `sunday-serenity-7`.

When using a Google Sheet, this field is should be called `ID`.

### Time Fields

[](#time-fields)

Some meetings are "by appointment" and do not have a specific time. For weekly meetings, `day` and `time` are required.

Note: the Meeting Guide spec is to be used for weekly meetings only. It is recommended to use a separate page to list monthly or non-recurring meetings.

The Meeting Guide app only displays meetings that have a day and time. TSML UI displays appointment meetings at the bottom.

#### `day`

[](#day)

Day is required for meetings that are not by appointment and may be an integer or an array of integers 0-6, representing Sunday (`0`) through Saturday (`6`).

#### `time`

[](#time)

Time is required for meetings that are not by appointment and is a five-character string in the `HH:MM` 24-hour time format.

#### `end_time`

[](#end_time)

End Time is an optional five-character string in the `HH:MM` 24-hour time format. The Meeting Guide app and TSML UI use this value when present when adding a meeting to a user's calendar. Also TSML UI uses this to display a "meetings in progress" banner at the top. It will default to one hour after the start time if omitted.

#### `timezone`

[](#timezone)

Timezone is an optional string in [tz database format](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (for example `America/New_York`). This is helpful when displaying meetings in a variety of time zones using TSML UI.

### Geographic Fields

[](#geographic-fields)

To be listed in the Meeting Guide app, meetings must also have some geographic information. This can be either in the format:

```
"formatted_address": "4953 W Addison St, Chicago, IL 60641, USA"
```

or separated into individual fields:

```
"address": "4953 W Addison St",
"city": "Chicago",
"state": "IL",
"postal_code": "60641",
"country": "US"
```

Take special care to strip extra information from the address, such as 'upstairs' or 'around back,' since this is the primary cause of geocoding problems. That information belongs in the `notes` field, see below.

Online meetings may have an approximate address (for example `Chicago, IL, USA`), but in-person meetings must have a specific address.

### Region Fields

[](#region-fields)

#### `region`

[](#region)

Region is an optional string that represents a geographical subset of meeting locations. Usually this is a neighborhood or city. District numbers are discouraged because they require special program knowledge to be understood. This is ignored by the Meeting Guide importer but helpful for TSML UI.

#### `sub_region`

[](#sub_region)

Sub Region can be used when `region` is present to further specify the location. This is ignored by the Meeting Guide importer but helpful for TSML UI.

#### `regions`

[](#regions)

Regions can be used instead of Region and Sub Region to support any number of hierarchical regions. For example:

```
"regions": ["Illinois", "Chicago", "Wicker Park"]
```

When using regions, the most general region is first, and the most specific is last. There should be variation among your top-level regions. For example, a statewide meeting finder whose meetings were all within Illinois should not include `Illinois` as the top level. A region that's shared across all meetings should be omitted.

When using a Google Sheet, you may separate multiple regions with a `>`.

Online meetings may belong to geographic regions, which represents the origin or affinity of the meeting, even if its members may be more geographically diverse. Alternately, some sites use an arbitrary region, such as `Online`.

### Online Meeting Fields

[](#online-meeting-fields)

Online meetings must have either a `conference_url` and/or `conference_phone` field to be considered active.

#### `conference_url`

[](#conference_url)

Conference URL is an optional string and should be a common videoconferencing service such as Zoom or Google Hangouts. It should launch directly into the meeting and not link to an intermediary page.

#### `conference_url_notes`

[](#conference_url_notes)

Conference URL Notes is an optional string which contains metadata about the `conference_url` (for example a meeting password in plain text for those groups unwilling to publish a one-tap URL).

#### `conference_phone`

[](#conference_phone)

Conference Phone is an optional telephone number to dial into a specific meeting. Should be numeric, except a `+` symbol may be used for international dialers, and `,`, `*`, and `#` can be used to form one-tap phone links.

#### `conference_phone_notes`

[](#conference_phone_notes)

Conference Phone Notes is an optional string with metadata about the `conference_phone` (for example a numeric meeting password or other user instructions).

### Recommended Fields

[](#recommended-fields)

#### `types`

[](#types)

Types is an optional array of standardized meeting types. See [Meeting Types](#meeting-types) below. While this field is optional, it is highly recommended to include it. The app uses this field to filter meetings, and it's a primary way that users find meetings. While not every meeting will have types, most meetings should.

#### `notes`

[](#notes)

Notes is an optional long text field to hold additional details about the meeting. Line breaks are ok, but HTML will be stripped. As opposed to `location_notes` and `group_notes` (see below), the `notes` field is not shared with other meetings, so it's a good place to put any freeform information that is specific to this meeting.

No HTML or other formatting should go in this field. It is plain text.

#### `location`

[](#location)

Location is an optional string and should be a recognizable building or landmark name. Most apps will share this field with other meetings at the same address.

No HTML or other formatting should go in this field. It is plain text.

#### `location_notes`

[](#location_notes)

Location Notes is an optional long text field with notes applying to all meetings at the location. Most apps will share this field with other meetings at the same address.

### Optional Fields

[](#optional-fields)

#### `latitude` and `longitude`

[](#latitude-and-longitude)

Latitude and Longitude are optional numeric values indicating the geoposition of the meeting. Only five decimal places of precision are necessary here (1.11m). These values are ignored by the Meeting Guide importer, but are helpful for TSML UI, which uses them to display a map of the meeting location, and infer that the meeting address is not approximate.

#### `approximate`

[](#approximate)

Approxmiate is an optional stringified boolean value, that, when present, indicates whether the address is an approximate location (`"yes"`) or a specific point on a map such as a street address (`"no"`). This is ignored by the Meeting Guide importer but is used by TSML UI when `latitude` and `longitude` are not present.

#### `updated`

[](#updated)

Updated is an optional UTC timestamp in the format `YYYY-MM-DD HH:MM:SS` and indicates when the listing was last updated.

#### `group`

[](#group)

Group is an optional string representing the name of the group providing the meeting. Groups can hold meetings in multiple locations. This is ignored by the Meeting Guide importer but is used by TSML UI.

#### `group_notes`

[](#group_notes)

Group Notes is an optional long text field. Line breaks are ok, but HTML will be stripped. This is ignored by the Meeting Guide importer but is used by TSML UI. When importing, the 12 Step Meeting List plugin will apply this value to all meetings that share the same group name.

No HTML or other formatting should go in this field. It is plain text.

#### `venmo`

[](#venmo)

Venmo is an optional string and should be a [Venmo handle](https://help.venmo.com/hc/en-us/articles/235432448-Check-or-Edit-Your-Username), for example `@AAGroupName`. This is understood to be the address for 7th Tradition contributions to the meeting, and not any other entity.

#### `square`

[](#square)

Square is an optional string and should be a [Square Cash App cashtag](https://cash.app/help/us/en-us/3123-cashtags), for example `$AAGroupName`. This is understood to be the address for 7th Tradition contributions to the meeting, and not any other entity.

#### `paypal`

[](#paypal)

PayPal is an optional string and should be a [PayPal.me username](https://www.paypal.com/us/cshelp/article/what-is-paypalme-help432), for example `AAGroupName`. This is understood to be the address for 7th Tradition contributions to the meeting, and not any other entity.

#### `homegroup_online`

[](#homegroup_online)

`homegroup_online` is an optional string and should be a [Homegroup Online](https://homegroup.online) group code, such as `tbc` [in this example](https://donate.homegroup.online/tbc/). This is understood to be the address for 7th Tradition contributions to the meeting, and not any other entity.

#### `url`

[](#url)

URL is optional and should point to the meeting's listing on the area website. This is used by the Meeting Guide app but not TSML UI.

#### `edit_url`

[](#edit_url)

Edit URL is an optional string URL that trusted servants can use to edit the specific meeting's listing. This is ignored by Meeting Guide but used by TSML UI.

#### `feedback_emails`

[](#feedback_emails)

Feedback Emails is an array of feedback addresses for the service entity responsible for the listing. When using a Google Sheet, separate multiple addresses with a `,`.

#### `feedback_url`

[](#feedback_url)

Feedback URL is an optional string URL that can be used instead of `feedback_emails` to provide feedback about the meeting. These can be on-site or off-site absolute URLs, for example:

- `https://example.org/feedback?meeting=meeting-slug-1`
- `https://typeform.com/to/23904203?meeting=meeting-slug-1`
- `mailto:webservant@domain.org?subject=meeting-slug-1`.

### Service Entity Fields

[](#service-entity-fields)

#### `entity`

[](#entity)

Entity is the name of the service entity responsible for the listing. entity info is optional, but `entity` is required if any of the other entity fields are present.

#### `entity_email`

[](#entity_email)

Entity Email is a public email address for the service entity responsible for the listing. This should be a single email address.

#### `entity_location`

[](#entity_location)

Entity Location is a human-readable physical description of the service area of the entity, for example `Whatcom County, Washington`.

#### `entity_logo`

[](#entity_logo)

Entity Logo is the URL of the logo of the service entity responsible for the listing. It should begin with `https://`. Ideally the image this points to is a vector-based SVG so it can be scaled to any size. Additionally, the image should be square, and have a transparent background. Finally, colors should be specified using `currentColor` so that they can adapt to the color mode (light, dark) of the app.

#### `entity_phone`

[](#entity_phone)

Entity Phone is the phone number of the service entity responsible for the listing. Should be in the format `+1-123-456-7890` and start with country code for international dialing.

#### `entity_website_url`

[](#entity_website_url)

Entity Website URL is the website homepage of the service entity responsible for the listing. This should begin with `https://`.

### Contact Fields

[](#contact-fields)

Contact fields are optional, and are typically used in places where meeting density is low, and users may need to contact the meeting to confirm its status.

Contact fields should not break anyone's anonymity. No last names should be used in contact information.

`contact_1_name` is the name of the first contact person for the meeting.

`contact_1_email` is the email address of the first contact person for the meeting.

`contact_1_phone` is the phone number of the first contact person for the meeting.

`contact_2_name` is the name of the second contact person for the meeting.

`contact_2_email` is the email address of the second contact person for the meeting.

`contact_2_phone` is the phone number of the second contact person for the meeting.

`contact_3_name` is the name of the third contact person for the meeting.

`contact_3_email` is the email address of the third contact person for the meeting.

`contact_3_phone` is the phone number of the third contact person for the meeting.

Common Questions &amp; Concerns
-------------------------------

[](#common-questions--concerns)

### We use different meeting codes!

[](#we-use-different-meeting-codes)

That's ok. App users don't actually see the codes, just the types they translate to.

### Our meeting type isn't listed!

[](#our-meeting-type-isnt-listed)

Types have to be consistent across the app to make a good user experience. It's common that a user might see meeting results from several areas at a time (this happens in small areas, and near borders). The set of meeting types we use is a mutually-agreed-upon set of names across 70+ areas. If you have a request to edit the list, we will bring it up at our steering committee meeting.

### Meeting Guide requirements

[](#meeting-guide-requirements)

Some applications have requirements about what content needs to be in the feed. Meeting Guide, for example, requires `slug`, `day`, `time`, as well as geographic information to be present for it to be imported.

#### Why is slug / ID necessary?

[](#why-is-slug--id-necessary)

Slug is a required unique field because there is an app feature where users may "favorite" a meeting, and in order for that to persist across sessions we must attach it to a unique field.

#### Why are day and time required?

[](#why-are-day-and-time-required)

It's perfectly fine for meetings to be 'by appointment' and this often happens in places where there are not many meetings. The Meeting Guide app, however, needs this information to present useful information to the user.

#### Why is geographic information necessary for online-only meetings?

[](#why-is-geographic-information-necessary-for-online-only-meetings)

Meeting Guide has far too many meetings in its database to expose them all to individual users. To present only the most relevant information, Meeting Guide selects meetings that are "nearby" - even if that meeting is online. In these cases, the location can be thought of as a point of origin for the meeting, or a geographic affinity.

Use approximate locations for these meetings. `formatted_address` is the most flexible field for this, and values can be things like: `Wicker Park, Chicago, IL, USA` (neighborhood), `Chicago, IL, USA` (city), or `Illinois, USA` (state). It's also fine to use `country`, `city`, and `state` fields atomically.

These locations should standardized (can you find it with Google Maps?), and imply the time zone. For this reason, don't use a broad geographic area like `United States` that spans multiple time zones.

### Why can't we have HTML in meeting notes?

[](#why-cant-we-have-html-in-meeting-notes)

Data should be portable across a range of devices, some of which might not display HTML.

### What about business meetings or other monthly meetings?

[](#what-about-business-meetings-or-other-monthly-meetings)

This API is for weekly recovery meetings. We recommend using another method (separate page, calendar plugin) to display those types of meetings.

Meeting Types
-------------

[](#meeting-types)

The codes below are only used for transmitting meeting data. App users will only see the full definitions.

The codes below should be considered 'reserved.' In your implementation, it's ok to alter the description (for example "Topic Discussion" rather than "Discussion") so long as the intent is the same. For example, "Child Care Available" is a common substitute for "Babysitting Available." It's also ok to add types, they will be ignored by the importer, but be careful not to use any existing or proposed codes.

Also when adding a custom type, it's wise to stay away from any [ISO 369 language codes](https://en.wikipedia.org/wiki/List_of_ISO_639_language_codes), since these could be added in the future.

CodeEnglishEspañolFrançais日本語NederlandsPortuguêsSlovenčinaSvenskaไทย`11`11th Step MeditationMeditación del Paso 11Méditation sur la 11e Étapeステップ11 黙想Stap 11 meditatieMeditação do 11º PassoMeditácia 11. kroku11th Stegs Meditationการทำสมาธิตามขั้นตอนที่ 11`12x12`12 Steps &amp; 12 Traditions12 Pasos y 12 Tradiciones12 Étapes et 12 Traditions12のステップと12の伝統12 Stappen en 12 Tradities12 Passos e 12 Tradições12 Krokov &amp; 12 Tradícií12 Steg &amp; 12 Traditionerขั้นตอนทั้งสิบสองและธรรมเนียมทั้งสิบสอง`A`SecularSecularSéculier無宗教SeculierSecularSvetskéSekulärtไม่เกี่ยวข้องกับศาสนา`ABSI`As Bill Sees ItComo lo ve BillRéflexions de Billビルはこう思うZoals Bill het zietNa opinião de BillAko to vidí BillSom Bill Ser Detในมุมมองของบิล`AF`AfrikaansAfrikáansAfrikaansアフリカーンス語AfrikaansAfrikaansAfrikánčinaAfrikaansแอฟริกานส์`AL`Concurrent with AlateenConcurrente con AlateenEn même temps qu’Alateenアラティーンと同時進行Gelijktijdig met AlateenEm simultâneo com AlateenSúbežne s AlateenTillsammans med Alateenควบคู่กับ Alateen`AL-AN`Concurrent with Al-AnonConcurrente con Al-AnonEn même temps qu’Al-Anonアラノンと同時進行Gelijktijdig met Al-AnonEm simultâneo com Al-AnonSúbežne s Al-AnonTillsammans med Al-Anonควบคู่กับ Al-Anon`AM`AmharicAmáricoAmhariqueアムハラ語AmhaarsAmáricoAmharčinaAmhariskaอัมฮาริก`AR`ArabicÁrabeArabeアラビア語ArabischÁrabeArabskéArabiskaอาหรับ`ASL`American Sign LanguageLenguaje por señasLangage des Signesアメリカ手話Amerikaanse gebaren taalLíngua Gestual AmericanaAmerický posunkový jazykAmerikanskt teckenspråkภาษามืออเมริกัน`B`Big BookLibro GrandeGros LivreビッグブックBig BookLivro AzulVeľká KnihaStora Bokenหนังสือบิ๊กบุ๊คหรือหนังสือกลุ่มผู้ติดสุรานิรนาม`BA`Babysitting AvailableGuardería disponibleGarderie d’enfants disponibleベビーシッターありKinderopvang aanwezigBabysitting disponívelDostupné opatrovanie detíBarnvakt Finnsมีบริการดูแลเด็ก`BE`NewcomerPrincipiantesNouveau/nouvelleビギナーズNieuwkomerRecém-chegadosNováčikoviaNykomlingสมาชิกใหม่`BG`BulgarianBúlgaroBulgareブルガリア語BulgaarsBúlgaroBulharskéBulgariskaบัลแกเรีย`BI`BisexualBisexualBisexuelバイセクシャルBiseksueelBisexualBisexuálneBisexuelltรักสองเพศ`BRK`BreakfastDesayunoPetit déjeuner朝食OntbijtPequeno-AlmoçoRaňajkyFrukostอาหารเช้า`C`ClosedCerradaFerméクローズドGeslotenFechadaUzatvorenéSlutetปิด`CAN`CandlelightLuz de una velaÀ la chandelleキャンドルCandlelightLuz de VelasSviečkyTända Ljusแสงเทียน`CF`Child-FriendlyNiño amigableEnfants acceptésお子さま歓迎KindvriendelijkAmigável para CriançasPriateľský k deťomBarnvänligtยินดีต้อนรับเด็ก`D`DiscussionDiscusiónDiscussionディスカッションDiscussieDiscussãoDiskusiaDiskussionการแบ่งปัน`DA`DanishDanésDanoisデンマーク語DeensDinamarquêsDánskyDanskaเดนมาร์ก`DB`Digital BasketCanasta digitalPanier numérique電子献金Digitale mandCesto DigitalDigitálny košíkDigital Korgบริจาคออนไลน์`DD`Dual DiagnosisDiagnóstico dualDouble diagnostic重複診断Dubbele diagnoseDuplo DiagnósticoDuálna diagnózaDubbel Diagnosโรคร่วม (สุขภาพจิตและการเสพติด)`DE`GermanAlemánAllemandドイツ語DuitsAlemãoNemeckéTyskaเยอรมัน`DR`Daily ReflectionsReflexiones DiariasRéflexions quotidiennes今日を新たにDagelijkse weerspiegelingenReflexões DiáriasDenné úvahyDagliga Reflektionerข้อคิดประจำวัน`EL`GreekGriegoGrecギリシャ語GrieksGregoGréckeGrekiskaกรีก`EN`EnglishInglésAnglais英語EngelsInglêsAnglickéEngelskaอังกฤษ`FA`PersianPersaPersanペルシア語PerzischPersaPerzskéPersiskaเปอร์เซีย`FI`FinnishFinlandésFinlandaisフィンランド語FinsFinlandêsFínčinaFinskaฟินแลนด์`FF`Fragrance FreeSin fraganciaSans parfum香水なしGeen parfumSem PerfumesBez vôneParfym Frittปราศจากน้ำหอม`FR`FrenchFrancésFrançaisフランス語FransFrancêsFrancúzskyFranskaฝรั่งเศส`G`GayGayGaiゲイHomoGayGayGayเกย์`GR`GrapevineLa ViñaLa VigneグレープバインWijnstokGrapevineGrapevineGrapevineเกรปไวน์`H`BirthdayCumpleañosAnniversaireバースデーVerjaardagAniversárioNarodeninyFödelsedagวันครบรอบการไม่เมา`HE`HebrewHebreoHébreuヘブライ語HebreeuwsHebreuHebrejskéHebreiskaฮีบรู`HI`HindiHindiHindiヒンディー語HindiHindiHindiHindiฮินดี`HR`CroatianCroataCroateクロアチア語KroatischCroataChorvátskyKroatiskaโครเอเชีย`HU`HungarianHúngaroHongroisハンガリー語HongaarsHungaroMaďarskéUngerskaฮังการี`IS`IcelandicIslandésIslandaisアイスランド語IJslandsIslandêsIslanskéIsländskaไอซ์แลนด์`ITA`ItalianItalianoItalienイタリア語ItaliaansItalianoTalianskyItalienskaอิตาลี`JA`JapaneseJaponésJaponais日本語JapansJaponêsJaponskéJapanskaญี่ปุ่น`KA`GeorgianGeorgianoGéorgienジョージア語GeorgischGeorgianoGruzínskeGeorgiskaจอร์เจีย`KOR`KoreanCoreanoCoréen韓国語KoreaansCoreanoKórejskeKoreanskaเกาหลี`L`LesbianLesbianaLesbienneレズビアンLesbischLésbicaLesbickéLesbisktเลสเบียน`LGBTQ`LGBTQLGBTQLGBTQLGBTQLGBTQLGBTQLGBTQHBTQกลุ่มผู้มีความหลากหลายทางเพศ (LGBTQ+)`LIT`LiteratureLiteraturaPublications書籍LiteratuurLiteraturaLiteratúraLitteraturวรรณกรรมของเอเอ`LS`Living SoberViviendo SobrioVivre… Sans alcoolリビングソーバーSober levenViver SóbrioTriezvy životLeva Nyktertชีวิตที่ใม่เมา`LT`LithuanianLituanoLituanienリトアニア語LitouwsLituanoLitovskéLitauiskaลิทัวเนีย`M`MenHombresHommes男性MannenHomensMužiMansmöteผู้ชาย`MED`MeditationMeditaciónMéditation黙想MeditatieMeditaçãoMeditáciaMeditationsmöteสมาธิ`ML`MalayalamMalayalamMalayalamマラヤーラム語MalayalamMalaialaMalajálamskyMalayalamมาลายาลัม`MT`MalteseMaltésMaltaisマルタ語MalteesMaltêsMaltézskeMaltesiskaมอลตา`N`Native AmericanNativo AmericanoAutochtoneネイティブアメリカンIndiaanNativo AmericanoDomorodí AmeričaniaUr-amerikansktชนพื้นเมืองอเมริกัน`NB`Non-BinaryNo binarioNon binaireノンバイナリーNiet-binairNão binárioNebinárneIcke-binärไม่ระบุเพศ`NDG`IndigenousIndígenaIndigène先住民InheemsIndígenaDomorodéUrfolkligtชนพื้นเมือง`NE`NepaliNepalíNépalaisネパール語NepaleesNepalêsNepálskyNepaliเนปาล`NL`DutchHolandésNéerlandaisオランダ語NederlandsHolandêsHolandskéHolländskaดัตช์`NO`NorwegianNoruegoNorvégienノルウェー語NoorsNorueguêsNórskyNorskaนอร์เวย์`O`OpenAbiertaOuvert(e)オープンOpenAbertaOtvorenéÖppetเปิด`OUT`OutdoorAl aire libreEn plein airアウトドアBuitenAo ar livreVonkajšieUtomhusกลางแจ้ง`P`ProfessionalsProfesionalesProfessionnels職業人ProfessionalsProfissionaisProfesionáliProfessionellaผู้ประกอบวิชาชีพ`POA`Proof of AttendancePrueba de AsistenciaPreuve de Présence出席証明Bewijs van AanwezigheidComprovante de PresençaDoklad o účastiNärvarobevisหลักฐานการเข้าประชุม`POC`People of ColorGente de colorGens de couleur有色人種Mensen van kleurPessoas de CôrFarební ľudiaFärgadeชนกลุ่มน้อย`POL`PolishPolacoPolonaisポーランド語PoolsPolacoPoľskéPolskaโปแลนด์`POR`PortuguesePortuguésPortugaisポルトガル語PortugeesPortuguêsPortugalskéPortugisiskaโปรตุเกส`PUN`PunjabiPunjabiPendjabiパンジャブ語PunjabiPunjabiPandžábskePunjabiปัญจาบ`RUS`RussianRusoRusseロシア語RussischRussoRuskéRyskaรัสเซีย`S`SpanishEspañolEspagnolスペイン語SpaansEspanholŠpanielskéSpanskaสเปน`SEN`SeniorsPersonas mayoresSéniorsシニアSeniorenSénioresSenioriSeniorerผู้สูงอายุ`SK`SlovakEslovacoSlovaqueスロバキア語SlowaaksEslovacoSlovenskéSlovakiskaสโลวัก`SL`SlovenianEslovenoSlovèneスロベニア語SloveensEslovenoSlovinskéSlovenskaสโลวีเนีย`SM`Smoking PermittedSe permite fumarPermis de fumer喫煙可Roken toegestaanPermitido FumarFajčenie povolenéRökning Tillåtenสูบบุหรี่ได`SP`SpeakerOradorConférencierスピーカーSprekerPartilhadorSpíkerTalareผู้พูด`ST`Step StudyEstudio de pasosSur les ÉtapesステップStap studieEstudo de PassosŠtúdium KrokovStegmöteการศึกษา 12 ขั้นตอน`SV`SwedishSuecoSuédoisスウェーデン語ZweedsSuecoŠvédskeSvenskaสวีเดน`T`TransgenderTransgéneroTransgenreトランスジェンダーTransgenderTransgéneroTransgenderTranspersonerคนข้ามเพศ`TC`Location Temporarily ClosedUbicación temporalmente cerradaEmplacement temporairement fermé一時的休止中Locatie tijdelijk geslotenLocal Temporáriamente EncerradoMiesto dočasne zatvorenéTillfälligt Stängtปิดชั่วคราว`TH`ThaiTailandésThaïタイ語ThaisTailandêsThajskéThailändskaไทย`TL`TagalogTagaloTagalogタガログ語TagalogTagaloTagalskéTagalogตากาล็อก`TR`Tradition StudyEstudio de tradicionÉtude des Traditions伝統Traditie StudieEstudo de TradiçõesTradičné štúdiumTraditionsmöteการศึกษา 12 ธรรมเนียม`TUR`TurkishTurcoTurcトルコ語TurksTurcoTureckýTurkiskaตุรกี`UK`UkrainianUcranianoUkrainienウクライナ語OekraïensUcranianoUkrajinskéUkrainskaยูเครน`W`WomenMujeresFemmes女性VrouwenMulheresŽenyKvinnomöteผู้หญิง`X`Wheelchair AccessAcceso en silla de ruedasAccès aux fauteuils roulants車いすアクセスToegankelijk voor rolstoelgebruikersAcesso a Cadeiras de RodasPrístup pre vozíčkarovHandikappanpassatรองรับรถเข็น`XB`Wheelchair-Accessible BathroomBaño accesible para sillas de ruedasToilettes accessibles aux fauteuils roulants車いす使用者用トイレRolstoeltoegankelijke badkamerWC com Acesso a Cadeiras de RodasBezbariérová kúpeľňaHandikappanpassad WCห้องน้ำสำหรับผู้ใช้รถเข็น`XT`Cross Talk PermittedSe permite opinarConversation croisée permiseクロストーク可能Cross-sharen toegestaanPrtilhas Cruzadas PermitidasCross Talk povolenýKommentarer Tilltåtnaโต้ตอบได้`Y`Young PeopleGente jovenJeunesヤングJongerenJovensMladí ľudiaYoung PeopleเยาวชนProposed New Types
------------------

[](#proposed-new-types)

The following types are proposed for future use. They are not currently in use in the app.

CodeEnglishEspañolFrançais日本語NederlandsPortuguêsSlovenčinaSvenskaไทย`BV-I`Blind / Visually ImpairedCiego / Discapacidad VisualAveugle / Malvoyant視覚障害者Blind / Visueel gehandicaptCego / Deficiência VisualNevidiaci / Zrakovo postihnutíBlind / Synskadadคนตาบอด / ผู้มีปัญหาด้านการมองเห็น`D-HOH`Deaf / Hard of HearingSordo / Duro de OídoSourd / Malentendant聴覚障害者Doof / HardhorenSurdo / Duro de OuvidoNepočujúci / NedoslýchavíDöv / Hörselskadadคนหูหนวก / หูตึง`LO-I`Loners / IsolationistsSolitarios / AislacionistasSolitaires / Isolationnistes孤独 / 孤立主義者Eenlingen / IsolationistenSolitários / IsolacionistasSamotári / IzolacionistiEnsamvargar / Isolationisterคนชอบอยู่คนเดียว / คนที่ชอบแยกตัว`QSL`Quebec Sign LanguageLengua de Señas de QuebecLangue des Signes Québécoiseケベック手話Quebec -gebarentaalLíngua Gesual QuebecQuebecký posunkový jazykQuebecskt Teckenspråkภาษามือควิเบก`RSL`Russian Sign LanguageLengua de Señas RusaLangue des Signes Russeロシア手話Russische gebarentaalLíngua Gestual RussaRuský posunkový jazykRyskt TeckenspråkภาษามือรัสเซียProposed Changed Types
----------------------

[](#proposed-changed-types)

The following types being considered for a name change.

CodeEnglishEspañolFrançais日本語NederlandsPortuguêsSlovenčinaSvenskaไทย`LGBTQ`LGBTQIAA+LGBTQIAA+LGBTQIAA+LGBTQIAA+LGBTQIAA+LGBTQIAA+LGBTQIAA+HBTQIAA+LGBTQIAA+Sharing Your Data
-----------------

[](#sharing-your-data)

If you choose, you may make your feed discoverable by linking to it (like RSS) in your site's ``.

```

```

The script may have any name, and be in any directory, but it should be a fully qualified URL, and the `title="Meetings Feed"` attribute is required.

Use the Spec in your code
-------------------------

[](#use-the-spec-in-your-code)

### PHP

[](#php)

---

### Code4Recovery Spec Composer Package

[](#code4recovery-spec-composer-package)

This package contains a class that makes the most up-to-date meeting types available to your application.

### Installation

[](#installation)

```
composer require code4recovery/spec
```

### Get all available languages

[](#get-all-available-languages)

Returns an array of available languages.

```
$spec::getLanguages();

// this returns:
[
        'en' => 'English',
        'es' => 'Español',
        'fr' => 'Français',
        'ja' => '日本語',
        'nl' => 'Nederlands',
        'pt' => 'Português',
        'sk' => 'Slovenčina',
        'sv' => 'Svenska',
        'th' => 'ไทย',
];
```

### Get all types

[](#get-all-types)

Returns an object containing types in every language.

```
$spec::getAllTypes();

// this returns (truncated):
{
  "11": {
    "en": "11th Step Meditation",
    "es": "Meditación del Paso 11",
    "fr": "Méditation sur la 11e Étape",
    "ja": "ステップ11 黙想",
    "nl": "Stap 11 meditatie",
    "pt": "Meditação do 11º Passo",
    "sk": "Meditácia 11. kroku",
    "sv": "11th Stegs Meditation",
    "th": "สมาธิขั้นที่ 11"
  },
  "12x12": {
    "en": "12 Steps & 12 Traditions",
    "es": "12 Pasos y 12 Tradiciones",
    "fr": "12 Étapes et 12 Traditions",
    "ja": "12のステップと12の伝統",
    "nl": "12 Stappen en 12 Tradities",
    "pt": "12 Passos e 12 Tradições",
    "sk": "12 Krokov & 12 Tradícií",
    "sv": "12 Steg & 12 Traditioner",
    "th": "12 ขั้นตอนและ 12 ธรรมเนียม"
  },
  ...
};
```

### Get types by language

[](#get-types-by-language)

Returns an array of types translated into a specified language. Pass the desired language key as a string ('en', 'es', 'fr', etc.)

```
$spec::getTypesByLanguage('en');

// returns (truncated):
[
    "11" => "11th Step Meditation"
    "12x12" => "12 Steps & 12 Traditions"
    "A" => "Secular"
    "ABSI" => "As Bill Sees It"
    ...
];
```

### TypeScript / JavaScript

[](#typescript--javascript)

---

### Installation

[](#installation-1)

```
npm i @code4recovery/spec
```

### Usage

[](#usage-1)

```
import { getTypesForLanguage } from '@code4recovery/spec';

const types = getTypesForLanguage('en');

// returns:
{
  "11": "11th Step Meditation",
  "12x12": "12 Steps & 12 Traditions",
  A: "Secular",
  ABSI: "As Bill Sees It",
  ...
}
```

License
-------

[](#license)

Code4Recovery Spec is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance91

Actively maintained with recent releases

Popularity26

Limited adoption so far

Community23

Small or concentrated contributor base

Maturity47

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 92.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~105 days

Recently: every ~139 days

Total

8

Last Release

63d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/86364c774ed1e43a8a8be3efc4c15c39419e4c014ddc12fef57235cdb5ca6e9f?d=identicon)[anchovie91471](/maintainers/anchovie91471)

---

Top Contributors

[![joshreisner](https://avatars.githubusercontent.com/u/1551689?v=4)](https://github.com/joshreisner "joshreisner (182 commits)")[![josh-atl-062323](https://avatars.githubusercontent.com/u/134992648?v=4)](https://github.com/josh-atl-062323 "josh-atl-062323 (3 commits)")[![FlipperPA](https://avatars.githubusercontent.com/u/68164?v=4)](https://github.com/FlipperPA "FlipperPA (3 commits)")[![anchovie91471](https://avatars.githubusercontent.com/u/9162021?v=4)](https://github.com/anchovie91471 "anchovie91471 (2 commits)")[![gkovats](https://avatars.githubusercontent.com/u/1187583?v=4)](https://github.com/gkovats "gkovats (2 commits)")[![mathteacher](https://avatars.githubusercontent.com/u/4405188?v=4)](https://github.com/mathteacher "mathteacher (2 commits)")[![tiptop96](https://avatars.githubusercontent.com/u/31468763?v=4)](https://github.com/tiptop96 "tiptop96 (1 commits)")[![tintinnabulate](https://avatars.githubusercontent.com/u/34038724?v=4)](https://github.com/tintinnabulate "tintinnabulate (1 commits)")[![Henrylq](https://avatars.githubusercontent.com/u/40896381?v=4)](https://github.com/Henrylq "Henrylq (1 commits)")

### Embed Badge

![Health badge](/badges/code4recovery-spec/health.svg)

```
[![Health](https://phpackages.com/badges/code4recovery-spec/health.svg)](https://phpackages.com/packages/code4recovery-spec)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M475](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M270](/packages/twilio-sdk)[knplabs/github-api

GitHub API v3 client

2.2k15.8M187](/packages/knplabs-github-api)[facebook/php-business-sdk

PHP SDK for Facebook Business

90121.9M34](/packages/facebook-php-business-sdk)[microsoft/microsoft-graph

The Microsoft Graph SDK for PHP

65723.5M95](/packages/microsoft-microsoft-graph)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

73813.7M114](/packages/meilisearch-meilisearch-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
