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.
| 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"}Other measured skills in the registry, with their headline benchmark lift.