Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time
June 5, 2023 12:34
November 11, 2023 00:56
April 5, 2017 21:02
November 13, 2023 10:39
December 6, 2023 23:10
February 13, 2021 11:42

Flask API

Browsable web APIs for Flask.

Coverage Status Scrutinizer Code Quality PyPI Version

Status: This project is in maintenance mode. The original author (Tom Christie) has shifted his focus to API Star. Passing PRs will still be considered for releases by the maintainer (Jace Browning).


Flask API is a drop-in replacement for Flask that provides an implementation of browsable APIs similar to what Django REST framework offers. It gives you properly content-negotiated responses and smart request parsing:




  • Python 3.6+
  • Flask 1.1.+

Install using pip:

$ pip install Flask-API

Import and initialize your application:

from flask_api import FlaskAPI

app = FlaskAPI(__name__)


Return any valid response object as normal, or return a list or dict.

def example():
    return {'hello': 'world'}

A renderer for the response data will be selected using content negotiation based on the client 'Accept' header. If you're making the API request from a regular client, this will default to a JSON response. If you're viewing the API in a browser, it'll default to the browsable API HTML.


Access the parsed request data using This will handle JSON or form data by default.

def example():
    return {'request data':}


The following example demonstrates a simple API for creating, listing, updating and deleting notes.

from flask import request, url_for
from flask_api import FlaskAPI, status, exceptions

app = FlaskAPI(__name__)

notes = {
    0: 'do the shopping',
    1: 'build the codez',
    2: 'paint the door',

def note_repr(key):
    return {
        'url': request.host_url.rstrip('/') + url_for('notes_detail', key=key),
        'text': notes[key]

@app.route("/", methods=['GET', 'POST'])
def notes_list():
    List or create notes.
    if request.method == 'POST':
        note = str('text', ''))
        idx = max(notes.keys()) + 1
        notes[idx] = note
        return note_repr(idx), status.HTTP_201_CREATED

    # request.method == 'GET'
    return [note_repr(idx) for idx in sorted(notes.keys())]

@app.route("/<int:key>/", methods=['GET', 'PUT', 'DELETE'])
def notes_detail(key):
    Retrieve, update or delete note instances.
    if request.method == 'PUT':
        note = str('text', ''))
        notes[key] = note
        return note_repr(key)

    elif request.method == 'DELETE':
        notes.pop(key, None)
        return '', status.HTTP_204_NO_CONTENT

    # request.method == 'GET'
    if key not in notes:
        raise exceptions.NotFound()
    return note_repr(key)

if __name__ == "__main__":

Now run the webapp:

$ python ./
 * Running on
 * Restarting with reloader

You can now open a new tab and interact with the API from the command line:

$ curl -X GET
[{"url": "", "text": "do the shopping"},
 {"url": "", "text": "build the codez"},
 {"url": "", "text": "paint the door"}]

$ curl -X GET
{"url": "", "text": "build the codez"}

$ curl -X PUT -d text="flask api is teh awesomez"
{"url": "", "text": "flask api is teh awesomez"}

You can also work on the API directly in your browser, by opening You can then navigate between notes, and make GET, PUT, POST and DELETE API requests.