Unsplash Photos API

Photo browsing and management operations

OpenAPI Specification

unsplash-photos-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Unsplash Collections Photos API
  description: 'The Unsplash API provides access to the world''s largest open collection of high-quality, freely usable photos. Build photo-powered applications with search, random photos, user profiles, collections, topics, and statistics. Authentication uses Client-ID for public access or OAuth 2.0 Bearer tokens for user-authenticated operations. Rate limits: 50 req/hr (demo), 1000 req/hr (production). Downloads must be tracked via the /photos/:id/download endpoint per Unsplash API guidelines.'
  version: 1.0.0
  contact:
    name: Unsplash Developers
    url: https://unsplash.com/developers
  termsOfService: https://unsplash.com/api-terms
servers:
- url: https://api.unsplash.com
  description: Unsplash API
security:
- ClientID: []
tags:
- name: Photos
  description: Photo browsing and management operations
paths:
  /photos:
    get:
      operationId: listPhotos
      summary: List Editorial Photos
      description: Get a single page of the editorial photo feed. Requires public authentication (Client-ID).
      tags:
      - Photos
      parameters:
      - name: page
        in: query
        schema:
          type: integer
          minimum: 1
          default: 1
        description: Page number to retrieve
      - name: per_page
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 30
          default: 10
        description: Number of items per page
      - name: order_by
        in: query
        schema:
          type: string
          enum:
          - latest
          - oldest
          - popular
          default: latest
        description: Order results by latest, oldest, or popular
      responses:
        '200':
          description: A list of photos
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Photo'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /photos/{id}:
    get:
      operationId: getPhoto
      summary: Get a Photo
      description: Retrieve a single photo by ID.
      tags:
      - Photos
      parameters:
      - $ref: '#/components/parameters/PhotoId'
      responses:
        '200':
          description: A photo object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Photo'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updatePhoto
      summary: Update a Photo
      description: Update a photo's metadata. Requires write_photos scope.
      tags:
      - Photos
      security:
      - OAuth2:
        - write_photos
      parameters:
      - $ref: '#/components/parameters/PhotoId'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                description:
                  type: string
                  description: New description for the photo
                show_on_profile:
                  type: boolean
                  description: Show or hide the photo on the user's profile
                tags:
                  type: array
                  items:
                    type: string
                  description: Tags to apply to the photo
                location:
                  type: object
                  properties:
                    latitude:
                      type: number
                      format: float
                    longitude:
                      type: number
                      format: float
                    name:
                      type: string
                    city:
                      type: string
                    country:
                      type: string
      responses:
        '200':
          description: Updated photo object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Photo'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /photos/random:
    get:
      operationId: getRandomPhoto
      summary: Get a Random Photo
      description: Retrieve one or more random photos. Optionally filter by orientation, color, topic, collection, featured status, username, or search query.
      tags:
      - Photos
      parameters:
      - name: collections
        in: query
        schema:
          type: string
        description: Comma-separated collection IDs to filter by
      - name: topics
        in: query
        schema:
          type: string
        description: Comma-separated topic IDs or slugs to filter by
      - name: username
        in: query
        schema:
          type: string
        description: Limit to photos by a specific user
      - name: query
        in: query
        schema:
          type: string
        description: Search query to filter random photos
      - name: orientation
        in: query
        schema:
          type: string
          enum:
          - landscape
          - portrait
          - squarish
        description: Filter by photo orientation
      - name: content_filter
        in: query
        schema:
          type: string
          enum:
          - low
          - high
          default: low
        description: Content safety filter level
      - name: count
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 30
          default: 1
        description: Number of random photos (returns array if count > 1)
      responses:
        '200':
          description: A random photo or array of photos
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/Photo'
                - type: array
                  items:
                    $ref: '#/components/schemas/Photo'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /photos/{id}/statistics:
    get:
      operationId: getPhotoStatistics
      summary: Get Photo Statistics
      description: Retrieve statistics for a photo (downloads, views, likes) over time.
      tags:
      - Photos
      parameters:
      - $ref: '#/components/parameters/PhotoId'
      - name: resolution
        in: query
        schema:
          type: string
          enum:
          - days
          default: days
        description: Time resolution for statistics
      - name: quantity
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 30
          default: 30
        description: Number of data points to return
      responses:
        '200':
          description: Photo statistics
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhotoStatistics'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /photos/{id}/download:
    get:
      operationId: trackPhotoDownload
      summary: Track a Photo Download
      description: Track a photo download event. Must be called when a user downloads a photo to comply with Unsplash API guidelines. Returns the photo's download URL.
      tags:
      - Photos
      parameters:
      - $ref: '#/components/parameters/PhotoId'
      responses:
        '200':
          description: Download tracking response with download URL
          content:
            application/json:
              schema:
                type: object
                properties:
                  url:
                    type: string
                    format: uri
                    description: The URL to download the photo
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    PhotoStatistics:
      type: object
      properties:
        id:
          type: string
        downloads:
          type: object
          properties:
            total:
              type: integer
            historical:
              $ref: '#/components/schemas/StatHistorical'
        views:
          type: object
          properties:
            total:
              type: integer
            historical:
              $ref: '#/components/schemas/StatHistorical'
        likes:
          type: object
          properties:
            total:
              type: integer
            historical:
              $ref: '#/components/schemas/StatHistorical'
    Photo:
      type: object
      description: An Unsplash photo object
      properties:
        id:
          type: string
          description: Unique photo identifier
          example: Dwu85P9SOIk
        created_at:
          type: string
          format: date-time
          description: When the photo was uploaded
        updated_at:
          type: string
          format: date-time
          description: When the photo was last updated
        promoted_at:
          type:
          - string
          - 'null'
          format: date-time
          description: When the photo was promoted to editorial feed
        width:
          type: integer
          description: Photo width in pixels
          example: 5616
        height:
          type: integer
          description: Photo height in pixels
          example: 3744
        color:
          type: string
          description: Dominant color hex code
          example: '#6E633A'
        blur_hash:
          type: string
          description: BlurHash for placeholder preview
          example: L~I64nofRjof%MQZWBS$Mxnhx]t6
        description:
          type:
          - string
          - 'null'
          description: Photographer-provided description
        alt_description:
          type:
          - string
          - 'null'
          description: Auto-generated alt text for accessibility
        likes:
          type: integer
          description: Number of likes
        downloads:
          type: integer
          description: Total download count
        views:
          type: integer
          description: Total view count
        liked_by_user:
          type: boolean
          description: Whether the current authenticated user liked this photo
        urls:
          type: object
          description: Image URLs at different sizes
          properties:
            raw:
              type: string
              format: uri
              description: Original image URL with no transformations
            full:
              type: string
              format: uri
              description: Full-quality image (large width, no compression)
            regular:
              type: string
              format: uri
              description: 1080px wide image
            small:
              type: string
              format: uri
              description: 400px wide image
            thumb:
              type: string
              format: uri
              description: 200px wide thumbnail
            small_s3:
              type: string
              format: uri
              description: Small S3-hosted image
        links:
          type: object
          description: API and site links for the photo
          properties:
            self:
              type: string
              format: uri
            html:
              type: string
              format: uri
            download:
              type: string
              format: uri
            download_location:
              type: string
              format: uri
        user:
          $ref: '#/components/schemas/UserSummary'
        location:
          type: object
          description: Location where the photo was taken
          properties:
            name:
              type:
              - string
              - 'null'
            city:
              type:
              - string
              - 'null'
            country:
              type:
              - string
              - 'null'
            position:
              type: object
              properties:
                latitude:
                  type:
                  - number
                  - 'null'
                longitude:
                  type:
                  - number
                  - 'null'
        tags:
          type: array
          items:
            type: object
            properties:
              type:
                type: string
              title:
                type: string
        exif:
          type: object
          description: Camera EXIF metadata
          properties:
            make:
              type:
              - string
              - 'null'
            model:
              type:
              - string
              - 'null'
            name:
              type:
              - string
              - 'null'
            exposure_time:
              type:
              - string
              - 'null'
            aperture:
              type:
              - string
              - 'null'
            focal_length:
              type:
              - string
              - 'null'
            iso:
              type:
              - integer
              - 'null'
    StatHistorical:
      type: object
      properties:
        change:
          type: integer
          description: Change in the period
        average:
          type: integer
          description: Average over the period
        resolution:
          type: string
          description: Time resolution (days)
        quantity:
          type: integer
          description: Number of data points
        values:
          type: array
          items:
            type: object
            properties:
              date:
                type: string
                format: date
              value:
                type: integer
    Error:
      type: object
      properties:
        errors:
          type: array
          items:
            type: string
          description: Array of human-readable error messages
    UserSummary:
      type: object
      description: Abbreviated user object for embedding in photo/collection responses
      properties:
        id:
          type: string
        username:
          type: string
        name:
          type: string
        portfolio_url:
          type:
          - string
          - 'null'
          format: uri
        bio:
          type:
          - string
          - 'null'
        location:
          type:
          - string
          - 'null'
        total_likes:
          type: integer
        total_photos:
          type: integer
        total_collections:
          type: integer
        profile_image:
          type: object
          properties:
            small:
              type: string
              format: uri
            medium:
              type: string
              format: uri
            large:
              type: string
              format: uri
        links:
          type: object
          properties:
            self:
              type: string
              format: uri
            html:
              type: string
              format: uri
            photos:
              type: string
              format: uri
            likes:
              type: string
              format: uri
  responses:
    Unauthorized:
      description: Missing or invalid authentication
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  parameters:
    PhotoId:
      name: id
      in: path
      required: true
      schema:
        type: string
      description: Photo ID
  securitySchemes:
    ClientID:
      type: apiKey
      in: header
      name: Authorization
      description: 'Use `Authorization: Client-ID {YOUR_ACCESS_KEY}` for public API access. Alternatively pass as query param: `?client_id={YOUR_ACCESS_KEY}`'
    OAuth2:
      type: oauth2
      flows:
        authorizationCode:
          authorizationUrl: https://unsplash.com/oauth/authorize
          tokenUrl: https://unsplash.com/oauth/token
          scopes:
            public: Read public data (default)
            read_user: Read user profile data
            write_user: Write user profile data
            read_photos: Read photo data
            write_photos: Write photo data (update metadata)
            write_likes: Like/unlike photos
            write_collections: Create, update, delete collections
            read_collections: Read collection data