Skip to main content

Django REST Framework API Key

API key permissions for the Django REST Framework.

python versions django versions drf versions

Introduction

Django REST Framework API Key is a library for allowing server-side clients to safely use your API. These clients are typically third-party backends and services (i.e. machines) which do not have a user account but still need to interact with your API in a secure way.

Features

  • ✌️ Simple to use: create, view and revoke API keys via the admin site, or use built-in helpers to create API keys programmatically.
  • 🔒 As secure as possible: API keys are treated with the same level of care as user passwords. They are only visible at creation and hashed before storing in the database.
  • 🎨 Customizable: satisfy specific business requirements by building your own customized API key models, permission classes and admin panels.

Should I use API keys?

There are important security aspects you need to consider before switching to an API key access control scheme. We've listed some of these in Security caveats, including serving your API over HTTPS.

Besides, see Why and when to use API keys for hints on whether API keys can fit your use case.

API keys are ideal in the following situations:

  • Blocking anonymous traffic.
  • Implementing API key-based throttling. (Note that Django REST Framework already has may built-in utilities for this use case.)
  • Identifying usage patterns by logging request information along with the API key.

They can also present enough security for authorizing internal services, such as your API server and an internal frontend application.

Please note that this package is NOT meant for authentication. You should NOT use this package to identify individual users, either directly or indirectly.

If you need server-to-server authentication, you may want to consider OAuth instead. Libraries such as django-oauth-toolkit can help.

Quickstart

Install with pip:

pip install "djangorestframework-api-key==3.*"

Note: It is highly recommended to pin your dependency to the latest major version (as depicted above), as breaking changes may and will happen between major releases.

Add the app to your INSTALLED_APPS:

# settings.py

INSTALLED_APPS = [
  # ...
  "rest_framework",
  "rest_framework_api_key",
]

Run the included migrations:

python manage.py migrate

To learn how to configure permissions and manage API keys, head to the Documentation.

Changelog

See CHANGELOG.md.

Contributing

See CONTRIBUTING.md.

License

MIT

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog. This project adheres to Semantic Versioning.

[fork] exc_djangorestframework_api_key 1.0.1 - 2026-10-25

