Unsplash Collections API

Photo collection management

OpenAPI Specification

unsplash-collections-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Unsplash Collections 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: Collections
  description: Photo collection management
paths:
  /collections:
    get:
      operationId: listCollections
      summary: List Collections
      description: Get a single page of all featured collections.
      tags:
      - Collections
      parameters:
      - name: page
        in: query
        schema:
          type: integer
          default: 1
        description: Page number
      - name: per_page
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 30
          default: 10
        description: Results per page
      responses:
        '200':
          description: A list of collections
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Collection'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createCollection
      summary: Create a Collection
      description: Create a new collection. Requires write_collections scope.
      tags:
      - Collections
      security:
      - OAuth2:
        - write_collections
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - title
              properties:
                title:
                  type: string
                  description: Collection title
                description:
                  type: string
                  description: Collection description
                private:
                  type: boolean
                  description: Whether the collection is private
                  default: false
      responses:
        '201':
          description: Created collection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Collection'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /collections/{id}:
    get:
      operationId: getCollection
      summary: Get a Collection
      description: Retrieve a single collection by ID.
      tags:
      - Collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      responses:
        '200':
          description: A collection object
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Collection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateCollection
      summary: Update a Collection
      description: Update an existing collection. Requires write_collections scope.
      tags:
      - Collections
      security:
      - OAuth2:
        - write_collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                description:
                  type: string
                private:
                  type: boolean
      responses:
        '200':
          description: Updated collection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Collection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteCollection
      summary: Delete a Collection
      description: Delete a collection. Requires write_collections scope.
      tags:
      - Collections
      security:
      - OAuth2:
        - write_collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      responses:
        '204':
          description: Collection deleted successfully
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /collections/{id}/photos:
    get:
      operationId: getCollectionPhotos
      summary: Get Collection Photos
      description: Retrieve photos in a collection.
      tags:
      - Collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      - name: page
        in: query
        schema:
          type: integer
          default: 1
        description: Page number
      - name: per_page
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 30
          default: 10
        description: Results per page
      - name: orientation
        in: query
        schema:
          type: string
          enum:
          - landscape
          - portrait
          - squarish
        description: Filter by orientation
      responses:
        '200':
          description: Photos in the collection
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Photo'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /collections/{id}/add:
    post:
      operationId: addPhotoToCollection
      summary: Add a Photo to a Collection
      description: Add a photo to a collection. Requires write_collections scope.
      tags:
      - Collections
      security:
      - OAuth2:
        - write_collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - photo_id
              properties:
                photo_id:
                  type: string
                  description: The ID of the photo to add
      responses:
        '201':
          description: Photo added to collection
          content:
            application/json:
              schema:
                type: object
                properties:
                  photo:
                    $ref: '#/components/schemas/Photo'
                  collection:
                    $ref: '#/components/schemas/Collection'
                  user:
                    $ref: '#/components/schemas/User'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /collections/{id}/remove:
    delete:
      operationId: removePhotoFromCollection
      summary: Remove a Photo from a Collection
      description: Remove a photo from a collection. Requires write_collections scope.
      tags:
      - Collections
      security:
      - OAuth2:
        - write_collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      - name: photo_id
        in: query
        required: true
        schema:
          type: string
        description: The ID of the photo to remove
      responses:
        '200':
          description: Photo removed from collection
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /collections/{id}/related:
    get:
      operationId: getRelatedCollections
      summary: Get Related Collections
      description: Retrieve a list of collections related to the given one.
      tags:
      - Collections
      parameters:
      - $ref: '#/components/parameters/CollectionId'
      responses:
        '200':
          description: Related collections
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Collection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    User:
      allOf:
      - $ref: '#/components/schemas/UserSummary'
      - type: object
        description: Full user profile
        properties:
          email:
            type: string
            format: email
          instagram_username:
            type:
            - string
            - 'null'
          twitter_username:
            type:
            - string
            - 'null'
          downloads:
            type: integer
          followers_count:
            type: integer
          following_count:
            type: integer
          allow_messages:
            type: boolean
          numeric_id:
            type: integer
          followed_by_user:
            type: boolean
          photos:
            type: array
            items:
              $ref: '#/components/schemas/Photo'
    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'
    Error:
      type: object
      properties:
        errors:
          type: array
          items:
            type: string
          description: Array of human-readable error messages
    Collection:
      type: object
      description: An Unsplash photo collection
      properties:
        id:
          type: string
          description: Collection identifier
        title:
          type: string
          description: Collection title
        description:
          type:
          - string
          - 'null'
          description: Collection description
        published_at:
          type: string
          format: date-time
        last_collected_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
        featured:
          type: boolean
          description: Whether the collection is featured
        total_photos:
          type: integer
          description: Total number of photos in the collection
        private:
          type: boolean
          description: Whether the collection is private
        share_key:
          type:
          - string
          - 'null'
          description: Share key for private collections
        cover_photo:
          oneOf:
          - $ref: '#/components/schemas/Photo'
          - type: 'null'
          description: Cover photo for the collection
        user:
          $ref: '#/components/schemas/UserSummary'
        links:
          type: object
          properties:
            self:
              type: string
              format: uri
            html:
              type: string
              format: uri
            photos:
              type: string
              format: uri
            related:
              type: string
              format: uri
    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
  parameters:
    CollectionId:
      name: id
      in: path
      required: true
      schema:
        type: string
      description: Collection ID
  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'
  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