REST API
Frappe ships with an HTTP API. There are two parts of this API.
- Remote Procedure Calls (RPC)
- REST
1. RPC
A request to an endpoint /api/method/{dotted.path.to.function}
will call
a whitelisted python function. A function can be whitelisted using the
frappe.whitelist
decorator.
For example, Add the following to sample_app/__init__.py
@frappe.whitelist(allow_guest=True)
def ping():
return 'pong'
GET http://frappe.local:8000/api/method/sample_app.ping
Response:
{
"message": "pong"
}
2. REST
All documents in Frappe are available via a RESTful API with prefix
/api/resource/
.
Login
To login, you will have to send a POST request to the login method.
POST http://frappe.local:8000/api/method/login
usr=Administrator&pwd=admin
Response:
{
"full_name": "Administrator",
"message": "Logged In"
}
Try to make an authenticated request
GET http://frappe.local:8000/api/method/frappe.auth.get_logged_user
Response:
{
"message": "Administrator"
}
Listing Documents
To list documents, the URL endpoint is /api/resource/{doctype}
and the
expected HTTP verb is GET.
Response is returned as JSON Object and the listing is an array in with the key data
.
GET http://frappe.local:8000/api/resource/Person
Response:
{
"data": [
{
"name": "000000012"
},
{
"name": "000000008"
}
]
}
Fields
By default, only name field is included in the listing, to add more fields, you can pass the fields param to GET request. The param has to be a JSON array.
GET http://frappe.local:8000/api/resource/Person/?fields=["name", "first_name"]
Response:
{
"data": [
{
"first_name": "Jane",
"name": "000000012"
},
{
"first_name": "John",
"name": "000000008"
}
]
}
Filters
You can filter the listing using sql conditions by passing them as the filters
GET param. Each condition is an array of the format, [{doctype}, {field},
{operator}, {operand}].
Eg, to filter persons with name Jane, pass a param filters=[["Person", "first_name", "=", "Jane"]]
GET http://frappe.local:8000/api/resource/Person/
Response: { "data": [ { "name": "000000012" } ] }
Pagination
All listings are returned paginated by 20 items. To change the page size, you
can pass limit_page_length
. To request succesive pages, pass limit_start
as
per your limit_page_length
.
For Example, to request second page, pass limit_start
as 20.
GET http://frappe.local:8000/api/resource/DocType
Response:
{
"data": [
{
"name": "testdoc"
},
{
"name": "Person"
},
......
{
"name": "Website Template"
}
]
}
GET http://frappe.local:8000/api/resource/DocType?limit_start=20
Response:
{
"data": [
{
"name": "Website Route"
},
{
"name": "Version"
},
{
"name": "Blog Post"
},
......
{
"name": "Custom Field"
}
]
}
CRUD
Create
You can create a document by sending a POST
request to the url, /api/resource/{doctype}
.
POST http://frappe.local:8000/api/resource/Person
Body:
data={"first_name": "Robert"}
Response:
{
"data": {
"first_name": "Robert",
"last_name": null,
"modified_by": "Administrator",
"name": "000000051",
"parent": null,
"creation": "2014-05-04 17:22:38.037685",
"modified": "2014-05-04 17:22:38.037685",
"doctype": "Person",
"idx": null,
"parenttype": null,
"owner": "Administrator",
"docstatus": 0,
"parentfield": null
}
}
Note: POST
requests are to be sent along with X-Frappe-CSRF-Token:<csrf-token>
header.
Read
You can get a document by its name using the url, /api/resource/{doctype}/{name}
For Example,
GET http://frappe.local:8000/api/resource/Person/000000012
Response:
{
"data": {
"first_name": "Jane",
"last_name": "Doe",
"modified_by": "Administrator",
"name": "000000012",
"parent": null,
"creation": "2014-04-25 17:56:51.105372",
"modified": "2014-04-25 17:56:51.105372",
"doctype": "Person",
"idx": null,
"parenttype": null,
"owner": "Administrator",
"docstatus": 0,
"parentfield": null
}
}
Update
You can create a document by sending a PUT
request to the url,
/api/resource/{doctype}
. This acts like a PATCH
HTTP request in which you do
not have to send the whole document but only the parts you want to change.
For Example,
PUT http://frappe.local:8000/api/resource/Person/000000008
Body:
data={"last_name": "Watson"}
Response:
{
"data": {
"first_name": "John ",
"last_name": "Watson",
"modified_by": "Administrator",
"name": "000000008",
"creation": "2014-04-25 17:26:22.728327",
"modified": "2014-05-04 18:21:45.385995",
"doctype": "Person",
"owner": "Administrator",
"docstatus": 0
}
}
Delete
You can delete a document by its name by sending a DELETE
request to the url,
/api/resource/{doctype}/{name}
.
For Example,
DELETE http://frappe.local:8000/api/resource/Person/000000008
Response:
{"message":"ok"}