Fixed

  • Add the missing migration for the APIKey.id and APIKey.hashed_key column widths. models.py has declared max_length=150 on both since this fork squashed its migration history into a single 0001_initial, but that squashed migration still created them as varchar(100). The model and the schema therefore disagreed, and because KeyGenerator.hash() returns a 136-character value (Django's default hasher via make_password), id (145 characters) and hashed_key (136) both overflowed the real column. Creating any API key against a database built from 0001 alone failed with value too long for type character varying(100).

    0002_alter_apikey_hashed_key_alter_apikey_id is generated by makemigrations and brings the schema up to the model. makemigrations --check is clean afterwards. No model, runtime or API change; databases already created from this fork's source are unaffected apart from the two columns widening.

3.1.0 - 2025-04-04

Added

  • Add official support for Python 3.12 and 3.13, and Django 5.0 up to 5.2, accomodating changes to USE_TZ. (Pull #266)

3.0.0 - 2023-09-30

Changed

  • Use faster SHA512-based key hasher instead of password hashers. Reduces server load by making API key validation orders of magnitude faster (10x to 30x according to estimations, network latency aside). Hashed key will be transparently upgraded the first time .is_valid() is called. (Pull #244, Pull #251)

Removed

  • Dropped support for Python 3.7, which has reached EOL. (Pull #247)
  • Drop redundant .has_object_permission() implementation on BaseHasAPIKey when using DRF 3.14.0 or above. (Pull #240)

Added

  • Add official support for Python 3.11. (Pull #247)

2.3.0 - 2023-01-19

Removed

  • Drop support for Python 3.6, which has reached EOL. (Pull #210)

Fixed

  • Fix migration 0004 when run against a non default database. (Pull #215)

2.2.0 - 2022-03-11

Added

  • Added support for Django config detection for different versions (PR #187)

Changed

  • Add official support for Django 3.2 and Python 3.9 and 3.10 (PR #189)
  • Bumped hashed_key field's max_length from 100 to 150 to address length issue with argon2-cffi (PR #193)

2.1.0 - 2021-09-24

Added

  • Add support for custom API keyword. (Pull #175)

2.0.0 - 2020-04-07

NOTE: this release drops compatibility with certain Python and Django versions, but contains no other breaking changes. See Upgrade to 2.0 for detailed migration steps.

Removed

  • Dropped support for Django 2.0 and Django 2.1. (Pull #126)
  • Dropped support for Python 3.5. (Pull #84)

Added

  • Add support for Django 3.0. (Pull #82)
  • Add support for Python 3.8. (Pull #81)
  • Add BaseAPIKeyManager.get_from_key() to allow retrieving API keys from views. (Pull #93)
  • Add type annotations, and partial support for django-stubs and djangorestframework-stubs. (Pull #88, Pull #122)

1.4.1 - 2019-08-24

Added

  • Now ships with type annotations (PEP 561). (Pull #73)

1.4.0 - 2019-07-16

NOTE: this release contains migrations. See Upgrade to v1.4 for detailed instructions.

Added

  • The prefix and hashed_key are now stored in dedicated fields on the APIKey model. (Pull #62)

1.3.0 - 2019-06-28

NOTE: this release contains migrations. In your Django project, run them using:

python manage.py migrate rest_framework_api_key

Added

  • Add abstract API key model (AbstractAPIKey) and base manager (BaseAPIKeyManager). (Pull #36)
  • Add base permissions (BaseHasAPIKey). (Pull #46)

Changed

  • The id field of APIKey is now non-editable.
  • APIKeyModelAdmin does not define fieldsets anymore. This allows subclasses to benefit from Django's automatic fieldsets. (Pull #52)

Fixed

  • Explicitly use utf-8 encoding in setup.py, which could previously lead to issues when installing on certain systems. (Pull #58)

1.2.1 - 2019-06-03

Fixed

  • Fixed a critical bug in APIKeyModelAdmin that prevented rest_framework_api_key from passing Django system checks. (Pull #39)

1.2.0 - 2019-05-29

NOTE: this release contains migrations. In your Django project, run them using:

python manage.py migrate rest_framework_api_key

Added

  • API keys can now have an optional expiry_date. (Pull #33) HasAPIKey denies access if the API key has expired, i.e. if expiry_date, if set, is in the past.
  • It is now possible to search by prefix in the API key admin panel.
  • The prefix is now displayed in the edit view of the API key admin panel.

1.1.0 - 2019-05-14

Added

  • Improve documentation on which password hasher is used.
  • Add tests against the Argon2, BcryptSHA256 and PBKDF2SHA1 hashers. (Pull #32)

Fixed

  • Fix support for password hashers that generate hashes that contain dots. (Pull #31)

1.0.0 - 2019-04-24

This release is incompatible with 0.x. See Upgrade to 1.0 for migration steps.

Removed

  • Remove HasAPIKeyOrIsAuthenticated permission class. You should use bitwise composition now, e.g. HasAPIKey | IsAuthenticated.
  • Drop the DRF_API_KEY_* settings. (Pull #19)

Changed

  • Switch to a new API key generation and validation scheme. Clients must now authorize using a single API key header (Pull #19). The header is Authorization by default. It can be customized using the API_KEY_CUSTOM_HEADER setting (Pull #26). Use the name field to identify clients.

Added

  • Add support for Django 2.2. (Pull #27)
  • Add programmatic API key creation using APIKey.objects.create_key(). (Pull #19)

Fixed

  • Improved API key storage using Django's password hashing helpers. (Uses the default Django password hasher.) (Pull #19)

0.4.0 - 2019-04-21

Removed

  • Drop support for Python 3.4. Only 3.5, 3.6 and 3.7 are supported now.
  • Drop support for Django < 2.0. Only 2.0 and 2.1 are supported now.

Fixed

  • HasAPIKey now implements .has_object_permissions(), which allows to compose it with other permission classes and perform object-level permission checks. (Pull #25)

0.3.1 - 2018-11-17

Initial changelog entry.

Added

  • APIKey model.
  • HasAPIKey and HasAPIKeyOrIsAuthenticated permission classes.
  • Generate, view and revoke API keys from the Django admin.
  • Authenticate requests using the Api-Token and Api-Secret-Key headers. Customizable via the DRF_API_KEY_TOKEN_HEADER and DRF_API_KEY_SECRET_KEY_HEADER settings.

Metadata

Release files for exc-djangorestframework-api-key 1.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for exc-djangorestframework-api-key 1.0.1
File Size Uploaded Provenance Actions
exc_djangorestframework_api_key-1.0.1.tar.gz 38.6 kB Without provenance Details for exc_djangorestframework_api_key-1.0.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for exc-djangorestframework-api-key 1.0.1
File Interpreter ABI Platform Actions
exc_djangorestframework_api_key-1.0.1-py3-none-any.whl Python 3 none any Details for exc_djangorestframework_api_key-1.0.1-py3-none-any.whl

Total release size: 52.9 kB

Release files / exc_djangorestframework_api_key-1.0.1.tar.gz

Download URL exc_djangorestframework_api_key-1.0.1.tar.gz
Size 38.6 kB
Tags Source
SHA-256 checksum
How to use checksums
e1a06fbe6083444a2833c5aa783d998b2c5b6af571e31292dfa5479847486100
BLAKE2b-256 checksum
How to use checksums
ea45c69cc2f3dfd0cd3d5891a2ec5832f6d585b7dee1c4389b0d182eb63b0209
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release files / exc_djangorestframework_api_key-1.0.1-py3-none-any.whl

Download URL exc_djangorestframework_api_key-1.0.1-py3-none-any.whl
Size 14.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f1c0b9ba4ebff9daf09a0508229fca4f0cc5e59a42bc5d08cda3b8711d00b0ab
BLAKE2b-256 checksum
How to use checksums
1f2ae06e7943c591d0302b8f739ecc6267c76cd27840fc4142731ded65c78753
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Security for exc-djangorestframework-api-key 1.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.0.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page