Hydrostor Media API

Public, unauthenticated read access to the media library behind hydrostor.ca — project renders, facility and geology photography, technology diagrams and press assets, each with its generated size variants and source URL. Verified live at 736 attachments on 2026-08-22. This is the machine-readable counterpart to the human media kit.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/hydrostor-media-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

hydrostor-media-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Hydrostor Media API
  version: wp/v2
  description: Public, unauthenticated read access to the media library behind hydrostor.ca — project renders, facility
    and geology photography, technology diagrams and press assets, each with its generated size variants and source
    URL. Verified live at 736 attachments on 2026-08-22. This is the machine-readable counterpart to the human media
    kit at https://hydrostor.ca/media-kit/.
  contact:
    name: Hydrostor
    url: https://hydrostor.ca/contact/
  x-derived-from: https://hydrostor.ca/wp-json/ route index + per-route HTTP OPTIONS schema documents
  x-derived-on: '2026-08-22'
  x-api-evangelist-note: Third-party profile by API Evangelist. Hydrostor publishes no developer program; this document
    describes the anonymously readable WordPress REST content API served from hydrostor.ca, which the site exposes
    as a self-describing route index. Every path, parameter and schema here was read from the server's own route
    index and HTTP OPTIONS documents on 2026-08-22 — nothing is invented.
servers:
- url: https://hydrostor.ca/wp-json
  description: Hydrostor WordPress REST API
tags:
- name: Media
  description: Media library attachments and their size variants.
