Foyer API pages

Foyer API

Endpoint reference

Every endpoint of the Foyer API, generated from the OpenAPI 3.1 specification that the API itself serves at https://api.hifoyer.com/v1/openapi.json. Load that file into Postman, an SDK generator or your AI agent to get all 78 operations with their exact types.

How the API works

Base URL https://api.hifoyer.com · OpenAPI 3.1.0 · API version 1.0.0 · openapi.json

Foyer is an AI phone call screener. A member forwards their phone line to Foyer; Foyer answers callers it does not know, asks who they are and why they are calling, and then rings the member, holds the call for review, takes a voicemail, or turns the caller away. Saved contacts ring straight through.

This API lets a member connect their own AI assistant or scripts to their own Foyer account. Everything it returns belongs to the member who made the key; there is no way to reach another member's data.

Authentication

Send a personal API key in the Authorization header: Authorization: Bearer fyr_…. The member makes keys in the Foyer app or dashboard under Settings › Connected apps. A key is shown once, expires after 90 days (or sooner if chosen), and can be revoked at any time. Keys are never accepted in the URL.

Permissions (scopes)

Each key carries the scopes the member ticked when making it:

ScopeWhat it allows
calls:readSee calls, summaries, voicemails list, the review queue, statistics and search.
transcripts:readRead the words: the screening conversation, voicemail text and the recorded call's transcript. Also lets search look inside them.
audio:readGet short-lived links to recordings (voicemail, screening, the whole call). Off unless the member grants it.
contacts:readSee contacts and how Foyer treats each caller.
settings:readSee settings, numbers and forwarding lines, notes and what the member's host (the AI screener) knows.
calls:writeMark calls read or unread, archive, refile and report spam.
contacts:writeAdd contacts and change how Foyer treats a caller.
settings:writeChange any setting the member can change in the app.
notes:writeAdd or remove notes for the host and manage the facts it knows.

A request without the scope it needs gets 403 insufficient_scope.

Plans

Every Foyer plan can read. Changing anything (any *:write scope) needs Concierge or Chief of Staff; the free period and complimentary access count as the top tier. On Doorman, write requests get 403 plan_does_not_include_writes and nothing is changed; a key made with write scopes keeps them and they work again after an upgrade. Use GET /v1/me to see what the current key may do.

Limits

Per member: 60 requests a minute and 10,000 a day, and at most 20 searches a minute. Over a limit the API answers 429 rate_limited with a Retry-After header (seconds).

Pagination

Lists are newest first. A page has data and next_cursor; pass next_cursor back unchanged as cursor for the next page. next_cursor is null on the last page. limit sets the page size.

Errors

Every error has the same shape: {"error": {"code": "not_found", "message": "…", "status": 404}}, with an optional details object. message is written for people; code is stable and meant for programs.

Dates, numbers and ids

Dates are ISO 8601 in UTC. Phone numbers are E.164 (+16175550100). Call ids are opaque strings; use them exactly as returned.

What the API cannot do

For safety these stay in the Foyer app only: deleting the account or removing Foyer, purchases and billing (Apple in-app purchase), phone-number verification codes (adding a screened number, confirming an email), exporting data by email, admin tools, answering or controlling a call while it is live, sharing public links, and the phone interview with the host. Reading a call through the API never marks it read; use POST /v1/calls/{id}/mark-read for that.

Discovery

The key in use, its permissions and this specification.

GET /v1/openapi.json

This specification as JSON

Operation
get_openapi_spec
Auth
None: public

The OpenAPI 3.1 document for this API. No authentication.

Returns

200 The OpenAPI document.

Example
curl "https://api.hifoyer.com/v1/openapi.json"

GET /v1/me

What this key can do

Operation
get_me
Auth
Any API key

The key in use, which scopes it has, whether the member's plan allows changes, and the rate limits. Call this first to learn what you may do. Needs no particular scope.

Returns

200 The key and its permissions.

FieldTypeDescription
dataMe

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/me" \
  -H "Authorization: Bearer $FOYER_API_KEY"

Calls

Screened calls, voicemails, the review queue, search and statistics.

GET /v1/calls

List screened calls

Operation
list_calls
Auth
API key with calls:read

The member's calls, newest first, with who called, what Foyer did with the call (outcome) and a one-line summary. Filter by outcome, date, read state, voicemail or caller. Archived calls are left out unless archived says otherwise. Listing never marks calls read.

Parameters

NameInTypeDescription
outcomequerystringOnly calls with these outcomes (comma-separated). See the Outcome schema for what each means. Example: review,voicemail.
sincequerystring (date-time)Only calls that started at or after this time (ISO 8601).
untilquerystring (date-time)Only calls that started at or before this time (ISO 8601).
unreadquerybooleantrue for calls the member has not opened yet, false for ones they have.
has_voicemailquerybooleantrue for calls that left a voicemail.
archivedquerystringexclude (default) leaves archived calls out, only lists just them, include lists both. One of: exclude, only, include. Default exclude.
callerquerystringOnly calls from this full phone number.
limitqueryintegerItems per page, 1-100 (default 25). 1-100. Default 25.
cursorquerystringThe next_cursor from the previous page, unchanged. Omit for the first page.

Returns

200 One page of calls, newest first.

FieldTypeDescription
data requiredarray of Call
next_cursor requiredstring, nullablePass back as cursor for the next page; null on the last page.

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/calls" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/voicemails

List calls that left a voicemail

Operation
list_voicemails
Auth
API key with calls:read

Calls where the caller left a voicemail, newest first. Same shape and filters as GET /v1/calls. Use voicemail.reviewed to find new ones; read the message text with GET /v1/calls/{id} (needs transcripts:read) or listen with GET /v1/calls/{id}/audio?part=voicemail.

Parameters

NameInTypeDescription
sincequerystring (date-time)Only calls that started at or after this time (ISO 8601).
untilquerystring (date-time)Only calls that started at or before this time (ISO 8601).
unreadquerybooleantrue for calls the member has not opened yet, false for ones they have.
archivedquerystringexclude (default) leaves archived calls out, only lists just them, include lists both. One of: exclude, only, include. Default exclude.
callerquerystringOnly calls from this full phone number.
limitqueryintegerItems per page, 1-100 (default 25). 1-100. Default 25.
cursorquerystringThe next_cursor from the previous page, unchanged. Omit for the first page.

Returns

200 One page of calls, newest first.

FieldTypeDescription
data requiredarray of Call
next_cursor requiredstring, nullablePass back as cursor for the next page; null on the last page.

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/voicemails" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/review

