Skip to main content

A Python wrapper for the Unsplash API

Project description

pySplash.py

pySplash.py v1.0.0

license Maintenance GitHub issues GitHub forks GitHub stars

pySplash.py is a simple, Python API wrapper for the popular Unsplash platform. The library is written in Python, supports both sync (via requests) and async (via httpx) usage, and can be used in any Python 3.9+ project. Unsplash provides beautiful high quality free images and photos that you can download and use for any project without any attribution.

Before using the Unsplash API, you need to register as a developer and read the API Guidelines.

Note: Every application must abide by the API Guidelines. Specifically, remember to hotlink images and trigger a download when appropriate.

Table of Contents

Installation

Install the package from PyPI

pip install pysplash.py

Sample usage

# Synchronous
from pySplash import PySplashApi

unsplash = PySplashApi()

unsplash.init(bearer_token="<bearer-token>")

result = unsplash.get_photo("<photo-id>")
print(result)
# Asynchronous
import asyncio
from pySplash import PySplashApiAsync


async def main():
    unsplash = PySplashApiAsync()
    unsplash.init(bearer_token="<bearer-token>")
    result = await unsplash.get_photo("<photo-id>")
    print(result)


asyncio.run(main())

Development

pip install requests httpx pytest pytest-asyncio
pytest tests/ -v

Dependency

This library depends on requests for synchronous HTTP, httpx for asynchronous HTTP, and uses Python's built-in hashlib for SHA-256 hashing to generate required request headers for the Unsplash API.

API Documentation

Schema

Location

The API we are using is https://api.unsplash.com/. Responses are sent as JSON.

Summary objects

When retrieving a list of objects, an abbreviated or summary version of that object is returned - i.e., a subset of its attributes. To get a full detailed version of that object, fetch it individually.

Error messages

If an error occurs, whether on the server or client side, the error message(s) will be returned in an errors array. For example:

422 Unprocessable Entity
{"errors": ["Username is missing", "Password cannot be blank"]}

Authorization

Public Actions

Many actions can be performed without requiring authentication from a specific user. For example, downloading a photo does not require a user to log in. To authenticate requests in this way, pass your application's access key via the HTTP Authorization header:

Authorization: Client-ID YOUR_ACCESS_KEY

You can also pass this value using a client_id query parameter:

https://api.unsplash.com/photos/?client_id=YOUR_ACCESS_KEY

If only your access key is sent, attempting to perform non-public actions that require user authorization will result in a 401 Unauthorized response.

User Authentication

The Unsplash API uses OAuth2 to authenticate and authorize Unsplash users. Unsplash's OAuth2 paths live at https://unsplash.com/oauth/.

Before using pySplash.py:

  • Developers are required to create a developer account from Unsplash.
  • Create a new App from Your Apps page.
  • Get the Access Key, Secret key, Callback URLs, and Authorization code.
  • If you have a Bearer Token, then its super, or else you can generate it using pySplash.py.

Note: Authorization code can be obtained by clicking the Authorize link next to Callback URLs. Also Authorization code is a one-time use code, you have to generate it again, if the action fails!.

pySplash.py init()

pySplash.py instance has to be initialized with your credentials obtained from Unsplash developer account for programatic access. These credentials information are passed in to the init() function as keyword arguments. The following example shows all the available options.

from pySplash import PySplashApi

UnsplashApi = PySplashApi()

UnsplashApi.init(
    access_key="<api-key>",
    secret_key="<secret-key>",
    redirect_uri="<callback-url>",
    code="<authorization-code>",
)

If you have a bearer_token, then only bearer token has to be passed in.

UnsplashApi.init(bearer_token="<bearer-token>")

Generate Bearer Token

A method to generate a Bearer Token for write_access to private data. The init() method in this case requires access_key, secret_key, redirect_uri, and code to generate bearer token.

Note: No Parameters are required for this function.

from pySplash import PySplashApi

UnsplashApi = PySplashApi()