paths:
  /wp/v2/media:
    get:
      operationId: listMedia
      summary: List media attachments
      description: Retrieve a paginated collection of media library attachments — project renders and site photography,
        facility and geology imagery, diagrams and press assets — each with its generated size variants. Verified
        live at 736 attachments on 2026-08-22.
      tags:
      - Media
      parameters:
      - name: after
        in: query
        description: Limit response to posts published after a given ISO8601 compliant date.
        schema:
          type: string
          format: date-time
      - name: author
        in: query
        description: Limit result set to posts assigned to specific authors.
        schema:
          type: array
          items:
            type: integer
          default: []
      - name: author_exclude
        in: query
        description: Ensure result set excludes posts assigned to specific authors.
        schema:
          type: array
          items:
            type: integer
          default: []
      - name: before
        in: query
        description: Limit response to posts published before a given ISO8601 compliant date.
        schema:
          type: string
          format: date-time
      - name: context
        in: query
        description: Scope under which the request is made; determines fields present in response.
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
      - name: exclude
        in: query
        description: Ensure result set excludes specific IDs.
        schema:
          type: array
          items:
            type: integer
          default: []
      - name: include
        in: query
        description: Limit result set to specific IDs.
        schema:
          type: array
          items:
            type: integer
          default: []
      - name: media_type
        in: query
        description: Limit result set to attachments of a particular media type or media types.
        schema:
          type: array
          items:
            type: string
            enum:
            - image
            - video
            - text
            - application
            - audio
            - font
      - name: mime_type
        in: query
        description: Limit result set to attachments of a particular MIME type or MIME types.
        schema:
          type: array
          items:
            type: string
      - name: modified_after
        in: query
        description: Limit response to posts modified after a given ISO8601 compliant date.
        schema:
          type: string
          format: date-time
      - name: modified_before
        in: query
        description: Limit response to posts modified before a given ISO8601 compliant date.
        schema:
          type: string
          format: date-time
      - name: offset
        in: query
        description: Offset the result set by a specific number of items.
        schema:
          type: integer
      - name: order
        in: query
        description: Order sort attribute ascending or descending.
        schema:
          type: string
          enum:
          - asc
          - desc
          default: desc
      - name: orderby
        in: query
        description: Sort collection by post attribute.
        schema:
          type: string
          enum:
          - author
          - date
          - id
          - include
          - modified
          - parent
          - relevance
          - slug
          - include_slugs
          - title
          default: date
      - name: page
        in: query
        description: Current page of the collection.
        schema:
          type: integer
          default: 1
          minimum: 1
      - name: parent
        in: query
        description: Limit result set to items with particular parent IDs.
        schema:
          type: array
          items:
            type: integer
          default: []
      - name: parent_exclude
        in: query
        description: Limit result set to all items except those of a particular parent ID.
        schema:
          type: array
          items:
            type: integer
          default: []
      - name: per_page
        in: query
        description: Maximum number of items to be returned in result set.
        schema:
          type: integer
          default: 10
          minimum: 1
          maximum: 100
      - name: search
        in: query
        description: Limit results to those matching a string.
        schema:
          type: string
      - name: search_columns
        in: query
        description: Array of column names to be searched.
        schema:
          type: array
          items:
            type: string
            enum:
            - post_title
            - post_content
            - post_excerpt
          default: []
      - name: search_semantics
        in: query
        description: How to interpret the search input.
        schema:
          type: string
          enum:
          - exact
      - name: slug
        in: query
        description: Limit result set to posts with one or more specific slugs.
        schema:
          type: array
          items:
            type: string
      - name: status
        in: query
        description: Limit result set to posts assigned one or more statuses.
        schema:
          type: array
          items:
            type: string
            enum:
            - inherit
            - private
            - trash
          default: inherit
      responses:
        '200':
          description: A page of media attachments.
          content:
            application/json:
              schema:
                type: array
                items: &id001
                  $ref: '#/components/schemas/MediaItem'
          headers:
            X-WP-Total:
              description: Total number of items in the collection.
              schema:
                type: integer
            X-WP-TotalPages:
              description: Total number of pages available at the requested page size.
              schema:
                type: integer
            Link:
              description: RFC 8288 pagination links (`rel="next"` / `rel="prev"`).
              schema:
                type: string
        '400':
          description: Invalid request parameter (`rest_invalid_param`).
          content:
            application/json:
              schema: &id002
                $ref: '#/components/schemas/Error'
  /wp/v2/media/{id}:
    get:
      operationId: getMediaItem
      summary: Get one media attachment
      description: Retrieve a single media attachment by its numeric identifier.
      tags:
      - Media
      parameters:
      - name: id
        in: path
        required: true
        description: Unique identifier for the attachment.
        schema:
          type: integer
      - name: context
        in: query
        description: Scope under which the request is made; determines fields present in response.
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
      responses:
        '200':
          description: The media attachment.
          content:
            application/json:
              schema: *id001
        '400':
          description: Invalid request parameter (`rest_invalid_param`).
          content:
            application/json:
              schema: *id002
        '404':
          description: No attachment exists with that identifier (`rest_post_invalid_id`).
          content:
            application/json:
              schema: *id002