Calls waiting for the member's review

Operation
list_review_queue
Auth
API key with calls:read

Calls Foyer was unsure about and held for the member (outcome = review) that the member has not looked at yet, newest first. To clear one, mark it read; to decide what happens next time this caller rings, refile it (POST /v1/calls/{id}/refile).

Parameters

NameInTypeDescription
sincequerystring (date-time)Only calls that started at or after this time (ISO 8601).
untilquerystring (date-time)Only calls that started at or before this time (ISO 8601).
limitqueryintegerItems per page, 1-100 (default 25). 1-100. Default 25.
cursorquerystringThe next_cursor from the previous page, unchanged. Omit for the first page.

Returns

200 One page of calls, newest first.

FieldTypeDescription
data requiredarray of Call
next_cursor requiredstring, nullablePass back as cursor for the next page; null on the last page.

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/review" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/calls/{id}

One call in full

Operation
get_call
Auth
API key with calls:read

Everything about one call: the caller, the outcome and summary, which forwarding line it came in on, what went wrong if anything (incidents), the voicemail, recordings and which audio parts exist. With transcripts:read it also has the words: the screening conversation between Foyer and the caller, the voicemail text and the transcript of the recorded connected call. Without that scope those fields are left out and transcripts_omitted is true. Reading a call here does NOT mark it read.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 The call.

FieldTypeDescription
dataCallDetail

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/calls/CALL_ID" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/search

Search calls by words

Operation
search_calls
Auth
API key with calls:read

Finds calls whose caller name, caller ID, company, number or summary contain q (case-insensitive, the whole phrase). With transcripts:read it also looks inside voicemail text, the screening conversation and the recorded call's transcript, and each hit carries a short excerpt around the match.

Calls are stored encrypted, so search examines up to 400 calls per request, newest first. If next_cursor is not null, more history remains: pass it back as cursor to keep searching further back. search.reached_oldest_call says when there is nothing older. Combine with since/until or outcome to narrow the scan. Counts against the search limit of 20 a minute.

Parameters

NameInTypeDescription
q requiredquerystringThe words to find, 2-200 characters. Matched as one phrase, ignoring case. Digits also match part of a caller's number (3 or more digits). 2-200 characters. Example: plumber.
outcomequerystringOnly calls with these outcomes (comma-separated). See the Outcome schema for what each means. Example: review,voicemail.
sincequerystring (date-time)Only calls that started at or after this time (ISO 8601).
untilquerystring (date-time)Only calls that started at or before this time (ISO 8601).
archivedquerystringexclude (default) leaves archived calls out, only lists just them, include lists both. One of: exclude, only, include. Default exclude.
limitqueryintegerMost matches to return, 1-50 (default 25). 1-50. Default 25.
cursorquerystringThe next_cursor from the previous page, unchanged. Omit for the first page.

Returns

200 Matching calls, newest first.

FieldTypeDescription
data requiredarray of SearchHit
next_cursor requiredstring, nullablePass back as cursor to keep searching older calls; null when the oldest call was reached.
search requiredobject
search.searched_fieldsarray of SearchFieldWhich parts of each call were searched (transcript fields need transcripts:read).
search.calls_examinedintegerHow many calls this request looked at.
search.reached_oldest_callbooleanTrue when there is no older call left to search.
search.methodstringHow the search ran. One of: scan, index.

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/search?q=plumber" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/stats

Call counts today and overall

Operation
get_call_stats
Auth
API key with calls:read

How many calls Foyer handled today (put through, held for review, sent to voicemail, blocked) and since the member joined.

Parameters

NameInTypeDescription
exclude_self_testsquerybooleantrue leaves out test calls the member made to their own line.

Returns

200 The counts.

FieldTypeDescription
dataobject
data.todayobject
data.today.throughintegerCalls put through to the member.
data.today.reviewintegerCalls held for review.
data.today.voicemailintegerCalls sent to voicemail.
data.today.blockedintegerSpam or blocked callers turned away.
data.today.totalinteger
data.lifetimeobject
data.lifetime.screenedinteger
data.lifetime.blockedinteger
data.lifetime.sincestring (date-time), nullable

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/stats" \
  -H "Authorization: Bearer $FOYER_API_KEY"

Call actions

Mark, archive, refile and report calls (calls:write).

POST /v1/calls/{id}/mark-read

Mark a call read

Operation
mark_call_read
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Clears the unread dot on every device, exactly like opening the call in the app. Idempotent; returns when it was first read.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/mark-read" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/calls/{id}/mark-unread

Mark a call unread

Operation
mark_call_unread
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Shows the call as unread again on every device (and its voicemail as new).

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/mark-unread" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/calls/{id}/archive

Archive a call

Operation
archive_call
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Moves the call out of the member's lists into Archived on every device. Nothing is deleted; unarchive brings it back.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/archive" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/calls/{id}/unarchive

Unarchive a call

Operation
unarchive_call
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Returns an archived call to the member's lists.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/unarchive" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/calls/{id}/voicemail/mark-reviewed

Mark a voicemail heard

Operation
mark_voicemail_reviewed
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Marks this call's voicemail as reviewed, so it no longer counts as a new message.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/voicemail/mark-reviewed" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/calls/{id}/refile

Tell Foyer how this caller should be handled

Operation
refile_call
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Re-files the call and sets the caller's treatment for next time, the same as the choices on a call in the app: through approves the caller (rings straight through from now on); screened treats them as a stranger (screened every time); review holds their calls for the member's review; voicemail files the call as voicemail; block blocks the caller (turned away from now on). Foyer learns from these choices.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Request body (JSON)

FieldTypeDescription
decision requiredstringOne of: through, screened, review, voicemail, block.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/refile" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"decision":"through"}'

POST /v1/calls/{id}/report-spam

Report the caller as spam

Operation
report_spam
Auth
API key with calls:write
Plan
Concierge or Chief of Staff (changes data)

Files a spam report for this call's caller, which helps protect every Foyer member. Returns how many households have reported the number. Idempotent.

Parameters

NameInTypeDescription
id requiredpathstringThe call's id, exactly as returned in a call's id.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/calls/CALL_ID/report-spam" \
  -H "Authorization: Bearer $FOYER_API_KEY"

Audio

Short-lived links to recordings (audio:read).

Contacts

Contacts, approved and blocked callers, remembered callers and personal greetings.

GET /v1/contacts

Contacts and how Foyer treats them

Operation
list_contacts
Auth
API key with contacts:read