UnsplashApi.init(
    access_key="<api-key>",
    secret_key="<secret-key>",
    redirect_uri="<callback-url>",
    code="<authorization-code>",
)

result = UnsplashApi.generate_bearer_token()
print(result)
# Async version
result = await UnsplashApi.generate_bearer_token()

If successful, the response body will be a JSON representation of your user's access token a.k.a bearer token:

{
   "access_token": "091343ce13c8ae780065ecb3b13dc903475dd22cb78a05503c2e0c69c5e98044",
   "token_type": "bearer",
   "scope": "public read_photos write_photos",
   "created_at": 1436544465
 }

and once you have your bearer_token you can use it in your app like this:

UnsplashApi.init(bearer_token="<bearer-token>")

Users APIs

Get User's Public Profile

Retrieves public details on a given user.

GET /users/:username
Parameters
Parameter Type Description Optional Default
username str The username of the particular user no
width int Width of the profile picture in pixels yes
height int Height of the profile picture in pixels yes

Note: When optional height & width are specified the profile image will be included in the "profile_image" object as "custom".

UnsplashApi.get_public_profile("<username>", 600, 600)

Get User's Portfolio Link

Retrieves a single user's portfolio link.

GET /users/:username/portfolio
Parameters
Parameter Type Description Optional Default
username str The username of the particular user no
UnsplashApi.get_user_portfolio("<username>")

Get User's Photos

Gets a list of photos uploaded by a particular user.

GET /users/:username/photos
Parameters
Parameter Type Description Optional Default
username str The username of the particular user no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
stats bool Show the stats for each user's photo yes False
resolution str The frequency of the stats yes days
quantity int The amount of for each stat yes 30
order_by str How to sort the photos.(Valid values: latest, oldest, popular) yes latest
UnsplashApi.get_user_photos("<username>", 1, 10, False, "days", 30, "latest")

Get User Liked Photos

Gets a list of photos liked by a user.

GET /users/:username/likes
Parameters
Parameter Type Description Optional Default
username str The username of the particular user no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
order_by str How to sort the photos.(Valid values: latest, oldest, popular) yes latest
UnsplashApi.get_user_liked_photos("<username>", 1, 10, "latest")

Get User's Collections

Gets a list of collections created by the user.

GET /users/:username/collections
Parameters
Parameter Type Description Optional Default
username str The username of the particular user no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.get_user_collections("<username>", 1, 10)

Get User's Statistics

Gets a user's account statistics.

GET /users/:username/statistics
Parameters
Parameter Type Description Optional Default
username str The username of the particular user no
resolution str The frequency of the stats yes days
quantity int The amount of for each stat yes 30
UnsplashApi.get_user_statistics("<username>", "days", 30)

Photos APIs

List Photos

Gets a single page from the list of all photos.

GET /photos
Parameters
Parameter Type Description Optional Default
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
order_by str How to sort the photos.(Valid values: latest, oldest, popular) yes latest
UnsplashApi.list_photos(1, 10, "latest")

List Curated Photos

Gets a single page from the list of the curated photos.

GET /photos/curated
Parameters
Parameter Type Description Optional Default
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
order_by str How to sort the photos.(Valid values: latest, oldest, popular) yes latest
UnsplashApi.list_curated_photos(1, 10, "latest")

Get a Photo by Id

Retrieves a single photo.

GET /photos/:id
Parameters
Parameter Type Description Optional Default
id str The photo's ID no
width int Image width in pixels yes
height int Image height in pixels yes
rect str 4 comma-separated integers representing x, y, width, height of the cropped rectangle yes

Note: Supplying the optional width or height parameters will result in the custom photo URL being added to the urls object:

UnsplashApi.get_photo("<id of the photo>", 500, 500, "0, 0, width, height")

Get a Random Photo

Retrieves a single random photo, given optional filters.

GET /photos/random
Parameters

Note: All parameters are optional, and can be combined to narrow the pool of photos from which a random one will be chosen.

