Create custom API endpoints and whitelisted methods for Frappe applications. Use when building REST APIs or custom endpoints.
View on GitHubVenkateshvenki404224/frappe-apps-manager
frappe-apps-manager
frappe-apps-manager/skills/frappe-api-handler/SKILL.md
January 21, 2026
Select agents to install to:
npx add-skill https://github.com/Venkateshvenki404224/frappe-apps-manager/blob/main/frappe-apps-manager/skills/frappe-api-handler/SKILL.md -a claude-code --skill frappe-api-handlerInstallation paths:
.claude/skills/frappe-api-handler/# Frappe API Handler Skill
Create secure, efficient custom API endpoints for Frappe applications.
## When to Use This Skill
Claude should invoke this skill when:
- User wants to create custom API endpoints
- User needs to whitelist Python methods for API access
- User asks about REST API implementation
- User wants to integrate external systems with Frappe
- User needs help with API authentication or permissions
## Capabilities
### 1. Whitelisted Methods
Create Python methods accessible via API:
```python
import frappe
from frappe import _
@frappe.whitelist()
def get_customer_details(customer_name):
"""Get customer details with validation"""
# Permission check
if not frappe.has_permission("Customer", "read"):
frappe.throw(_("Not permitted"), frappe.PermissionError)
customer = frappe.get_doc("Customer", customer_name)
return {
"name": customer.name,
"customer_name": customer.customer_name,
"email": customer.email_id,
"phone": customer.mobile_no,
"outstanding_amount": customer.get_outstanding()
}
```
### 2. API Method Patterns
**Public Methods (No Authentication):**
```python
@frappe.whitelist(allow_guest=True)
def public_api_method():
"""Accessible without login"""
return {"message": "Public data"}
```
**Authenticated Methods:**
```python
@frappe.whitelist()
def authenticated_method():
"""Requires valid session or API key"""
user = frappe.session.user
return {"user": user}
```
**Permission-based Methods:**
```python
@frappe.whitelist()
def delete_customer(customer_name):
"""Check permissions before action"""
if not frappe.has_permission("Customer", "delete"):
frappe.throw(_("Not permitted"))
frappe.delete_doc("Customer", customer_name)
return {"message": "Customer deleted"}
```
### 3. REST API Endpoints
**GET Request Handler:**
```python
@frappe.whitelist()
def get_items(filters=None, fields=None, limit=20):
"""Get list of items wit