Everyone who rings straight through (saved contacts and approved callers), sorted by name, with their treatment: through, or appear_unknown while the member has asked Foyer to screen them like a stranger for a while. personalized means they have a personal greeting or answering setup. The first page also lists blocked numbers. Every other caller is a stranger and is screened.

Parameters

NameInTypeDescription
limitqueryintegerContacts per page, 1-500 (default 100). 1-500. Default 100.
cursorquerystringThe next_cursor from the previous page, unchanged. Omit for the first page.

Returns

200 One page of contacts.

FieldTypeDescription
data requiredarray of Contact
blockedarray of objectBlocked numbers (first page only).
blocked[].numberstring
blocked[].treatment"block"
next_cursor requiredstring, nullable
total requiredintegerContacts across all pages.

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/contacts" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/contacts

Add a contact

Operation
add_contact
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Saves a contact; they ring straight through from now on. It is also added to the member's iPhone contacts at the next sync.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
namestringFull name as it should appear.
first_namestring0-200 characters.
last_namestring0-200 characters.
business_namestring0-200 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/contacts" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

POST /v1/contacts/archive

Remove a contact (archive)

Operation
archive_contact
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Takes the number out of contacts and clears any approval or block, so the caller is screened like a stranger. Reversible with restore.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/contacts/archive" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

POST /v1/contacts/restore

Restore an archived contact

Operation
restore_contact
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Brings an archived contact back under its saved name; they ring straight through again.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/contacts/restore" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

POST /v1/contacts/approve

Let a caller ring straight through

Operation
approve_caller
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Approves a number (the "Through" choice on a contact). Clears a block on it.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
namestringOptional name to save with the approval.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/contacts/approve" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

POST /v1/contacts/unapprove

Screen a caller again

Operation
unapprove_caller
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Removes the approval, so Foyer screens this number like any stranger. To hold their calls for review or block them, refile one of their calls instead.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/contacts/unapprove" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

POST /v1/contacts/appear-unknown

Screen a contact like a stranger for a while

Operation
set_appear_unknown
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

For the next hours, this contact is screened like an unknown caller instead of ringing straight through. hours 0 ends it now.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
hours requirednumber0-720.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/contacts/appear-unknown" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100","hours":0}'

PATCH /v1/contacts/preferences

Change one contact's preferences

Operation
update_contact_preferences
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Per-contact options for a saved contact. record_always records every call with this contact (a recording notice plays first; available on accounts in the preview). answer_mode personal_ai lets Foyer answer this contact with a personal greeting and script instead of ringing straight through (direct). Send only the fields to change. Some of these depend on the member's plan.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
record_alwaysboolean
answer_modestringOne of: direct, personal_ai.
voice_idstringVoice for the personal greeting (from GET /v1/voices); empty clears.
greetingstringCustom greeting for this contact; empty clears. 0-1000 characters.
scriptstringWhat Foyer should say or ask; empty clears. 0-8000 characters.
first_namestring0-200 characters.
last_namestring0-200 characters.
business_namestring0-200 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/contacts/preferences" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

GET /v1/remembered-callers

Callers Foyer remembers

Operation
list_remembered_callers
Auth
API key with contacts:read

People who are not contacts but have called before and gave a name; Foyer greets them by it next time. Up to 200, most recent first.

Returns

200 The remembered callers.

FieldTypeDescription
dataobject
data.enabledbooleanWhether returning-caller recognition is on.
data.callersarray of object
data.callers[].idstring (uuid)
data.callers[].namestring, nullable
data.callers[].name_sourcestring, nullableowner when the member set the name
data.callers[].numberstring, nullable
data.callers[].last_contactobject, nullableWhen they last called and why.
data.callers[].updated_atstring (date-time), nullable

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/remembered-callers" \
  -H "Authorization: Bearer $FOYER_API_KEY"

PATCH /v1/remembered-callers/{id}

Correct a remembered caller's name

Operation
rename_remembered_caller
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

The name Foyer greets this caller by. 1-3 words of letters, up to 40 characters.

Parameters

NameInTypeDescription
id requiredpathstring (uuid)

Request body (JSON)

FieldTypeDescription
name requiredstring0-40 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/remembered-callers/ID" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dave"}'

DELETE /v1/remembered-callers/{id}

Forget a remembered caller

Operation
forget_remembered_caller
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

forget=name forgets only the name; forget=all (default) forgets the caller entirely.

Parameters

NameInTypeDescription
id requiredpathstring (uuid)
forgetquerystringname forgets only the name (the last call stays on record); all forgets the caller entirely. One of: name, all. Default all.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X DELETE "https://api.hifoyer.com/v1/remembered-callers/ID" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/answering-profiles

Saved personal greetings

Operation
list_answering_profiles
Auth
API key with contacts:read

Reusable greetings and scripts the member saved for answering particular contacts.

Returns

200 The saved greetings.

FieldTypeDescription
dataarray of object
data[].idstring (uuid)
data[].namestring
data[].voice_idstring, nullable
data[].greetingstring
data[].scriptstring
data[].updated_atstring (date-time), nullable

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/answering-profiles" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/answering-profiles

Save a personal greeting

Operation
save_answering_profile
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Saves a reusable greeting and/or script. At least one of greeting, script or voice_id is required.

Request body (JSON)

FieldTypeDescription
namestring0-60 characters.
greetingstring0-1000 characters.
scriptstring0-8000 characters.
voice_idstring

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/answering-profiles" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

DELETE /v1/answering-profiles/{id}

Remove a saved personal greeting

Operation
delete_answering_profile
Auth
API key with contacts:write
Plan
Concierge or Chief of Staff (changes data)

Parameters

NameInTypeDescription
id requiredpathstring (uuid)

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X DELETE "https://api.hifoyer.com/v1/answering-profiles/ID" \
  -H "Authorization: Bearer $FOYER_API_KEY"

Account and settings

The member's name, plan, numbers and every setting the app can change.

GET /v1/account

The member's name, plan and Foyer number

Operation
get_account
Auth
API key with settings:read

Names (and the name callers hear), pronouns, the Foyer number calls are forwarded to, and the plan with its API access.

Returns

200 The account.

FieldTypeDescription
dataAccount

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/account" \
  -H "Authorization: Bearer $FOYER_API_KEY"

PATCH /v1/account/profile

Change the member's name

Operation
update_account_name
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

First, last and preferred name. The preferred name (or first and last) is what Foyer tells callers it answers for. At least one name is required; pronouns is optional.

Request body (JSON)

