# REST API
Frappe ships with an HTTP API. There are two parts of this API.
1. Remote Procedure Calls (RPC)
2. 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
}
}
#### 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"}