Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions content/docs/resources/integrations/productivity/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
"[Google Contacts](/en/resources/integrations/productivity/google-contacts)",
"[Google Docs](/en/resources/integrations/productivity/google-docs)",
"[Google Drive](/en/resources/integrations/productivity/google-drive)",
"[Google Forms](/en/resources/integrations/productivity/google-forms)",
"[Google Sheets](/en/resources/integrations/productivity/google-sheets)",
"[Google Slides](/en/resources/integrations/productivity/google-slides)",
"[Granola](/en/resources/integrations/productivity/granola)",
Expand Down
41 changes: 21 additions & 20 deletions public/llms.txt

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions toolkit-docs-generator/data/toolkits/airtable.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "Airtable",
"label": "Airtable",
"version": "1.0.2",
"version": "1.0.4",
"description": "Arcade tools designed for LLMs to interact with Airtable bases and records",
"metadata": {
"category": "productivity",
Expand All @@ -27,7 +27,7 @@
{
"name": "CreateRecords",
"qualifiedName": "Airtable.CreateRecords",
"fullyQualifiedName": "Airtable.CreateRecords@1.0.2",
"fullyQualifiedName": "Airtable.CreateRecords@1.0.4",
"description": "Create rows in an Airtable table, up to 10 per call.\n\nRepeating this call creates additional rows rather than replacing the first set.\n`count` and `requested_count` are equal on success, and `record_ids` names the rows.\nIf Airtable confirms fewer rows than requested, this call raises instead of reporting\nan incomplete success, because new rows do not have caller-known IDs to reconcile.",
"parameters": [
{
Expand Down Expand Up @@ -176,7 +176,7 @@
{
"name": "DeleteRecords",
"qualifiedName": "Airtable.DeleteRecords",
"fullyQualifiedName": "Airtable.DeleteRecords@1.0.2",
"fullyQualifiedName": "Airtable.DeleteRecords@1.0.4",
"description": "Delete rows from an Airtable table, up to 10 per call.\n\nDeleted rows are removed from the table and cannot be restored through the API.\n`record_ids` holds only the rows Airtable confirmed deleted. When `count` is lower than\n`requested_count`, `unconfirmed_record_ids` names the rest; re-read those before\ndeleting again.",
"parameters": [
{
Expand Down Expand Up @@ -267,7 +267,7 @@
{
"name": "GetBaseSchema",
"qualifiedName": "Airtable.GetBaseSchema",
"fullyQualifiedName": "Airtable.GetBaseSchema@1.0.2",
"fullyQualifiedName": "Airtable.GetBaseSchema@1.0.4",
"description": "Get the column names, column types and select options inside an Airtable base.\n\nRead this before writing records: writes key on column names, a select column\nrejects values outside the options reported here, and a linked-record column only\naccepts record IDs from the table it names.\n\n`views_included` is false whenever a table's views were not returned: include_views\nwas false, or they were left out to fit the response (then `truncated` is true). An\nempty views list with `views_included` true means the table has no saved views.\n\nNarrow with `table` when only one table matters. Airtable returns the whole base,\nso leaving it empty on a wide base costs the context the records themselves need.\n`truncated` says detail was left out to keep the response usable: descriptions and\nviews go first, then columns from the end of a table. Ask for one named table to give\nit the whole response; a table still too wide returns its leading columns in order,\nalways at least its first, whose select options may be cut from the end.",
"parameters": [
{
Expand Down Expand Up @@ -353,7 +353,7 @@
{
"name": "GetRecord",
"qualifiedName": "Airtable.GetRecord",
"fullyQualifiedName": "Airtable.GetRecord@1.0.2",
"fullyQualifiedName": "Airtable.GetRecord@1.0.4",
"description": "Get a single Airtable row by its record ID.\n\nReturns every column unless fields narrows it. Long cell values are clipped the same\nway they are in a listing, and `truncated` says when that happened. A record ID that\ndoes not exist, or was deleted, comes back as a refusal that does not distinguish\nthe two.",
"parameters": [
{
Expand Down Expand Up @@ -458,7 +458,7 @@
{
"name": "ListBases",
"qualifiedName": "Airtable.ListBases",
"fullyQualifiedName": "Airtable.ListBases@1.0.2",
"fullyQualifiedName": "Airtable.ListBases@1.0.4",
"description": "List the Airtable bases this authorization can reach, with permission levels.\n\nReturns bases in Airtable's default order.",
"parameters": [
{
Expand Down Expand Up @@ -518,7 +518,7 @@
{
"name": "ListRecords",
"qualifiedName": "Airtable.ListRecords",
"fullyQualifiedName": "Airtable.ListRecords@1.0.2",
"fullyQualifiedName": "Airtable.ListRecords@1.0.4",
"description": "List rows from an Airtable table, optionally filtered, sorted and column-limited.\n\nUse this when the condition combines columns, or compares numbers or dates. To match\none column against plain text, use the record search tool instead.\n\nReturns records in the view's order, or Airtable's default order when no view is\ngiven, unless sort_field overrides it.",
"parameters": [
{
Expand Down Expand Up @@ -691,7 +691,7 @@
{
"name": "SearchRecords",
"qualifiedName": "Airtable.SearchRecords",
"fullyQualifiedName": "Airtable.SearchRecords@1.0.2",
"fullyQualifiedName": "Airtable.SearchRecords@1.0.4",
"description": "Find rows in an Airtable table whose column matches a search term.\n\nUse this to match one column against text: quotes and backslashes in the search term\nare escaped, so arbitrary text is safe to pass. Use the formula-based listing instead\nwhen the condition combines columns or compares numbers or dates.\n\nReturns records in the table's order unless sort_field is given.",
"parameters": [
{
Expand Down Expand Up @@ -890,7 +890,7 @@
{
"name": "UpdateRecords",
"qualifiedName": "Airtable.UpdateRecords",
"fullyQualifiedName": "Airtable.UpdateRecords@1.0.2",
"fullyQualifiedName": "Airtable.UpdateRecords@1.0.4",
"description": "Change columns on existing Airtable rows, up to 10 per call.\n\nOnly the columns supplied are written; every other column is left untouched.\n`count` is how many rows Airtable confirmed. When it is lower than `requested_count`,\n`unconfirmed_record_ids` names the rest; re-read those before updating them again.",
"parameters": [
{
Expand Down Expand Up @@ -1020,7 +1020,7 @@
{
"name": "WhoAmI",
"qualifiedName": "Airtable.WhoAmI",
"fullyQualifiedName": "Airtable.WhoAmI@1.0.2",
"fullyQualifiedName": "Airtable.WhoAmI@1.0.4",
"description": "Get the Airtable account this authorization belongs to, and its granted scopes.\n\nUseful for confirming whose bases are being read or changed.",
"parameters": [],
"auth": {
Expand Down Expand Up @@ -1067,6 +1067,6 @@
"customImports": [],
"subPages": [],
"curationSourceHash": "da70ed30d9201488046d1ae1b04dc45cf6378210501e24b53236a4aa02f1ef89",
"generatedAt": "2026-10-07T21:24:45.436Z",
"generatedAt": "2026-10-24T11:12:12.540Z",
"summary": "Arcade's Airtable toolkit lets LLMs read and write Airtable bases and records through OAuth-authenticated API calls. It covers the full CRUD lifecycle — discovering bases and schemas, querying and searching rows, and creating, updating, or deleting them.\n\n## Capabilities\n\n- **Discovery**: List accessible bases (with permission levels) and retrieve full base schemas — column names, types, select options, linked-record targets, and views — before writing to avoid field-name or value mismatches.\n- **Reading records**: Fetch a single row by ID or list rows with optional filtering (formula-based), sorting, column selection, and view scoping; search rows by matching one column against arbitrary text.\n- **Writing records**: Create up to 10 rows per call (repeating adds more rows rather than replacing); update specific columns on existing rows without touching others; delete rows permanently (up to 10 per call).\n- **Partial-success handling**: All write and delete tools distinguish confirmed vs. unconfirmed record IDs and surface `count` / `requested_count` / `unconfirmed_record_ids` so callers can safely retry only the unresolved subset.\n- **Account introspection**: Resolve which Airtable account and granted scopes the current authorization represents.\n\n## OAuth\n\nThis toolkit uses **OAuth 2.0** via the Airtable provider. See the [Arcade Airtable auth provider docs](https://docs.arcade.dev/en/references/auth-providers/airtable) for setup details including required scopes and how to register an OAuth app in Airtable."
}
128 changes: 64 additions & 64 deletions toolkit-docs-generator/data/toolkits/apollo.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"id": "Apollo",
"label": "Apollo",
"version": "1.0.4",
"version": "2.0.1",
"description": "Arcade tools designed for LLMs to interact with Apollo.io sales intelligence",
"metadata": {
"category": "sales",
Expand All @@ -16,9 +16,54 @@
"auth": null,
"tools": [
{
"name": "EnrichOrganization",
"qualifiedName": "Apollo.EnrichOrganization",
"fullyQualifiedName": "Apollo.EnrichOrganization@1.0.4",
"name": "GetApiUsage",
"qualifiedName": "Apollo.GetApiUsage",
"fullyQualifiedName": "Apollo.GetApiUsage@2.0.1",
"description": "Report per-endpoint rate limits and how many requests remain, so the agent\ncan pace a batch of lookups and avoid being throttled. Requires an Apollo\nmaster API key.",
"parameters": [],
"auth": null,
"secrets": [
"APOLLO_API_KEY"
],
"secretsInfo": [
{
"name": "APOLLO_API_KEY",
"type": "api_key"
}
],
"output": {
"type": "json",
"description": "Per-endpoint rate limits and remaining request counts."
},
"documentationChunks": [],
"codeExample": {
"toolName": "Apollo.GetApiUsage",
"parameters": {},
"requiresAuth": false,
"tabLabel": "Call the Tool"
},
"metadata": {
"classification": {
"serviceDomains": [
"crm"
]
},
"behavior": {
"operations": [
"read"
],
"readOnly": true,
"destructive": false,
"idempotent": true,
"openWorld": true
},
"extras": null
}
},
{
"name": "GetOrganization",
"qualifiedName": "Apollo.GetOrganization",
"fullyQualifiedName": "Apollo.GetOrganization@2.0.1",
"description": "Turn a company domain into firmographics (industry, size, revenue, funding,\nlocation) so a rep can qualify and size an account. Consumes one enrichment\ncredit on a match; when the plan is out of credits the result reports\nstatus=insufficient_credits rather than failing.",
"parameters": [
{
Expand Down Expand Up @@ -46,7 +91,7 @@
},
"documentationChunks": [],
"codeExample": {
"toolName": "Apollo.EnrichOrganization",
"toolName": "Apollo.GetOrganization",
"parameters": {
"domain": {
"value": "stripe.com",
Expand Down Expand Up @@ -76,9 +121,9 @@
}
},
{
"name": "EnrichPerson",
"qualifiedName": "Apollo.EnrichPerson",
"fullyQualifiedName": "Apollo.EnrichPerson@1.0.4",
"name": "GetPerson",
"qualifiedName": "Apollo.GetPerson",
"fullyQualifiedName": "Apollo.GetPerson@2.0.1",
"description": "Turn a known person into a verified profile with their current role and,\non request, contact details. Provide at least one identifier: an Apollo person\nID, a name (or first and last name), an email, or a LinkedIn URL; an employer\nname or domain alone is not enough to identify someone. Consumes one enrichment\ncredit on a match; when the plan is out of credits the result reports\nstatus=insufficient_credits rather than failing.",
"parameters": [
{
Expand Down Expand Up @@ -170,15 +215,15 @@
},
"documentationChunks": [],
"codeExample": {
"toolName": "Apollo.EnrichPerson",
"toolName": "Apollo.GetPerson",
"parameters": {
"person_id": {
"value": "583f6b2e7b6b8a1d4e9c0f23",
"value": "5f3e2a1b4c8d9e0f1a2b3c4d",
"type": "string",
"required": false
},
"name": {
"value": "Jane Doe",
"value": "Jane Holloway",
"type": "string",
"required": false
},
Expand All @@ -188,17 +233,17 @@
"required": false
},
"last_name": {
"value": "Doe",
"value": "Holloway",
"type": "string",
"required": false
},
"email": {
"value": "jane.doe@techcorp.com",
"value": "jane.holloway@techcorp.com",
"type": "string",
"required": false
},
"organization_name": {
"value": "TechCorp Inc.",
"value": "TechCorp Solutions",
"type": "string",
"required": false
},
Expand All @@ -208,7 +253,7 @@
"required": false
},
"linkedin_url": {
"value": "https://www.linkedin.com/in/janedoe",
"value": "https://www.linkedin.com/in/jane-holloway",
"type": "string",
"required": false
},
Expand Down Expand Up @@ -239,55 +284,10 @@
"extras": null
}
},
{
"name": "GetApiUsage",
"qualifiedName": "Apollo.GetApiUsage",
"fullyQualifiedName": "Apollo.GetApiUsage@1.0.4",
"description": "Report per-endpoint rate limits and how many requests remain, so the agent\ncan pace a batch of lookups and avoid being throttled. Requires an Apollo\nmaster API key.",
"parameters": [],
"auth": null,
"secrets": [
"APOLLO_API_KEY"
],
"secretsInfo": [
{
"name": "APOLLO_API_KEY",
"type": "api_key"
}
],
"output": {
"type": "json",
"description": "Per-endpoint rate limits and remaining request counts."
},
"documentationChunks": [],
"codeExample": {
"toolName": "Apollo.GetApiUsage",
"parameters": {},
"requiresAuth": false,
"tabLabel": "Call the Tool"
},
"metadata": {
"classification": {
"serviceDomains": [
"crm"
]
},
"behavior": {
"operations": [
"read"
],
"readOnly": true,
"destructive": false,
"idempotent": true,
"openWorld": true
},
"extras": null
}
},
{
"name": "SearchOrganizations",
"qualifiedName": "Apollo.SearchOrganizations",
"fullyQualifiedName": "Apollo.SearchOrganizations@1.0.4",
"fullyQualifiedName": "Apollo.SearchOrganizations@2.0.1",
"description": "Find companies in Apollo's database that match a firmographic profile so a\nrep can prioritize the accounts worth working. Results include firmographics\ninline unless include_firmographics is disabled. Company search consumes plan\ncredits; when the plan is out of credits the result reports\nstatus=insufficient_credits with an empty list rather than failing.",
"parameters": [
{
Expand Down Expand Up @@ -470,7 +470,7 @@
{
"name": "SearchPeople",
"qualifiedName": "Apollo.SearchPeople",
"fullyQualifiedName": "Apollo.SearchPeople@1.0.4",
"fullyQualifiedName": "Apollo.SearchPeople@2.0.1",
"description": "Find people in Apollo's database by role and the firmographics of their\nemployer. Returns lightweight records without email or phone; use person\nenrichment to reveal verified contact details.",
"parameters": [
{
Expand Down Expand Up @@ -688,6 +688,6 @@
"customImports": [],
"subPages": [],
"curationSourceHash": "da70ed30d9201488046d1ae1b04dc45cf6378210501e24b53236a4aa02f1ef89",
"generatedAt": "2026-10-21T22:03:50.237Z",
"summary": "Apollo toolkit for Arcade enables LLMs to interact with the [Apollo.io](https://apollo.io) sales intelligence platform — searching, enriching, and qualifying people and companies programmatically.\n\n## Capabilities\n\n- **Company intelligence**: Search Apollo's database by firmographic filters (industry, size, revenue, location) and enrich a domain into a full company profile including funding and headcount.\n- **People intelligence**: Search contacts by role and employer firmographics, then enrich individual profiles to surface current title and verified contact details using identifiers such as email, LinkedIn URL, or Apollo person ID.\n- **Credit-aware responses**: Enrichment and search operations consume plan credits on a match; when credits are exhausted the toolkit returns `status=insufficient_credits` rather than raising an error, letting agents handle quota gracefully.\n- **Rate-limit introspection**: Retrieve per-endpoint rate limits and remaining request counts so agents can pace batch lookups and avoid throttling.\n\n## Secrets\n\n`APOLLO_API_KEY` — An Apollo.io API key used to authenticate every request. Obtain it from your Apollo account under **Settings → Integrations → API Keys** (requires an Apollo account; key permissions and available endpoints depend on your plan tier). Note that `Apollo.GetApiUsage` specifically requires a *master* API key rather than a restricted key. See [Apollo's API key documentation](https://apolloio.github.io/apollo-api-docs/) for details on key types and plan-level access.\n\nFor how to configure secrets in Arcade, see [Tool Secrets](https://docs.arcade.dev/en/guides/create-tools/tool-basics/create-tool-secrets) or manage them directly at [https://api.arcade.dev/dashboard/auth/secrets](https://api.arcade.dev/dashboard/auth/secrets)."
"generatedAt": "2026-10-24T11:12:15.166Z",
"summary": "Apollo is a sales intelligence platform; this Arcade toolkit enables LLMs to search, enrich, and monitor usage against the Apollo.io API.\n\n## Capabilities\n\n- **Account intelligence:** Convert a company domain into firmographics (industry, size, revenue, funding, location) for account qualification and sizing.\n- **People lookup & enrichment:** Search contacts by role and employer firmographics, then enrich individual records with verified profiles and contact details using identifiers such as name, email, Apollo ID, or LinkedIn URL.\n- **Company search:** Query Apollo's database with firmographic filters to surface and prioritize target accounts; firmographics are included inline by default.\n- **Rate-limit awareness:** Retrieve per-endpoint rate limits and remaining request counts so agents can pace batch operations and avoid throttling.\n- **Credit-safe error handling:** Enrichment and search operations report `status=insufficient_credits` rather than throwing errors when the Apollo plan is out of credits.\n\n## Secrets\n\n`APOLLO_API_KEY`\nYour Apollo master API key, required by all five tools. To obtain it, log in to [Apollo.io](https://app.apollo.io/), navigate to **Settings → Integrations → API**, and copy your API key. A master key (not a limited integration key) is required to access enrichment endpoints and rate-limit reporting. Apollo API access may require a paid plan depending on the endpoints and credit volume you need; check your plan's enrichment credit allowance before running bulk operations.\n\nStore this secret in Arcade using the secrets configuration described at [https://docs.arcade.dev/en/guides/create-tools/tool-basics/create-tool-secrets](https://docs.arcade.dev/en/guides/create-tools/tool-basics/create-tool-secrets), or add it directly via the [Arcade dashboard](https://api.arcade.dev/dashboard/auth/secrets)."
}
Loading
Loading