FieldTypeDescription
first_namestring0-100 characters.
last_namestring0-100 characters.
preferred_namestring0-120 characters.
pronounsPronounsHow Foyer refers to the member; null means it just uses their name. One of: he, she, they, private.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/account/profile" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

PUT /v1/account/pronouns

How Foyer refers to the member

Operation
set_pronouns
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
pronouns requiredPronounsHow Foyer refers to the member; null means it just uses their name. One of: he, she, they, private.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/account/pronouns" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pronouns":"he"}'

GET /v1/settings

All settings

Operation
get_settings
Auth
API key with settings:read

Screening level and host, the greeting callers hear, recording, ringing, spam handling and notifications, grouped as in the app.

Returns

200 The settings.

FieldTypeDescription
dataSettings

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/settings" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/settings/openings

Greeting choices

Operation
list_openings
Auth
API key with settings:read

The preset opening lines callers can hear (with how each sounds for this member) and the current choice. Use a preset key with PUT /v1/settings/opening.

Returns

200 The information as the Foyer app shows it.

FieldTypeDescription
dataobject

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/settings/openings" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/settings/screening-hosts

AI models that can screen calls

Operation
list_screening_hosts
Auth
API key with settings:read

The screening hosts (AI models) available on this account, which one is in use, and whether an administrator locked the choice.

Returns

200 The information as the Foyer app shows it.

FieldTypeDescription
dataobject

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/settings/screening-hosts" \
  -H "Authorization: Bearer $FOYER_API_KEY"

GET /v1/voices

Voices Foyer can speak in

Operation
list_voices
Auth
API key with settings:read

The voices available for answering calls and the current one. Use an id with PUT /v1/settings/voice.

Returns

200 The voices.

FieldTypeDescription
dataobject
data.currentobject, nullable
data.voicesarray of object
data.voices[].idstring
data.voices[].namestring
data.voices[].descriptionstring
data.voices[].genderstring
data.voices[].accentstring

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/voices" \
  -H "Authorization: Bearer $FOYER_API_KEY"

PUT /v1/settings/screening-level

How strict screening is

Operation
set_screening_level
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Send level on the 1-5 scale (1-2 lenient, 3 balanced, 4-5 strict) or level_3 on the three-level scale (1 Open, 2 Balanced, 3 Strict; stored as 1, 3 and 5). GET /v1/settings says which scale the member sees (screening.level_scale).

Request body (JSON)

FieldTypeDescription
levelinteger1-5.
level_3integer1-3.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/screening-level" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

PUT /v1/settings/screening-host

Which AI model screens calls

Operation
set_screening_host
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
host requiredstringA key from GET /v1/settings/screening-hosts. One of: qwen, gemini, sonnet.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/screening-host" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"host":"qwen"}'

PUT /v1/settings/opening

The first thing callers hear

Operation
set_opening
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

A preset (classic, warm, concise, butler) or custom with your own text (1-8000 characters). Foyer adds the recording notice when one is required.

Request body (JSON)

FieldTypeDescription
key requiredstringOne of: classic, warm, concise, butler, custom.
textstring0-8000 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/opening" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"key":"classic"}'

PUT /v1/settings/identity-style

How much Foyer says about who it answers for

Operation
set_identity_style
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

friendly uses the member's name, balanced is more reserved, anonymous never says who it answers for.

Request body (JSON)

FieldTypeDescription
style requiredstringOne of: friendly, balanced, anonymous.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/identity-style" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"style":"friendly"}'

PUT /v1/settings/recording

Which calls are recorded

Operation
set_recording
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

The call outcomes whose calls are recorded. Send the full list; an empty list records none. known (saved contacts) is only available on lines that support it.

Request body (JSON)

FieldTypeDescription
record_outcomes requiredarray of string

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/recording" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"record_outcomes":["known"]}'

PATCH /v1/settings/known-callers

Options for calls from saved contacts

Operation
set_known_caller_options
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

transcription_enabled records and transcribes calls with saved contacts (where available). greeting_enabled plays a short greeting before putting a contact through. Send one or both.

Request body (JSON)

FieldTypeDescription
transcription_enabledboolean
greeting_enabledboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/settings/known-callers" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

PATCH /v1/settings/notifications

Email and push notifications

Operation
update_notifications
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

A partial update merged into the member's notification choices, for example {"categories": {"voicemail": {"push": false}}}. Categories: voicemail, call.known, call.connect, call.review, call.voicemail_tier, call.spam, call.live, recordings, daily_digest, product_updates; each has email and/or push (see notifications.channels_available in GET /v1/settings). channels are master switches; options include voicemail_include_transcript, voicemail_include_audio_link and live_note_include_words. Unknown keys are refused.

Request body (JSON)

FieldTypeDescription
channelsobject
channels.emailboolean
channels.pushboolean
categoriesobject
optionsobject

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/settings/notifications" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

PUT /v1/settings/live-call-alerts

Alerts while a call is being screened

Operation
set_live_call_alerts
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
mode requiredstringOne of: off, live_activity, notification.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/live-call-alerts" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"off"}'

PUT /v1/settings/app-badge

What the app icon badge counts

Operation
set_app_badge
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
mode requiredstringOne of: voicemail, missed, all, off.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/app-badge" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"voicemail"}'

PUT /v1/settings/announcements

Push notifications for Foyer announcements

Operation
set_announcement_push
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
push_enabled requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/announcements" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"push_enabled":true}'

PUT /v1/settings/pause

Pause screening

Operation
pause_screening
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

While paused, every call rings straight through without screening (for example while expecting a verification call). indefinite stays paused until resumed; Foyer reminds the member daily.

Request body (JSON)

FieldTypeDescription
preset requiredstringOne of: 10m, 1h, 8h, 24h, indefinite.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/pause" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"preset":"10m"}'

DELETE /v1/settings/pause

Resume screening now

Operation
resume_screening
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X DELETE "https://api.hifoyer.com/v1/settings/pause" \
  -H "Authorization: Bearer $FOYER_API_KEY"

PUT /v1/settings/safe-word

The safe word

Operation
set_safe_word
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

A word or short phrase (up to 60 characters) that lets any caller who says it straight through without screening. Pick something only real contacts would know. An empty string clears it.

Request body (JSON)

FieldTypeDescription
word requiredstring0-60 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/safe-word" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word":"example"}'

PUT /v1/settings/voice

The voice Foyer answers in

Operation
set_voice
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
voice_id requiredstringAn id from GET /v1/voices.
speednumberOptional speaking speed (1 is normal). 0.6-1.4.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/voice" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"voice_id":"example"}'

