CONTACT_FORM integrations store a public Contacts block in config.publicContacts (Connection & settings):
- phones ---
id,number,label, optionallocales(BLOG-style{ hy|ru|en: { name } }), optional messengerswhatsapp/telegram/viber(trueor a handle string) - emails ---
id,address,label, optionallocales - addresses --- optional
id,text,label, optionallocales - site --- optional
{ url, label, locales }
Ids are stable (assigned on save). Labels resolve with optional ?locale=.
External read
GET /api/v1/forms/{projectUid}/integrations/{integrationId}/public-contacts?locale=ru
Requires X-API-Key with form.external-read (or FULL), or an MCP token with membership. SDK: @mailoo/forms/contacts → fetchContactFormPublicContacts.
Manage / MCP
GET/PATCH …/forms/…/settings (form.manage) and MCP manage_form_integration_settings accept publicContacts (CONTACT_FORM only; null clears).
MARKET price-list header
MARKET config.contactsSource selects a same-project CONTACT_FORM plus phoneId / emailId. Admin wholesale export and the external read API both resolve that source with the same formatPriceListContactsBlock helper. If unset or broken, they fall back to config.priceList.contacts; if neither is available, the external API returns null.
GET /api/v1/market/{projectUid}/integrations/{integrationId}/wholesale-price-list/contacts?locale=ru
Requires X-API-Key with market.external-read (or FULL), or an MCP token. Response: { "success": true, "data": { "contacts": "…" } } (contacts may be null). SDK: createMailooMarketClient(config).getWholesalePriceListContacts({ locale }).