# 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"}