PUT /v1/settings/voice-speed

How fast Foyer speaks

Operation
set_voice_speed
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
speed requirednumber0.6-1.4.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/voice-speed" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"speed":0.6}'

PUT /v1/settings/ringing

Where approved calls ring

Operation
set_ringing
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

both (the Foyer app and a SIP phone), app, groundwire (SIP phone only) or none.

Request body (JSON)

FieldTypeDescription
mode requiredstringOne of: both, app, groundwire, none.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/ringing" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"both"}'

PUT /v1/settings/browser-ringing

Ring the web dashboard too

Operation
set_browser_ringing
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
enabled requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/browser-ringing" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

PUT /v1/settings/caller-name-lookup

Look up caller ID names

Operation
set_caller_name_lookup
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
enabled requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/caller-name-lookup" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

PUT /v1/settings/spam-auto-report

Report spam calls automatically

Operation
set_spam_auto_report
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

On some accounts this is always on and the stored choice is ignored; the response says the value in effect.

Request body (JSON)

FieldTypeDescription
enabled requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/spam-auto-report" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

PUT /v1/settings/do-not-call

Record that the number is on the Do Not Call registry

Operation
set_do_not_call
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

The member's own statement that their number is registered at donotcall.gov. Foyer cannot check the registry.

Request body (JSON)

FieldTypeDescription
registered requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/settings/do-not-call" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"registered":true}'

GET /v1/numbers

Foyer number and forwarding lines

Operation
list_numbers
Auth
API key with settings:read

The Foyer number calls are forwarded to; the member's phone lines that forward to it, each with whether forwarding is working (forwarding_status: verified, not_forwarding or unchecked) and how to turn it on or off with that carrier; and any extra numbers that ring when a call is put through.

Returns

200 The numbers.

FieldTypeDescription
dataNumbers

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/numbers" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/numbers/forwarding-lines

Add a phone line that forwards to Foyer

Operation
add_forwarding_line
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Records a line the member forwards to their Foyer number. Turning forwarding on happens with the carrier; GET /v1/numbers shows the code to dial.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
labelstringFor example "Work cell". 0-60 characters.
typestringOne of: cell, googlevoice, landline, other.
carrierstring
forward_codestring0-40 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/numbers/forwarding-lines" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

PATCH /v1/numbers/forwarding-lines/label

Rename a forwarding line

Operation
rename_forwarding_line
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
label requiredstring1-60 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/numbers/forwarding-lines/label" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100","label":"example"}'

POST /v1/numbers/forwarding-lines/remove

Remove a forwarding line from Foyer

Operation
remove_forwarding_line
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Removes the line from the member's account. It does not turn off forwarding at the carrier; calls already forwarded still reach Foyer.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/numbers/forwarding-lines/remove" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100"}'

PUT /v1/numbers/carrier

Set a line's carrier

Operation
set_line_carrier
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

The carrier of the member's primary line (or number when given), so Foyer can show the right forwarding codes.

Request body (JSON)

FieldTypeDescription
carrier requiredstring0-40 characters.
forward_codestring0-40 characters.
numberstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/numbers/carrier" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"carrier":"example"}'

PUT /v1/numbers/screened-carrier

Set the carrier of an extra screened number

Operation
set_screened_number_carrier
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
carrier requiredstringOne of: verizon, att, tmobile, uscellular, googlefi, googlevoice, visible, mint, cricket, boost, metro, xfinity, spectrum, other.
forward_codestring0-40 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/numbers/screened-carrier" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100","carrier":"verizon"}'

PUT /v1/numbers/ring-destination

Ring an extra verified number

Operation
set_ring_destination
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Turns ringing on or off for a separately verified number that is not a forwarding line.

Request body (JSON)

FieldTypeDescription
number requiredstringA phone number, ideally E.164 (+16175550100). US numbers may omit +1.
enabled requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/numbers/ring-destination" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"number":"+16175550100","enabled":true}'

PUT /v1/numbers/ring-order

The order extra numbers ring in

Operation
set_ring_order
Auth
API key with settings:write
Plan
Concierge or Chief of Staff (changes data)

Numbers first to last. Only verified, enabled ring destinations are ordered; others are skipped. Depends on the plan.

Request body (JSON)

FieldTypeDescription
numbers requiredarray of string

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/numbers/ring-order" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers":["+16175550100"]}'

Host knowledge

Notes for the host (the AI screener) and the facts it knows about the member.

GET /v1/notes

Notes for the host and what it understands

Operation
list_notes
Auth
API key with settings:read

The member's notes to their host (the AI screener), for example "My plumber Dave will call this week, put him through", and directives, the host's working summary of all of them.

Returns

200 The notes.

FieldTypeDescription
dataobject
data.notesarray of object
data.notes[].idstring
data.notes[].textstring
data.notes[].summarystringThe host's one-line reading of the note.
data.notes[].created_atstring (date-time), nullable
data.notes[].kindstring
data.notes[].sourcestring
data.directivesstringWhat the host currently follows
data.directives_updated_atstring (date-time), nullable

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/notes" \
  -H "Authorization: Bearer $FOYER_API_KEY"

POST /v1/notes

Tell the host something

Operation
add_note
Auth
API key with notes:write
Plan
Concierge or Chief of Staff (changes data)

Adds a note (3-2000 characters) the host takes into account on future calls. The response includes the host's reply and its updated directives.

Request body (JSON)

FieldTypeDescription
text requiredstring3-2000 characters.

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/notes" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"My plumber Dave will call this week. Put him through."}'

DELETE /v1/notes/{id}

Remove a note

Operation
remove_note
Auth
API key with notes:write
Plan
Concierge or Chief of Staff (changes data)

Archives the note and recompiles the host's directives without it.

Parameters

NameInTypeDescription
id requiredpathstring

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X DELETE "https://api.hifoyer.com/v1/notes/ID" \
  -H "Authorization: Bearer $FOYER_API_KEY"

PUT /v1/notes/directives

Edit the host's directives directly

Operation
set_directives
Auth
API key with notes:write
Plan
Concierge or Chief of Staff (changes data)

Replaces the compiled directives with this text as written. The next added or removed note recompiles over it.

Request body (JSON)

FieldTypeDescription
directives requiredstring

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/notes/directives" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"directives":"example"}'

GET /v1/profile

Facts the host knows about the member

Operation
get_host_profile
Auth
API key with settings:read