Parameter Type Description Optional Default
collections str The public collection ID('s) to filter selection. If multiple, comma-separated yes
featured bool Limit selection to featured photos yes False
username str Limit selection to a single user yes
query str Limit selection to photos matching a search term yes
width int The Image width in pixels yes
height int The Image height in pixels yes
orientation str Filter search results by photo orientation. (Valid values are landscape, portrait, and squarish) yes landscape
count int The number of photos to return. (max: 30) yes 1

Note: You can't use the collections and query parameters in the same request. When supplying a count parameter - and only then - the response will be an array of photos, even if the value of count is 1.

UnsplashApi.get_random_photo()

Get a Photo's Statistics

Retrieves total number of downloads, views and likes of a single photo, as well as the historical breakdown of these stats in a specific timeframe (default is 30 days).

GET /photos/:id/statistics
Parameters
Parameter Type Description Optional Default
id str The photo's ID no
resolution str The frequency of the stats yes days
quantity int The amount of for each stat yes 30

Note: Currently, the only resolution param supported is "days". The quantity param can be any number between 1 and 30.

UnsplashApi.get_photo_statistics("<photo-id>", "days", 10)

Get a Photo's Download Link

Retrieves a single photo's download link. Preferably hit this endpoint if a photo is downloaded in your application for use (example: to be displayed on a blog article, to be shared on social media, to be remixed, etc).

GET /photos/:id/download
Parameters
Parameter Type Description Optional Default
id str The photo's ID no

Note: This is different than the concept of a view, which is tracked automatically when you hotlink an image.

UnsplashApi.get_photo_link("<photo-id>")

Update a Photo

Updates a photo on behalf of the logged-in user. This requires the write_photos scope and bearer_token.

PUT /photos/:id
Parameters
Parameter Type Description Optional Default
id str The photo's ID no
location dict The location dict holding location data yes
exif dict The exif dict holding exif data yes

Note: Exchangeable image file format (officially Exif, according to JEIDA/JEITA/CIPA specifications) is a standard that specifies the formats for images, sound, and ancillary tags used by digital cameras (including smartphones), scanners and other systems handling image and sound files recorded by digital cameras. Readmore

location & exif dict keys
dict[key] Description
location[latitude] The photo location's latitude (Optional)
location[longitude] The photo location's longitude (Optional)
location[name] The photo location's name (Optional)
location[city] The photo location's city (Optional)
location[country] The photo location's country (Optional)
location[confidential] The photo location's confidentiality (Optional)
exif[make] Camera's brand (Optional)
exif[model] Camera's model (Optional)
exif[exposure_time] Camera's exposure time (Optional)
exif[aperture_value] Camera's aperture value (Optional)
exif[focal_length] Camera's focal length (Optional)
exif[iso_speed_ratings] Camera's iso (Optional)
UnsplashApi.update_photo("<photo-id>", {"country": "INDIA"}, {"make": "Redmi Note 3"})

Like a Photo

Likes a photo on behalf of the logged-in user. This requires the write_likes scope.

POST /photos/:id/like
Parameters
Parameter Type Description Optional Default
id str The photo's ID no

Note: This action is idempotent; sending the POST request to a single photo multiple times has no additional effect.

UnsplashApi.like_photo("<photo-id>")

Unlike a Photo

Removes a user's like of a photo.

DELETE /photos/:id/like
Parameters
Parameter Type Description Optional Default
id str The photo's ID no

Note: This action is idempotent; sending the DELETE request to a single photo multiple times has no additional effect.

UnsplashApi.unlike_photo("<photo-id>")

Search APIs

Search Photos

Gets a single page of photo results for a particular query.

GET /search/photos
Parameters
Parameter Type Description Optional Default
query str The search query no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
collections str Collection ID('s) to narrow search. If multiple, comma-separated. yes
orientation str Filter search results by photo orientation. (Valid values are landscape, portrait, and squarish.) yes landscape
UnsplashApi.search("cars", 1, 10, "", "landscape")

Search Collections

Gets a single page of collection results for a query.

GET /search/collections
Parameters
Parameter Type Description Optional Default
query str The search query no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.search_collections("cars", 1, 10)

Search Users

Gets a single page of user results for a query.

GET /search/users
Parameters
Parameter Type Description Optional Default
query str The search query no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.search_users("<search-keyword>", 1, 10)

Current User APIs

Get User's Profile

Gets the current User's profile. To access a user's private data, the user is required to authorize the read_user scope. Without it, this request will return a 403 Forbidden response.

GET /me

Note: No Parameters are required.

Note: Without a Bearer token (i.e. using a Client-ID token) this request will return a 401 Unauthorized response.

UnsplashApi.get_current_user_profile()

Update User's Profile

Updates the current User's profile.

PUT /me
Parameters
Parameter Type Description Optional Default
username str The username of the current user yes
first_name str The first name of the current user yes
last_name str The last name of the current user yes
email str The email id of the current user yes
url str The Portfolio/personal URL of the current user yes
location str The location of the current user yes
bio str The About/bio of the current user yes
instagram_username str The Instagram username of the current user yes

Note: This action requires the write_user scope. Without it, it will return a 403 Forbidden response.

UnsplashApi.update_current_user_profile(
    "<username>", "<first_name>", "<last_name>", "<email>", "<url>", "<location>", "<bio>", "<instagram_username>"
)

Stats APIs

Stats Totals

Gets a list of counts for all of Unsplash.

GET /stats/total
UnsplashApi.get_stats_totals()

Response

200 OK
{
  "total_stats": {
    "photos": 10000,
    "downloads": 2000,
    "views": 5000,
    "likes": 800,
    "photographers": 100,
    "pixels": 200000,
    "downloads_per_second": 10,
    "views_per_second": 20,
    "developers": 20,
    "applications": 50,
    "requests": 8000
  }
}

Stats Month

Gets the overall Unsplash stats for the past 30 days.

GET /stats/month
UnsplashApi.get_stats_month()

Response

200 OK
{
  "month_stats": {
    "downloads": 20,
    "views": 200,
    "likes": 60,
    "new_photos": 10,
    "new_photographers": 5,
    "new_pixels": 2000,
    "new_developers": 8,
    "new_applications": 5,
    "new_requests": 100
  }
}

Collections APIs

Link Relations

Collections have the following link relations:

rel Description
self API location of this collection
html HTML location of this collection
photos API location of this collection's photos
related API location of this collection's related collections (Non-curated collections only)
download Download location of this collection's zip file (Curated collections only)

List Collections

Gets a single page from the list of all collections.

GET /collections
Parameters
Parameter Type Description Optional Default
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.list_collections()

List Featured Collections

Gets a single page from the list of featured collections.

GET /collections/featured
Parameters
Parameter Type Description Optional Default
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.list_featured_collections()

List Curated Collections

Gets a single page from the list of curated collections.

GET /collections/curated
Parameters
Parameter Type Description Optional Default
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.list_curated_collections()

Get a Collection

Retrieves a single collection. To view a user's private collections, the read_collections scope is required.

GET /collections/:id
Parameters
Parameter Type Description Optional Default
id str The Collection ID no
UnsplashApi.get_collection("<collection-id>")

Get a Curated Collection

Retrieves a single curated collection. To view a user's private collections, the read_collections scope is required.

GET /collections/curated/:id
Parameters
Parameter Type Description Optional Default
id str The Collection ID no
UnsplashApi.get_curated_collection("<curated-collection-id>")

Get a Collection's Photos

Retrieves a collection's photos.

GET /collections/:id/photos
Parameters
Parameter Type Description Optional Default
id str The Collection ID no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.get_collection_photos("<collection-id>", 1, 10)

Get a Curated Collection's Photos

Retrieves a curated collection's photos.

GET /collections/curated/:id/photos
Parameters
Parameter Type Description Optional Default
id str The Collection ID no
page int Page number to retrieve yes 1
per_page int Number of items per page yes 10
UnsplashApi.get_curated_collection_photos("<curated-collection-id>", 1, 10)

List a Collection's Related Collections

Retrieves a list of collections related to this one.

GET /collections/:id/related
Parameters
Parameter Type Description Optional Default
id str The Collection ID no
UnsplashApi.list_related_collections("<collection-id>")

Create a New Collection

Creates a new collection. This requires the write_collections scope.

POST /collections
Parameters
Parameter Type Description Optional Default
title str The title of the collection no
description str The collection's description yes
private bool Whether to make this collection private yes False
UnsplashApi.create_collection("<collection-name>", "<description>", False)

Update an Existing Collection

Updates an existing collection belonging to the logged-in user. This requires the write_collections scope.

PUT /collections/:id
Parameters
Parameter Type Description Optional Default
id str The collection id no
title str The title of the collection yes
description str The collection's description yes
private bool Whether to make this collection private yes False
UnsplashApi.update_collection("<collection-id>", "<collection-name>", "<description>", False)

Delete a Collection

Deletes a collection belonging to the logged-in user. This requires the write_collections scope.

DELETE /collections/:id
Parameters
Parameter Type Description Optional Default
id str The Collection ID no
UnsplashApi.delete_collection("<collection-id>")

Add a Photo to a Collection

Adds a photo to one of the logged-in user's collections. Requires the write_collections scope.

POST /collections/:collection_id/add
Parameters
Parameter Type Description Optional Default
collection_id str The Collection ID no
photo_id str The Photo ID no

Note: If the photo is already in the collection, this action has no effect.

UnsplashApi.add_photo_to_collection("<collection-id>", "<photo-id>")

Remove a Photo from a Collection

Removes a photo from one of the logged-in user's collections. Requires the write_collections scope.

DELETE  /collections/:collection_id/remove
Parameters
Parameter Type Description Optional Default
collection_id str The Collection ID no
photo_id str The Photo ID no
UnsplashApi.remove_photo_from_collection("<collection-id>", "<photo-id>")

Tests

pySplash.py uses pytest and pytest-asyncio as the testing environment. Test files are available in the tests/ folder.

pip install pytest pytest-asyncio
pytest tests/ -v

License

The MIT License

Copyright (c) 2018- Sandeep Vattapparambil, http://www.sandeepv.in

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Acknowledgements

Thanks, and Kudos to team Unsplash for creating a wonderful platform for sharing beautiful high quality free images and photos.

Made with :heart: by Sandeep Vattapparambil.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pysplash_py-1.0.0.tar.gz (37.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pysplash_py-1.0.0-py3-none-any.whl (24.1 kB view details)

Uploaded Python 3

File details

Details for the file pysplash_py-1.0.0.tar.gz.

File metadata

  • Download URL: pysplash_py-1.0.0.tar.gz
  • Upload date:
  • Size: 37.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pysplash_py-1.0.0.tar.gz
Algorithm Hash digest
SHA256 d396456e6dec4ad89c4a722854f8129554064b3d7dcace99b24095f8d18b88a3
MD5 fac3359c6c287a9b2cdae9770a32c497
BLAKE2b-256 f4948aeb27f55837fcee5c2eefa072a965297a410a4daa20044431fa74c80df1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pysplash_py-1.0.0.tar.gz:

Publisher: cd.yml on Sandeepv68/pySplash.py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pysplash_py-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: pysplash_py-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 24.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pysplash_py-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5d1ba26ea773da1a90ec8dfea1e544ca87372bfa6adf27844eafe3e13ce5add8
MD5 ccf0ad2f9675790ec6a29e61622349a5
BLAKE2b-256 d37d8942d65217d50e3fc28ea2689f386d21c693cbc30cc8889c27fad8cfc9a6

See more details on using hashes here.

Provenance

The following attestation bundles were made for pysplash_py-1.0.0-py3-none-any.whl:

Publisher: cd.yml on Sandeepv68/pySplash.py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page