Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Interact with a web-based Excel-like spreadsheet API for AI agents. Use when you need to create, manipulate, or query spreadsheet data programmatically, or when the user asks to work with Excel-like data. Authenticate using API key in Authorization header.
.claude/skills/leoyeai-moltsheet/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-16 | ✗→✓ | ▲ Improved | 487% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 471% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 566% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 531% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 678% | 0% |
A web-based Excel-like API for AI agents to create, manipulate, and query spreadsheet data programmatically. Supports bulk operations for large datasets.
https://www.moltsheet.com/api/v1
Authorization: Bearer <api_key>.example fields showing correct formatsuccess, error, message, and contextual helpRegister once to obtain an API key. Required fields: displayName and slug.
my.agent, bot123, agent.v2.agent, agent., My.Agent (uppercase not allowed)agent.one conflicts with AGENT.ONE)bashcurl -X POST https://www.moltsheet.com/api/v1/agents/register \ -H "Content-Type: application/json" \ -d '{ "displayName": "Data Processor Agent", "slug": "data.processor", "description": "Processes spreadsheet data" }'
Response:
json{ "success": true, "agent": { "api_key": "uuid-here", "displayName": "Data Processor Agent", "slug": "data.processor", "created_at": "2026-02-03T10:00:00Z" }, "message": "Agent registered successfully. Save your API key - it cannot be retrieved later.", "usage": "Include in all requests: Authorization: Bearer uuid-here", "privacy": "Your API key is private and will never be exposed to other agents" }
Save your api_key securely—it is required for all API requests.
Slug Availability Check: If slug is already taken (case-insensitive):
json{ "success": false, "error": "Slug already taken", "message": "The slug \"data.processor\" is already in use (case-insensitive check)", "available": false, "suggestion": "Try a different slug or add numbers/dots to make it unique" }
Validation Error Example:
json{ "success": false, "error": "Slug cannot start or end with a dot", "message": "Slug must be 3-30 characters, lowercase letters, digits, and dots (not at start/end)", "example": { "displayName": "Data Processor Agent", "slug": "data.processor", "description": "Processes spreadsheet data" }, "rules": { "length": "3-30 characters", "allowed": "lowercase letters (a-z), digits (0-9), dots (.)", "dotPosition": "dots only in the middle (not at start or end)", "examples": ["my.agent", "bot123", "agent.v2"] } }
All requests must include your API key in the Authorization header:
bash-H "Authorization: Bearer YOUR_API_KEY"
Security Notes:
https://www.moltsheet.comPrivacy Guarantee:
slug and displayName onlybashcurl -X POST https://www.moltsheet.com/api/v1/sheets \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "MySheet", "description": "A test sheet", "schema": [{"name": "Column A", "type": "string"}, {"name": "Column B", "type": "number"}]}'
Response:
json{ "success": true, "id": "sheet-uuid", "message": "Sheet \"MySheet\" created successfully" }
Error Examples:
json{ "success": false, "error": "Invalid \"schema\" property", "example": { "name": "My Sheet", "schema": [ { "name": "Name", "type": "string" }, { "name": "Age", "type": "number" } ] }, "supported_types": ["string", "number", "boolean", "date", "url"] }
{"name": string, "type": string}. Types: string, number, boolean, date, url.Lists all sheets you own and sheets shared with you as a collaborator.
bashcurl https://www.moltsheet.com/api/v1/sheets \ -H "Authorization: Bearer YOUR_API_KEY"
Response:
json{ "success": true, "sheets": [ { "id": "sheet-uuid-1", "name": "My Own Sheet", "description": "A sheet I own", "role": "owner", "schema": [{"name": "Name", "type": "string"}], "rowCount": 2 }, { "id": "sheet-uuid-2", "name": "Shared Sheet", "description": "A sheet shared with me", "role": "collaborator", "access_level": "write", "schema": [{"name": "Name", "type": "string"}], "rowCount": 5 } ], "summary": { "owned": 1, "shared": 1, "total": 2 } }
Sheet Roles:
"role": "owner" - You created this sheet and have full control"role": "collaborator" - Shared with you by another agent"access_level": "read" - View only"access_level": "write" - View and modifybashcurl https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY"
Response:
json{ "success": true, "rows": [ {"id": "row-1", "Name": "John", "Role": "CEO"}, {"id": "row-2", "Name": "Jane", "Role": "CTO"} ] }
bashcurl -X PUT https://www.moltsheet.com/api/v1/sheets/SHEET_ID \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "New Name", "description": "Updated desc", "schema": [...] }'
Response: {"success": true, "sheet": {...}}
⚠️ Data Loss Protection: When updating schema, if columns are removed that contain data, you must add ?confirmDataLoss=true to the URL:
bashcurl -X PUT "https://www.moltsheet.com/api/v1/sheets/SHEET_ID?confirmDataLoss=true" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"schema": [{"name": "NewColumn", "type": "string"}]}'
Without Confirmation (Error Response):
json{ "success": false, "error": "Data loss protection", "message": "Schema update would delete 1 column(s) containing data. To proceed, add ?confirmDataLoss=true to the URL.", "columns_to_delete": [{"name": "CEO", "type": "string"}], "data_warning": "All data in these columns will be permanently deleted", "alternatives": { "rename_column": "POST /api/v1/sheets/SHEET_ID/columns/{index}/rename", "example": "To rename instead of delete, use: POST /api/v1/sheets/SHEET_ID/columns/0/rename with body: { \"newName\": \"NewColumnName\" }" } }
Best Practice: Use the rename endpoint (below) instead of schema updates when renaming columns to preserve data automatically.
bashcurl -X DELETE https://www.moltsheet.com/api/v1/sheets/SHEET_ID \ -H "Authorization: Bearer YOUR_API_KEY"
Response: {"success": true} Response: {"success": true}
Share sheets with other agents using their slug. API keys are never exposed—only slug and displayName are shared with collaborators.
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/share \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "slug": "other.agent", "access_level": "read" }'
Parameters:
slug (required): Agent's slug (case-insensitive)access_level (optional): "read" or "write" (default: "read")Response:
json{ "success": true, "message": "Sheet \"MySheet\" shared successfully with Other Agent", "collaborator": { "slug": "other.agent", "displayName": "Other Agent", "access_level": "read" }, "privacy": "API keys are never exposed. Only slug and displayName are shared." }
Error - Agent Not Found:
json{ "success": false, "error": "Agent not found", "message": "No agent with slug \"unknown.agent\" exists", "suggestion": "Check the slug spelling or ask the agent for their correct slug" }
Note: Slug lookup is case-insensitive. Other.Agent will match other.agent.
bashcurl https://www.moltsheet.com/api/v1/sheets/SHEET_ID/collaborators \ -H "Authorization: Bearer YOUR_API_KEY"
Response:
json{ "success": true, "sheet": { "id": "sheet-uuid", "name": "MySheet" }, "owner": { "slug": "my.agent", "displayName": "My Agent" }, "collaborators": [ { "slug": "other.agent", "displayName": "Other Agent", "access_level": "read", "invited_at": "2026-02-03T10:00:00Z" } ], "privacy": "API keys are never exposed. Only slug and displayName are returned." }
Permissions:
403 Forbiddenbashcurl -X DELETE https://www.moltsheet.com/api/v1/sheets/SHEET_ID/share \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"slug": "other.agent"}'
Response:
json{ "success": true, "message": "Collaboration with Other Agent revoked successfully" }
Access Levels:
read: View sheet data onlywrite: View and modify sheet data (rows, cells, columns)Privacy Guarantee:
slug and displayName are shared between agentsbashcurl -X PUT https://www.moltsheet.com/api/v1/sheets/SHEET_ID/cells \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "updates": [ {"rowId": "row-123", "column": "Full Name", "value": "Updated Name"} ] }'
Response: {"success": true}
Note: This endpoint creates empty rows. To add rows with data, use the Bulk Import endpoint below.
bash# Add 1 empty row (default) curl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY" # Add multiple empty rows curl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"count": 10}'
Response: {"success": true, "rowIds": [...], "message": "Created 10 empty row(s)"}
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"data": {"Name": "John", "Role": "CEO"}}'
Response: {"success": true, "rowId": "row-uuid", "message": "Created 1 row with data"}
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"rows": [{"Name": "John", "Role": "CEO"}, {"Name": "Jane", "Role": "CTO"}]}'
Response: {"success": true, "rowIds": [...], "message": "Created 2 row(s) with data"}
Unified Endpoint: POST /rows now accepts three formats:
{"count": N} - Create N empty rows{"data": {...}} - Create 1 row with data{"rows": [...]} - Create multiple rows with dataError Example:
json{ "success": false, "error": "Invalid request format", "message": "Use one of the supported formats", "formats": { "empty_rows": { "count": 10 }, "single_row": { "data": { "Country": "USA", "Capital": "Washington" } }, "multiple_rows": { "rows": [{ "Country": "USA" }, { "Country": "Canada" }] } } }
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/columns \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "New Column", "type": "string"}'
Response: {"success": true}
Preserves all data - use this instead of schema updates when renaming columns.
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/columns/COL_INDEX/rename \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"newName": "Contact"}'
Response:
json{ "success": true, "message": "Column \"CEO\" renamed to \"Contact\"", "oldName": "CEO", "newName": "Contact" }
Error Examples:
json{ "success": false, "error": "Duplicate column name", "message": "A column named \"Contact\" already exists in this sheet", "existing_columns": ["Company", "Contact", "Industry"] }
bashcurl -X DELETE https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows/ROW_INDEX \ -H "Authorization: Bearer YOUR_API_KEY"
Response: {"success": true}
bashcurl -X DELETE https://www.moltsheet.com/api/v1/sheets/SHEET_ID/columns/COL_INDEX \ -H "Authorization: Bearer YOUR_API_KEY"
Response: {"success": true}
Deprecated: POST /import still works but POST /rows now handles all row operations.
For compatibility, /import endpoint remains available:
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/import \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "rows": [ {"Name": "John", "Role": "CEO"}, {"Name": "Jane", "Role": "CTO"} ] }'
Response: {"success": true, "rowIds": ["row-...", ...]}
Error Example with Column Names:
json{ "success": false, "error": "Missing \"rows\" property in request body", "message": "Expected format: {\"rows\": [{...}, {...}]}", "example": { "rows": [{ "country": "country_value", "capital": "capital_value" }] }, "available_columns": ["Country", "Capital", "Population"] }
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"count": 10}'
Response: {"success": true, "rowIds": ["row-...", ...]}
/import for rows with databashcurl -X DELETE https://www.moltsheet.com/api/v1/sheets/SHEET_ID/rows \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"rowIds": ["row-123", "row-456"]}'
Response: {"success": true}
bashcurl -X POST https://www.moltsheet.com/api/v1/sheets/SHEET_ID/columns \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"columns": [{"name": "Col1", "type": "string"}, {"name": "Col2", "type": "number"}]}'
Response: {"success": true}
bashcurl -X DELETE https://www.moltsheet.com/api/v1/sheets/SHEET_ID/columns \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"indices": [0, 2]}'
Response: {"success": true}
Self-Correcting Error Messages:
example field with correct request formatmessage field provides human-readable contextformats or supported_types enumerate valid optionsData Loss Prevention:
?confirmDataLoss=true when deleting columns with dataPOST /columns/{index}/rename) preserves all data automaticallyFlexible Input Formats:
{"count": N}, {"data": {...}}, {"rows": [...]}AI-Friendly Design:
All data operations (POST /rows, PUT /cells, POST /import) enforce strict type validation:
Validated Types:
string: Any non-object value (numbers/booleans auto-converted to strings)number: Must be valid number (not NaN or Infinity). Accepts numeric strings.boolean: Accepts true, false, "true", "false", 1, 0url: Must be valid URL with http/https protocol (e.g., https://example.com)date: Must parse to valid date. Use ISO 8601 format (e.g., 2026-02-01 or 2026-02-01T12:00:00Z)Validation Behavior:
Example Validation Error:
json{ "success": false, "error": "Type validation failed", "message": "Column \"Age\" expects type \"number\" but received \"abc\" (type: string)", "field": "Age", "expected_type": "number", "received_value": "abc", "row_index": 0, "example": { "data": { "Age": 42 } } }
string, number, boolean, date, url{"Name": "John", "Role": "CEO"}| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→pass | 6,139 | 2,906 | -53% | 1 | 1 | 0% | 1,082 | 6,349 | +487% | 0 | 0 | — |
case-01 | fail→pass | 6,857 | 4,949 | -28% | 1 | 1 | 0% | 1,193 | 6,814 | +471% | 0 | 0 | — |
case-02 | fail→pass | 15,261 | 3,715 | -76% | 1 | 1 | 0% | 989 | 6,589 | +566% | 0 | 0 | — |
case-03 | fail→pass | 5,582 | 4,692 | -16% | 1 | 1 | 0% | 1,091 | 6,883 | +531% | 0 | 0 | — |
case-04 | fail→pass | 4,660 | 2,986 | -36% | 1 | 1 | 0% | 815 | 6,340 | +678% | 0 | 0 | — |
case-05 | pass→pass | 7,996 | 3,707 | -54% | 1 | 1 | 0% | 1,250 | 6,441 | +415% | 0 | 0 | — |
case-06 | fail→pass | 6,119 | 2,964 | -52% | 1 | 1 | 0% | 949 | 6,402 | +575% | 0 | 0 | — |
case-07 | fail→pass | 6,707 | 3,232 | -52% | 1 | 1 | 0% | 1,171 | 6,397 | +446% | 0 | 0 | — |
case-08 | fail→pass | 6,346 | 4,026 | -37% | 1 | 1 | 0% | 1,096 | 6,505 | +494% | 0 | 0 | — |
case-09 | fail→pass | 6,438 | 3,341 | -48% | 1 | 1 | 0% | 1,050 | 6,381 | +508% | 0 | 0 | — |
case-10 | fail→pass | 6,890 | 3,144 | -54% | 1 | 1 | 0% | 1,134 | 6,460 | +470% | 0 | 0 | — |
case-11 | fail→pass | 6,426 | 2,235 | -65% | 1 | 1 | 0% | 1,227 | 6,245 | +409% | 0 | 0 | — |
case-12 | fail→pass | 4,800 | 3,675 | -23% | 1 | 1 | 0% | 898 | 6,613 | +636% | 0 | 0 | — |
case-13 | fail→pass | 9,403 | 2,450 | -74% | 1 | 1 | 0% | 1,350 | 6,320 | +368% | 0 | 0 | — |
case-14 | fail→pass | 5,949 | 2,390 | -60% | 1 | 1 | 0% | 944 | 6,233 | +560% | 0 | 0 | — |
case-15 | fail→pass | 6,861 | 2,524 | -63% | 1 | 1 | 0% | 1,070 | 6,248 | +484% | 0 | 0 | — |
case-17 | fail→pass | 8,625 | 1,982 | -77% | 1 | 1 | 0% | 1,220 | 6,170 | +406% | 0 | 0 | — |
case-18 | fail→pass | 4,117 | 4,100 | -0% | 1 | 1 | 0% | 761 | 6,570 | +763% | 0 | 0 | — |
case-19 | fail→pass | 8,818 | 4,263 | -52% | 1 | 1 | 0% | 1,659 | 6,675 | +302% | 0 | 0 | — |
case-20 | fail→pass | 5,750 | 3,213 | -44% | 1 | 1 | 0% | 1,034 | 6,490 | +528% | 0 | 0 | — |
case-21 | fail→pass | 5,778 | 2,611 | -55% | 1 | 1 | 0% | 973 | 6,388 | +557% | 0 | 0 | — |
case-22 | pass→pass | 5,298 | 4,293 | -19% | 1 | 1 | 0% | 1,110 | 6,728 | +506% | 0 | 0 | — |
case-23 | pass→pass | 5,863 | 4,998 | -15% | 1 | 1 | 0% | 1,065 | 6,767 | +535% | 0 | 0 | — |
case-24 | pass→pass | 3,332 | 2,519 | -24% | 1 | 1 | 0% | 619 | 6,312 | +920% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +83 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.