The facts the host uses when screening (family, pets, providers, vendors the member expects, where they live and work), including suggestions it learned from calls that wait for the member's decision, and whether call learning is on.

Returns

200 The information as the Foyer app shows it.

FieldTypeDescription
dataobject

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
Example
curl "https://api.hifoyer.com/v1/profile" \
  -H "Authorization: Bearer $FOYER_API_KEY"

PATCH /v1/profile/short-form

Edit the member's key facts

Operation
update_host_facts
Auth
API key with notes:write
Plan
Concierge or Chief of Staff (changes data)

Keys present are replaced; missing keys are left alone; empty values clear. List keys (arrays of short strings): spouse, wife, mother, father, children, pets, expectedVendors, activities. Text keys: location, industry, work.

Request body (JSON)

FieldTypeDescription
facts requiredobject

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PATCH "https://api.hifoyer.com/v1/profile/short-form" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"facts":{}}'

POST /v1/profile/facts/{id}/decision

Accept, edit or drop a fact

Operation
decide_host_fact
Auth
API key with notes:write
Plan
Concierge or Chief of Staff (changes data)

accept a suggested fact, edit it (send value), archive it, reject a suggestion, or delete a fact.

Parameters

NameInTypeDescription
id requiredpathstring (uuid)

Request body (JSON)

FieldTypeDescription
decision requiredstringOne of: accept, edit, archive, reject, delete.
valuestring
target_keystring

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X POST "https://api.hifoyer.com/v1/profile/facts/ID/decision" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"decision":"accept"}'

PUT /v1/profile/learning

Let the host learn from calls

Operation
set_call_learning
Auth
API key with notes:write
Plan
Concierge or Chief of Staff (changes data)

