The Exist connector lets your AI agent act in each user's Exist account. Each user signs in to Exist once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 15 tools.
- Tools
- 15
- What they doRead · write · destructive
- 10 · 5 · 010 read5 write0 destructive
- Users sign in with
- OAuth
- OAuth app
- Your own Exist app
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Exist connection
In AgentKit > Connections, create an Exist connection and copy its redirect URI. The name you give it is the
connection_nameyour code passes. See Configure connections.Register an OAuth app
Exist connections use your own OAuth app. Register one with Exist and add the redirect URI you copied.
Then enter the app's Client ID and Client Secret on the Exist connection.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'exist'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Exist:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'exist_attribute_templates_list',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "exist"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Exist:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="exist_attribute_templates_list",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolexist_attribute_templates_listList the attribute templates Exist supports (its built-in attribute types, such as steps, sleep or mood).Read-onlyList Attribute Templates
List the attribute templates Exist supports (its built-in attribute types, such as steps, sleep or mood). Returns a paged object with count, next, previous and results; each template has name, label, group, priority, value_type and value_type_description. Use exist_attribute_templates_list to find a template name to pass to exist_attributes_create or exist_attributes_acquire. Use exist_attributes_list for the attributes this user actually has.
Inputs
groupsstring- Comma-separated attribute group names to filter by, such as activity, productivity, mood, sleep, workouts, events, finance, food, health, location, media, social, weather, symptoms, medication or custom. Example: activity,workouts.
include_low_priorityboolean- Set to true to also return low-priority attributes (priority 10 or higher). Leave empty to leave them out.
limitinteger- Number of results per page. Leave empty to use Exist's default page size. Example: 50.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
exist_attribute_values_getGet the daily values of one Exist attribute, newest first.Read-onlyGet Attribute Values
Get the daily values of one Exist attribute, newest first. Returns a paged object with count, next, previous and results, where each result is a {date, value} pair (date in YYYY-MM-DD, value typed by the attribute's value_type, null for days without data). Use exist_attribute_values_get to read the history of a single attribute, paging back with page and date_max. Use exist_attributes_with_values_list for recent values across many attributes. Results are limited to the connection's read scopes.
Inputs
attributestringrequired- Name of the attribute to read values for (its 'name' field from exist_attributes_list, not the label). Example: steps.
date_maxstring- Most recent date to include, inclusive, in YYYY-MM-DD format (the user's local date). Example: 2026-05-16.
limitinteger- Number of results per page, at most 100. Leave empty to use Exist's default page size. Example: 50.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
exist_attributes_listList the user's Exist attributes (the things they track, such as steps, mood or sleep), without values.Read-onlyList Attributes
List the user's Exist attributes (the things they track, such as steps, mood or sleep), without values. Returns a paged object with count, next, previous and results; each attribute has name, label, template, group, service (the app that owns it), active, priority, manual, value_type, value_type_description and available_services. Use exist_attributes_list to find attribute names, value types and owners. Use exist_attributes_with_values_list for recent values, exist_attribute_values_get for one attribute's history, and exist_owned_attributes_list for only the attributes this app owns. Results are limited to the connection's read scopes.
Inputs
attributesstring- Comma-separated attribute names to filter by. Use the 'name' field from exist_attributes_list, not the label. Example: steps,mood,sleep.
exclude_customboolean- Set to true to return only templated attributes and leave out custom ones (such as custom tags). Leave empty to include both.
groupsstring- Comma-separated attribute group names to filter by, such as activity, productivity, mood, sleep, workouts, events, finance, food, health, location, media, social, weather, symptoms, medication or custom. Example: activity,workouts.
include_inactiveboolean- Set to true to also return inactive attributes (active = false), which Exist usually hides. Leave empty to return active attributes only.
include_low_priorityboolean- Set to true to also return low-priority attributes (priority 10 or higher). Leave empty to leave them out.
limitinteger- Number of results per page. Leave empty to use Exist's default page size. Example: 50.
manualboolean- Set to true to return only manually tracked attributes, or false to leave them out. Leave empty to include both.
ownedboolean- Set to true to return only attributes owned by this app (client). Leave empty to return all of the user's attributes.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
exist_attributes_with_values_listList the user's Exist attributes together with their most recent daily values.Read-onlyList Attributes With Values
List the user's Exist attributes together with their most recent daily values. Returns a paged object with count, next, previous and results; each attribute has name, label, template, group, service, priority, manual, active, value_type, value_type_description and a values array of {date, value} pairs, newest first, with null for days without data. Use exist_attributes_with_values_list for a dashboard of recent days (up to 31) across many attributes. Use exist_attribute_values_get for the full history of one attribute. Results are limited to the connection's read scopes.
Inputs
attributesstring- Comma-separated attribute names to filter by. Use the 'name' field from exist_attributes_list, not the label. Example: steps,mood,sleep.
date_maxstring- Most recent date to include, inclusive, in YYYY-MM-DD format (the user's local date). Example: 2026-05-16.
daysinteger- Number of days of values to include for each attribute, from 1 to 31. Exist's default is 1 (today only). Example: 7.
groupsstring- Comma-separated attribute group names to filter by, such as activity, productivity, mood, sleep, workouts, events, finance, food, health, location, media, social, weather, symptoms, medication or custom. Example: activity,workouts.
limitinteger- Number of results per page. Leave empty to use Exist's default page size. Example: 50.
manualboolean- Set to true to return only manually tracked attributes. Leave empty to include all.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
templatesstring- Comma-separated attribute template names to filter by, such as steps,sleep,mood. Use this instead of attributes when you only care about templated attributes; use one or the other, not both.
exist_averages_listList the user's weekly Exist averages (actually medians over the last 60 days) per attribute, broken down by day of the week.Read-onlyList Averages
List the user's weekly Exist averages (actually medians over the last 60 days) per attribute, broken down by day of the week. Returns a paged object with count, next, previous and results; each result has attribute, date, overall, and monday through sunday. Use exist_averages_list for the user's typical values and goals. Set include_historical with attributes to get past weeks' averages for trend lines. Results are limited to the connection's read scopes.
Inputs
attributesstring- Comma-separated attribute names to filter by. Use the 'name' field from exist_attributes_list, not the label. Example: steps,mood,sleep.
date_maxstring- Most recent date to include, inclusive, in YYYY-MM-DD format (the user's local date). Example: 2026-05-16.
date_minstring- Oldest date to include, inclusive, in YYYY-MM-DD format (the user's local date). Example: 2026-04-01.
groupsstring- Comma-separated attribute group names to filter by, such as activity, productivity, mood, sleep, workouts, events, finance, food, health, location, media, social, weather, symptoms, medication or custom. Example: activity,workouts.
include_historicalboolean- Set to true to return past weekly averages too, newest first, instead of only the latest set. Best combined with attributes to limit it to one attribute.
limitinteger- Number of results per page. Leave empty to use Exist's default page size. Example: 50.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
exist_correlation_getGet the correlation Exist found between two specific attributes, if there is one.Read-onlyGet Correlation
Get the correlation Exist found between two specific attributes, if there is one. Returns a single correlation object with attribute, attribute2, value (from -1 to 1), p, percentage, stars, second_person, strength_description, stars_description and rating; Exist returns HTTP 404 when it has found no correlation for the pair. Use exist_correlation_get to answer whether two things are related, such as sleep and workouts. Use exist_correlations_list to browse all correlations. At least one of the two attributes must be in the connection's read scopes.
Inputs
attributestringrequired- Name of the first attribute (its 'name' field, not the label). Order doesn't matter. Example: sleep.
attribute2stringrequired- Name of the second attribute (its 'name' field, not the label). Order doesn't matter. Example: workouts_min.
exist_correlations_listList the correlations Exist found between the user's attributes in the last week (for example "you sleep more when you go to bed earlier").Read-onlyList Correlations
List the correlations Exist found between the user's attributes in the last week (for example "you sleep more when you go to bed earlier"). Returns a paged object with count, next, previous and results; each correlation has attribute, attribute2, value (from -1 to 1), p, percentage, stars (confidence, 5 is highest), second_person (a plain-English sentence), strength_description, stars_description, period, offset, date and rating. Use exist_correlations_list to browse relationships, filtered by attribute, strength or confidence. Use exist_correlation_get to check one specific pair. Correlations are generated weekly on Sundays; they show relationships, not causes.
Inputs
attributestring- Attribute name to limit correlations to (its 'name' field, not the label). Example: sleep.
confidentinteger- Set to 1 to return only correlations with five-star confidence. Leave empty to return all.one of
1 limitinteger- Number of results per page, at most 100. Leave empty to use Exist's default page size. Example: 50.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
stronginteger- Set to 1 to return only correlations above Exist's strength threshold. Leave empty to return all.one of
1
exist_insights_listList the insights Exist generated from the user's data, such as a record step count or a monthly summary.Read-onlyList Insights
List the insights Exist generated from the user's data, such as a record step count or a monthly summary. Returns a paged object with count, next, previous and results; each insight has created, target_date, type (name, period, priority and the related attribute), html and text. Use exist_insights_list to surface notable events in the user's data, filtered by date or priority. Use exist_correlations_list for relationships between attributes. Results are limited to the connection's read scopes.
Inputs
date_maxstring- Most recent date to include, inclusive, in YYYY-MM-DD format (the user's local date). Example: 2026-05-16.
date_minstring- Oldest date to include, inclusive, in YYYY-MM-DD format (the user's local date). Example: 2026-04-01.
limitinteger- Number of results per page, at most 100. Leave empty to use Exist's default page size. Example: 50.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
priorityinteger- Insight priority to filter by: 1 today (real time), 2 day level, 3 week level, 4 month level. Leave empty for all.one of
1234
exist_owned_attributes_listList the user's Exist attributes that this app (client) currently owns, without values.Read-onlyList Owned Attributes
List the user's Exist attributes that this app (client) currently owns, without values. Returns a paged object with count, next, previous and results; each attribute has name, label, template, group, service, active, priority, manual, value_type, value_type_description and available_services. Use exist_owned_attributes_list to check which attributes this app can write to. Use exist_attributes_list for all of the user's attributes.
Inputs
attributesstring- Comma-separated attribute names to filter by. Use the 'name' field from exist_attributes_list, not the label. Example: steps,mood,sleep.
exclude_customboolean- Set to true to return only templated attributes and leave out custom ones (such as custom tags). Leave empty to include both.
groupsstring- Comma-separated attribute group names to filter by, such as activity, productivity, mood, sleep, workouts, events, finance, food, health, location, media, social, weather, symptoms, medication or custom. Example: activity,workouts.
include_inactiveboolean- Set to true to also return inactive attributes (active = false), which Exist usually hides. Leave empty to return active attributes only.
include_low_priorityboolean- Set to true to also return low-priority attributes (priority 10 or higher). Leave empty to leave them out.
limitinteger- Number of results per page. Leave empty to use Exist's default page size. Example: 50.
manualboolean- Set to true to return only manually tracked attributes, or false to leave them out. Leave empty to include both.
pageinteger- Page number of results to return, starting at 1. Leave empty for the first page. Use the 'next' URL's page number from the previous response to fetch the next page. Example: 2.
exist_profile_getGet the authenticated Exist user's profile and preferences.Read-onlyGet Profile
Get the authenticated Exist user's profile and preferences. Returns username, first and last name, avatar URL, timezone, current local time, the imperial_* unit flags (distance, weight, energy, liquid, temperature), and trial and delinquent account status. Use exist_profile_get to learn the user's timezone and today's local date before reading or writing daily values, and which units to display. No scope is required.
Inputs
This tool takes no inputs.
exist_attribute_values_incrementAdd an amount to the current daily value of one or more numeric Exist attributes (up to 35 increments per call).WriteIncrement Attribute Values
Add an amount to the current daily value of one or more numeric Exist attributes (up to 35 increments per call). Returns an object with success and failed arrays; each successful item includes current, the new total for that day, and each failed item carries error and error_code. HTTP 200 means all succeeded, 202 means some failed. Use exist_attribute_values_increment to count events as they happen without tracking the running total. Use exist_attribute_values_update to set a total. String, scale and time-of-day attributes can't be incremented. Prerequisites: the attribute must already exist and be owned by this app (exist_attributes_acquire or exist_attributes_create).
Inputs
incrementsarrayrequired- The amounts to add, one object per attribute and day, at most 35. Each needs the attribute name and a numeric value (integer or float, matching the attribute's type); the date in YYYY-MM-DD is optional and defaults to today. Example: [{"name": "steps", "date": "2026-05-20", "value": 700}, {"name": "steps_active_min", "value": 5}].
exist_attribute_values_updateSet the total daily value of one or more Exist attributes, overwriting any existing value for that day (up to 35 updates per call).WriteUpdate Attribute Values
Set the total daily value of one or more Exist attributes, overwriting any existing value for that day (up to 35 updates per call). Returns an object with success and failed arrays; each failed item carries error and error_code. HTTP 200 means all succeeded, 202 means some failed. Use exist_attribute_values_update to write a day's total. Use exist_attribute_values_increment to add to the current value instead. Non-null values can't be set back to null. Prerequisites: the connection needs the matching write scope, and this app must own each attribute first (exist_attributes_acquire or exist_attributes_create).
Inputs
updatesarrayrequired- The values to write, one object per attribute and day, at most 35. Each needs the attribute name, the date in YYYY-MM-DD (the user's local date, see exist_profile_get for their timezone), and a value that matches the attribute's value type: a string, an integer or a float. Example: [{"name": "mood", "date": "2026-05-20", "value": 7}, {"name": "mood_note", "date": "2026-05-20", "value": "Great day"}].
exist_attributes_acquireTake ownership of one or more of the user's Exist attributes so this app can write their values (up to 35 per call).WriteAcquire Attributes
Take ownership of one or more of the user's Exist attributes so this app can write their values (up to 35 per call). Acquiring a templated attribute the user doesn't have yet creates it. Returns an object with success and failed arrays; each failed item carries error and error_code. HTTP 200 means all succeeded, 202 means some failed. Set success_objects to 1 to get full attribute objects back. Use exist_attributes_acquire once per attribute before writing with exist_attribute_values_update or exist_attribute_values_increment. Use exist_attributes_create for a new custom attribute, and exist_attributes_release to give ownership back. The user isn't asked to approve, so tell them. Prerequisites: the connection needs the write scope for each attribute's group.
Inputs
attributesarrayrequired- The attributes to acquire, at most 35. Identify each one by template (a template name from exist_attribute_templates_list, which creates the attribute if the user doesn't have it) or by name (an existing attribute's name from exist_attributes_list). Optionally set manual to true or false to mark it as manually tracked or not. Example: [{"template": "mood"}, {"name": "mood_note", "manual": false}].
success_objectsinteger- Set to 1 to get the full attribute object for each successful item in the response, instead of an echo of what you sent. Leave empty for the echo.one of
1
exist_attributes_createCreate one or more new Exist attributes for the user, from a template or fully custom, owned by this app (up to 35 per call).WriteCreate Attributes
Create one or more new Exist attributes for the user, from a template or fully custom, owned by this app (up to 35 per call). Returns an object with success and failed arrays; each failed item carries error and error_code. HTTP 200 means all succeeded, 202 means some failed. Read the created attribute's name from the response, since a custom attribute's name may differ from its label; set success_objects to 1 to get full attribute objects. Use exist_attributes_create to add an attribute the user doesn't track yet. Use exist_attributes_acquire to take over an existing attribute. Prerequisites: the connection needs the write scope for the attribute's group, or manual_write for manual attributes in any group.
Inputs
attributesarrayrequired- The attributes to create, at most 35. For a templated attribute give only template (a name from exist_attribute_templates_list). For a custom attribute give label (the user-facing title), group (an existing group name such as mood, health or custom) and value_type: 0 integer, 1 decimal, 2 string, 3 duration in minutes, 4 time of day in minutes from midnight, 5 percentage from 0.0 to 1.0, 7 boolean, 8 scale from 1 to 9 (6 is reserved for templates). manual is optional and defaults to true. Example: [{"template": "facebook_reactions"}, {"label": "Glasses of water", "group": "food", "value_type": 0, "manual": true}].
success_objectsinteger- Set to 1 to get the full attribute object for each successful item in the response, instead of an echo of what you sent. Leave empty for the echo.one of
1
exist_attributes_releaseGive up this app's ownership of one or more Exist attributes (up to 35 per call).WriteRelease Attributes
Give up this app's ownership of one or more Exist attributes (up to 35 per call). Ownership passes to another connected service that can supply the attribute, or the attribute becomes inactive. Returns an object with success and failed arrays; each failed item carries error and error_code (for example when this app doesn't own the attribute). HTTP 200 means all succeeded, 202 means some failed. Use exist_attributes_release when the user stops syncing an attribute from this app. Use exist_attributes_acquire to take ownership.
Inputs
namesarrayrequired- Names of the attributes to release, at most 35. Use each attribute's 'name' field, not its label. Example: ["mood", "mood_note"].
No tools match.