components:
  schemas:
    MediaItem:
      type: object
      title: MediaItem
      properties:
        date:
          type:
          - string
          - 'null'
          description: The date the post was published, in the site's timezone.
          format: date-time
        date_gmt:
          type:
          - string
          - 'null'
          description: The date the post was published, as GMT.
          format: date-time
        guid:
          type: object
          description: The globally unique identifier for the post.
          properties:
            raw:
              type: string
              description: GUID for the post, as it exists in the database.
              readOnly: true
            rendered:
              type: string
              description: GUID for the post, transformed for display.
              readOnly: true
          readOnly: true
        id:
          type: integer
          description: Unique identifier for the post.
          readOnly: true
        link:
          type: string
          description: URL to the post.
          format: uri
          readOnly: true
        modified:
          type: string
          description: The date the post was last modified, in the site's timezone.
          format: date-time
          readOnly: true
        modified_gmt:
          type: string
          description: The date the post was last modified, as GMT.
          format: date-time
          readOnly: true
        slug:
          type: string
          description: An alphanumeric identifier for the post unique to its type.
        status:
          type: string
          description: A named status for the post.
          enum:
          - publish
          - future
          - draft
          - pending
          - private
          - acf-disabled
        type:
          type: string
          description: Type of post.
          readOnly: true
        permalink_template:
          type: string
          description: Permalink template for the post.
          readOnly: true
        generated_slug:
          type: string
          description: Slug automatically generated from the post title.
          readOnly: true
        class_list:
          type: array
          description: An array of the class names for the post container element.
          items:
            type: string
          readOnly: true
        title:
          type: object
          description: The title for the post.
          properties:
            raw:
              type: string
              description: Title for the post, as it exists in the database.
            rendered:
              type: string
              description: HTML title for the post, transformed for display.
              readOnly: true
        author:
          type: integer
          description: The ID for the author of the post.
        featured_media:
          type: integer
          description: The ID of the featured media for the post.
        comment_status:
          type: string
          description: Whether or not comments are open on the post.
          enum:
          - open
          - closed
        ping_status:
          type: string
          description: Whether or not the post can be pinged.
          enum:
          - open
          - closed
        meta:
          type: object
          description: Meta fields.
          properties:
            _acf_changed:
              type: boolean
            _et_pb_use_builder:
              type: string
            _et_pb_old_content:
              type: string
            _et_gb_content_width:
              type: string
        template:
          type: string
          description: The theme file to use to display the post.
        acf:
          type: object
          description: ACF field data
        alt_text:
          type: string
          description: Alternative text to display when attachment is not displayed.
        caption:
          type: object
          description: The attachment caption.
          properties:
            raw:
              type: string
              description: Caption for the attachment, as it exists in the database.
            rendered:
              type: string
              description: HTML caption for the attachment, transformed for display.
              readOnly: true
        description:
          type: object
          description: The attachment description.
          properties:
            raw:
              type: string
              description: Description for the attachment, as it exists in the database.
            rendered:
              type: string
              description: HTML description for the attachment, transformed for display.
              readOnly: true
        media_type:
          type: string
          description: Attachment type.
          enum:
          - image
          - file
          readOnly: true
        mime_type:
          type: string
          description: The attachment MIME type.
          readOnly: true
        media_details:
          type: object
          description: Details about the media file, specific to its type.
          readOnly: true
        post:
          type: integer
          description: The ID for the associated post of the attachment.
        source_url:
          type: string
          description: URL to the original attachment file.
          format: uri
          readOnly: true
        missing_image_sizes:
          type: array
          description: List of the missing image sizes of the attachment.
          items:
            type: string
          readOnly: true
        filename:
          type: string
          description: Original attachment file name.
          readOnly: true
        filesize:
          type: integer
          description: Attachment file size in bytes.
          readOnly: true
        exif_orientation:
          type: integer
          description: EXIF orientation value. Values 1-8 follow the EXIF specification, where 1 means no rotation
            needed.
          readOnly: true
      description: A media library attachment with its generated size variants.
    Error:
      type: object
      title: WordPress REST error
      description: The error envelope returned by every route on this surface. Observed live on 2026-08-22; it is
        a WordPress-native envelope, not RFC 9457 problem+json.
      properties:
        code:
          type: string
          description: Machine-readable error code, e.g. `rest_post_invalid_id`, `rest_invalid_param`, `rest_forbidden`.
        message:
          type: string
          description: Human-readable error message.
        data:
          type: object
          description: Error detail.
          properties:
            status:
              type: integer
              description: HTTP status code, repeated inside the body.
            params:
              type: object
              description: Per-parameter validation messages, present on `rest_invalid_param`.
            details:
              type: object
              description: Per-parameter structured validation detail, present on `rest_invalid_param`.
  securitySchemes:
    applicationPassword:
      type: http
      scheme: basic
      description: WordPress application passwords. Issued from https://hydrostor.ca/wp-admin/authorize-application.php
        and advertised by the API's own root document under `authentication.application-passwords`. Required only
        for write and administrative routes; every read operation described in this document answers anonymously.