When on (and available on the member's line), the host suggests facts from calls. Turning it off stops using learned facts right away.

Request body (JSON)

FieldTypeDescription
enabled requiredboolean

Returns

200 Done. data is what Foyer saved, in the same shape the Foyer app receives (field names may be camelCase). Re-read the resource for the API's own shape.

FieldTypeDescription
data requiredobject

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 402 This feature is not included in the member's plan (plan_required).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
  • 429 Too many requests (rate_limited). Wait the number of seconds in Retry-After.
  • 500 Something failed on Foyer's side (server_error, unavailable). Safe to retry later.
Example
curl -X PUT "https://api.hifoyer.com/v1/profile/learning" \
  -H "Authorization: Bearer $FOYER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true}'

Keys

Key management for the member's own signed-in Foyer app or dashboard (not usable with an API key).

GET /v1/keys

The member's API keys

Operation
list_api_keys
Auth
The member's signed-in Foyer app or dashboard (not an API key)

Every key the member made, newest first, with its status. Never shows the secret. Needs the member's signed-in app session.

Returns

200 The keys.

FieldTypeDescription
dataarray of ApiKey
availablebooleanWhether this account may make keys now.
writes_allowedbooleanWhether the plan includes changes now, so a new key may have write scopes (Concierge, Chief of Staff, the free period).
planstringThe plan's name

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
Example
curl "https://api.hifoyer.com/v1/keys" \
  -H "Authorization: Bearer $FOYER_APP_SESSION"

POST /v1/keys

Make an API key

Operation
create_api_key
Auth
The member's signed-in Foyer app or dashboard (not an API key)

Makes a key with the chosen scopes. The secret is in this response only; Foyer stores just a fingerprint of it. Write scopes need a plan that includes changes (403 plan_does_not_include_writes otherwise). At most 10 active keys.

Request body (JSON)

FieldTypeDescription
name requiredstringWhat the key is for, e.g. "Claude". 1-60 characters.
scopes requiredarray of Scope
expires_in_daysinteger1-90. Default 90.

Returns

201 The new key, with its secret (shown once).

FieldTypeDescription
dataobject
data.idstring (uuid)
data.kindstringkey: a personal API key. app: an app connected by signing in (MCP). One of: key, app.
data.namestringThe key's name
data.key_hintstring, nullableThe first characters of the key
data.appobjectConnected apps only (kind app).
data.app.namestringThe name the app registered with.
data.app.hoststring, nullableWhere the app sends the member back after sign-in
data.scopesarray of Scope
data.statusstringOne of: active, revoked, expired.
data.created_atstring (date-time)
data.last_used_atstring (date-time), nullable
data.expires_atstring (date-time)
data.revoked_atstring (date-time), nullable
data.secretstringThe key (fyr_…). Shown once.

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 403 Not allowed. insufficient_scope: the key lacks the scope named in details.required_scope. plan_does_not_include_writes: the member's plan reads only, nothing was changed. api_not_enabled: the API is not open on this account yet. forbidden: the app itself refuses this change (for example a feature not available on this line).
  • 409 The change conflicts with the account's current state (conflict, key_limit).
Example
curl -X POST "https://api.hifoyer.com/v1/keys" \
  -H "Authorization: Bearer $FOYER_APP_SESSION" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dave","scopes":["calls:read"]}'

POST /v1/keys/{id}/revoke

Revoke an API key

Operation
revoke_api_key
Auth
The member's signed-in Foyer app or dashboard (not an API key)

The key stops working immediately, including audio links it made. Idempotent.

Parameters

NameInTypeDescription
id requiredpathstring (uuid)

Returns

200 The revoked key.

FieldTypeDescription
dataApiKeyA personal API key (kind = key) or an app the member connected by signing in, such as Claude or ChatGPT through the Foyer MCP connector (kind = app). Both are listed, logged and revoked the same way.

Errors

  • 401 No valid key, or the key was revoked or expired (unauthorized).
  • 404 No such call, contact or item on this account (not_found, media_not_found).
Example
curl -X POST "https://api.hifoyer.com/v1/keys/ID/revoke" \
  -H "Authorization: Bearer $FOYER_APP_SESSION"

GET /v1/keys/activity

What each key did

Operation
get_api_activity
Auth
The member's signed-in Foyer app or dashboard (not an API key)

For each key, requests in the last days and what they read or changed in plain words ("read 14 calls, 3 voicemails, searched twice"), plus the 50 most recent requests. The log records endpoints, counts and status only, never content.

Parameters

NameInTypeDescription
daysqueryintegerHow many days back to summarize, 1-90 (default 30). 1-90. Default 30.

Returns

200 The activity.

FieldTypeDescription
dataobject
data.daysinteger
data.keysarray of object
data.keys[].idstring (uuid)
data.keys[].kindstringkey: a personal API key. app: an app connected by signing in (MCP). One of: key, app.
data.keys[].namestringThe key's name
data.keys[].key_hintstring, nullableThe first characters of the key
data.keys[].appobjectConnected apps only (kind app).
data.keys[].app.namestringThe name the app registered with.
data.keys[].app.hoststring, nullableWhere the app sends the member back after sign-in
data.keys[].scopesarray of Scope
data.keys[].statusstringOne of: active, revoked, expired.
data.keys[].created_atstring (date-time)
data.keys[].last_used_atstring (date-time), nullable
data.keys[].expires_atstring (date-time)
data.keys[].revoked_atstring (date-time), nullable
data.keys[].requestsinteger
data.keys[].errorsinteger
data.keys[].last_request_atstring (date-time), nullable
data.keys[].records_readobject
data.keys[].searchesinteger
data.keys[].changesinteger
data.keys[].summarystring
data.recentarray of object
data.recent[].key_idstring
data.recent[].atstring (date-time)
data.recent[].methodstring
data.recent[].endpointstring
data.recent[].statusinteger
data.recent[].resourcestring, nullable
data.recent[].recordsinteger
data.recent[].error_codestring, nullable

Errors

  • 400 The request is missing something or has a value Foyer does not accept (invalid_request).
  • 401 No valid key, or the key was revoked or expired (unauthorized).
Example
curl "https://api.hifoyer.com/v1/keys/activity" \
  -H "Authorization: Bearer $FOYER_APP_SESSION"

Objects

Error

FieldTypeDescription
error requiredobject
error.code requiredstringStable code: unauthorized, api_not_enabled, insufficient_scope, plan_does_not_include_writes, plan_required, forbidden, invalid_request, not_found, media_not_found, conflict, key_limit, link_expired, rate_limited, unavailable, server_error.
error.message requiredstringA sentence for people.
error.status requiredintegerThe HTTP status.
error.detailsobject

Scope

string. One of: calls:read, transcripts:read, audio:read, contacts:read, settings:read, calls:write, contacts:write, settings:write, notes:write.

PhoneNumber

A phone number, ideally E.164 (+16175550100). US numbers may omit +1.

string.

Pronouns

How Foyer refers to the member; null means it just uses their name.

string, nullable. One of: he, she, they, private.

Outcome

What Foyer did with the call. known: a saved contact, put straight through. connect: screened, then put through to the member. review: Foyer was unsure and held the call for the member. voicemail / gate: sent to voicemail (the caller may or may not have left one). honeypot: screened as spam and turned away. fallback: a blocked caller, turned away.

string. One of: known, connect, review, voicemail, gate, honeypot, fallback.

AudioPart

string. One of: voicemail, screening, call, caller, owner.

SearchField

string. One of: name, caller_id_name, company, number, summary, voicemail, screening_conversation, connected_call.

Call

A screened call as it appears in lists.

FieldTypeDescription
id requiredstringThe call's id.
started_at requiredstring (date-time), nullable
ended_atstring (date-time), nullable
duration_secinteger
caller requiredobject
caller.numberstring, nullableThe caller's number (E.164)
caller.namestring, nullableThe name Foyer knows them by (contact
caller.caller_id_namestring, nullableThe carrier's caller ID name.
caller.companystring, nullableThe business they said they call from.
caller.identity_sourcestringWhere name came from (contact
caller.citystring, nullable
caller.statestring, nullable
outcome requiredOutcomeWhat Foyer did with the call. known: a saved contact, put straight through. connect: screened, then put through to the member. review: Foyer was unsure and held the call for the member. voicemail / gate: sent to voicemail (the caller may or may not have left one). honeypot: screened as spam and turned away. fallback: a blocked caller, turned away. One of: known, connect, review, voicemail, gate, honeypot, fallback.
outcome_labelstringThe outcome in plain words.
refiled_asstring, nullableThe member's own decision on this call, if they refiled it. One of: through, screened, review, voicemail, block.
summary requiredstringOne or two sentences on who called and why.
spam_scorenumber, nullable0-1 likelihood the caller is spam
self_testbooleanThe member called their own line to test it.
read requiredbooleanThe member has opened this call.
archived requiredboolean
voicemail requiredobject
voicemail.statestringtranscribed message with text; audio_only message without text yet; captured being processed; not_left sent to voicemail but no message; none. One of: transcribed, audio_only, captured, not_left, none.
voicemail.has_audioboolean
voicemail.reviewedbooleanThe member has heard it.
has_screening_recordingboolean
has_call_recordingboolean
has_connected_transcriptbooleanThe connected conversation was recorded and transcribed.
record_alwaysbooleanRecorded because the caller is a contact set to always record.
hangupobjectHow and when the call ended

CallDetail

A screened call as it appears in lists.

FieldTypeDescription
id requiredstringThe call's id.
started_at requiredstring (date-time), nullable
ended_atstring (date-time), nullable
duration_secinteger
caller requiredobject
caller.numberstring, nullableThe caller's number (E.164)
caller.namestring, nullableThe name Foyer knows them by (contact
caller.caller_id_namestring, nullableThe carrier's caller ID name.
caller.companystring, nullableThe business they said they call from.
caller.identity_sourcestringWhere name came from (contact
caller.citystring, nullable
caller.statestring, nullable
outcome requiredOutcomeWhat Foyer did with the call. known: a saved contact, put straight through. connect: screened, then put through to the member. review: Foyer was unsure and held the call for the member. voicemail / gate: sent to voicemail (the caller may or may not have left one). honeypot: screened as spam and turned away. fallback: a blocked caller, turned away. One of: known, connect, review, voicemail, gate, honeypot, fallback.
outcome_labelstringThe outcome in plain words.
refiled_asstring, nullableThe member's own decision on this call, if they refiled it. One of: through, screened, review, voicemail, block.
summary requiredstringOne or two sentences on who called and why.
spam_scorenumber, nullable0-1 likelihood the caller is spam
self_testbooleanThe member called their own line to test it.
read requiredbooleanThe member has opened this call.
archived requiredboolean
voicemail requiredobject
voicemail.duration_secnumber, nullable
voicemail.reviewed_atstring (date-time), nullable
voicemail.transcriptstringThe message text (transcripts:read).
has_screening_recordingboolean
has_call_recordingboolean
has_connected_transcriptbooleanThe connected conversation was recorded and transcribed.
record_alwaysbooleanRecorded because the caller is a contact set to always record.
hangupobjectHow and when the call ended
read_atstring (date-time), nullable
tostring, nullableThe Foyer number the call reached.
forwarded_fromstring, nullableThe member's line that forwarded the call
lineobject, nullableThe member's forwarding line the caller dialled, when identified.
line.namestring, nullable
line.numberstring, nullable
incidentsarray of objectAnything that went wrong or was degraded on this call, in plain words, most serious first.
recordingsobject
recordings.screeningobject, nullable
recordings.callobject, nullable
audio_partsarray of AudioPartThe recordings GET /v1/calls/{id}/audio can play for this call.
connected_callobject, nullableThe conversation after Foyer put the caller through, when it was recorded.
connected_call.started_atstring (date-time), nullable
connected_call.transcript_statusstring, nullable
connected_call.transcriptarray of objectBoth sides in order (transcripts:read).
connected_call.transcript[].speakerstringOne of: caller, you.
connected_call.transcript[].textstring
connected_call.transcript[].start_secnumber, nullable
connected_call.transcript[].atstring (date-time), nullable
connected_call.sidesarray of objectEach side's text on its own, when the two could not be put in order (transcripts:read).
connected_call.sides[].speakerstringOne of: caller, you.
connected_call.sides[].textstring
screening_conversationarray of objectWhat Foyer and the caller said while screening, in order (transcripts:read).
screening_conversation[].speakerstringOne of: caller, foyer.
screening_conversation[].textstring
screening_conversation[].atstring (date-time), nullable
transcripts_omittedbooleanTrue when the key lacks transcripts:read, so the words were left out.

SearchHit

FieldTypeDescription
callCallA screened call as it appears in lists.
matched_inarray of SearchField
excerptstring, nullableA short passage around the first match (not for number matches).

Contact

FieldTypeDescription
numberstring
namestring, nullable
treatmentstringthrough rings straight through; appear_unknown is screened like a stranger until appear_unknown_until. One of: through, appear_unknown.
appear_unknown_untilstring (date-time), nullable
personalizedbooleanHas a personal greeting or answering setup.

Account

FieldTypeDescription
member_idstring (uuid)
first_namestring, nullable
last_namestring, nullable
preferred_namestring, nullable
display_namestring, nullable
name_callers_hearstring, nullableThe name Foyer says it answers for.
pronounsPronounsHow Foyer refers to the member; null means it just uses their name. One of: he, she, they, private.
foyer_numberstring, nullableThe Foyer number the member's lines forward to.
planobject
plan.namestringDoorman
plan.keystring
plan.api_accessstringOne of: read, write.
plan.basisstring

Me

FieldTypeDescription
member_idstring (uuid)
keyobject, nullable
key.idstring (uuid)
key.namestring
key.scopesarray of Scope
key.expires_atstring (date-time)
accessobject
access.levelstringWhat the member's plan allows through the API. One of: read, write.
access.planstring
access.plan_keystring
access.basisstringWhy (plan, free_period, complimentary, grace, trial, no_active_plan, billing_unknown).
access.writes_allowedboolean
scopesarray of object
scopes[].scopeScopeOne of: calls:read, transcripts:read, audio:read, contacts:read, settings:read, calls:write, contacts:write, settings:write, notes:write.
scopes[].grantedboolean
scopes[].descriptionstring
rate_limitsobject
rate_limits.per_minuteinteger
rate_limits.per_dayinteger
rate_limits.searches_per_minuteinteger

Settings

FieldTypeDescription
screeningobject
screening.levelinteger, nullableStored strictness 1-5.
screening.level_scaleintegerWhich scale the member's app shows. One of: 3, 5.
screening.level_3integer, nullableThe same choice on the three-level scale.
screening.hoststring, nullableThe AI model screening calls.
screening.safe_wordstring, nullable
screening.pauseobject, nullableWhether screening is paused and until when.
greetingobject
greeting.opening_keystring
greeting.opening_textstring
greeting.opener_previewobject, nullableWhat callers hear
greeting.identity_stylestring, nullable
greeting.owner_pronounsPronounsHow Foyer refers to the member; null means it just uses their name. One of: he, she, they, private.
greeting.voice_idstring, nullable
greeting.voice_speednumber
recordingobject
recording.record_outcomesarray of string
recording.known_caller_transcriptionboolean
recording.known_caller_greetingboolean
recording.known_caller_transcription_availableboolean
ringingobject
ringing.modestringOne of: both, app, groundwire, none.
ringing.browserboolean
ringing.iphone_readybooleanAn iPhone can ring right now.
spamobject
spam.auto_reportboolean
spam.do_not_call_registered_atstring (date-time), nullable
spam.caller_name_lookupboolean
notificationsobject
notifications.preferencesobjectThe full notification choices (channels
notifications.channels_availableobjectWhich channels each category supports.
notifications.live_call_alertsstringOne of: off, live_activity, notification.
notifications.app_badgestring, nullableOne of: voicemail, missed, all, off.
notifications.announcements_pushboolean, nullable

Numbers

FieldTypeDescription
foyer_numberstring, nullable
forwarding_linesarray of object
forwarding_lines[].numberstring, nullable
forwarding_lines[].labelstring
forwarding_lines[].typestring
forwarding_lines[].carrierstring
forwarding_lines[].verifiedboolean
forwarding_lines[].forwarding_statusstringOne of: verified, not_forwarding, unchecked, disconnected.
forwarding_lines[].forwarding_status_atstring (date-time), nullable
forwarding_lines[].last_checked_atstring (date-time), nullable
forwarding_lines[].forwarding_verified_atstring (date-time), nullable
forwarding_lines[].turn_onobject, nullableHow to switch forwarding on with this carrier.
forwarding_lines[].turn_offobject, nullableHow to switch it off.
ring_destinationsarray of object
ring_destinations[].numberstring, nullable
ring_destinations[].labelstring
ring_destinations[].verifiedboolean
ring_destinations[].ring_enabledboolean
ring_destinations[].priorityinteger

ApiKey

A personal API key (kind = key) or an app the member connected by signing in, such as Claude or ChatGPT through the Foyer MCP connector (kind = app). Both are listed, logged and revoked the same way.

FieldTypeDescription
idstring (uuid)
kindstringkey: a personal API key. app: an app connected by signing in (MCP). One of: key, app.
namestringThe key's name
key_hintstring, nullableThe first characters of the key
appobjectConnected apps only (kind app).
app.namestringThe name the app registered with.
app.hoststring, nullableWhere the app sends the member back after sign-in
scopesarray of Scope
statusstringOne of: active, revoked, expired.
created_atstring (date-time)
last_used_atstring (date-time), nullable
expires_atstring (date-time)
revoked_atstring (date-time), nullable