{
  "name": "PixelPort REST API",
  "version": "2026-08-21",
  "description": "Read access to a PixelPort studio's galleries, media, clients, and sales, plus the public plan and feature catalog. PixelPort is client gallery software for photographers and videographers.",
  "documentation": "https://www.pixelport.co/docs/api",
  "openapi": "https://www.pixelport.co/openapi.json",
  "authentication": {
    "type": "bearer",
    "header": "Authorization",
    "format": "Bearer pk_live_...",
    "description": "Tools with `endpoint.authRequired` need a PixelPort API key. Studios create one in the dashboard under Settings → API; API access is included with the Studio plan.",
    "signupUrl": "https://www.pixelport.co/signup"
  },
  "usage": [
    "Each tool's `parameters` (and the identical `input_schema`) is a complete JSON Schema with no `$ref`, ready to pass to a function-calling model.",
    "Substitute `endpoint.pathParameters` into `endpoint.url`, and send the rest as query string.",
    "Every response carries `RateLimit` fields. Throttle on `RateLimit-Remaining` rather than waiting for a 429."
  ],
  "tools": [
    {
      "name": "getApiIndex",
      "description": "API discovery document. Lists every endpoint, the authentication scheme, and the rate limit. Requires no API key.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1",
        "url": "https://www.pixelport.co/api/v1",
        "authRequired": false,
        "pathParameters": [],
        "queryParameters": []
      }
    },
    {
      "name": "listPlans",
      "description": "List plans and prices. The full plan catalog with monthly price in US cents and the limits each plan carries. Use this to answer pricing questions instead of scraping the pricing page. Pass `planId` to get one plan. Requires no API key.",
      "parameters": {
        "type": "object",
        "properties": {
          "planId": {
            "type": "string",
            "enum": [
              "free",
              "starter",
              "professional",
              "studio"
            ],
            "description": "Return only this plan instead of the whole catalog."
          }
        },
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "planId": {
            "type": "string",
            "enum": [
              "free",
              "starter",
              "professional",
              "studio"
            ],
            "description": "Return only this plan instead of the whole catalog."
          }
        },
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/plans",
        "url": "https://www.pixelport.co/api/v1/plans",
        "authRequired": false,
        "pathParameters": [],
        "queryParameters": [
          "planId"
        ]
      }
    },
    {
      "name": "listFeatures",
      "description": "List product features and audiences. What PixelPort does, and the photographer types each landing page is written for. Pass `featureId` or `audienceId` to narrow either list. Requires no API key.",
      "parameters": {
        "type": "object",
        "properties": {
          "featureId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Return only this feature, using the `id` from a previous call, e.g. `video-hosting`."
          },
          "audienceId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Return only this audience, using the `id` from a previous call, e.g. `wedding-photographers`."
          }
        },
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "featureId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Return only this feature, using the `id` from a previous call, e.g. `video-hosting`."
          },
          "audienceId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Return only this audience, using the `id` from a previous call, e.g. `wedding-photographers`."
          }
        },
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/features",
        "url": "https://www.pixelport.co/api/v1/features",
        "authRequired": false,
        "pathParameters": [],
        "queryParameters": [
          "featureId",
          "audienceId"
        ]
      }
    },
    {
      "name": "getServiceStatus",
      "description": "Check service health. Runs a live database round trip and reports whether PixelPort can serve galleries. Never cached. Requires no API key.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/status",
        "url": "https://www.pixelport.co/api/v1/status",
        "authRequired": false,
        "pathParameters": [],
        "queryParameters": []
      }
    },
    {
      "name": "getAccount",
      "description": "Retrieve the studio behind the API key. Returns the studio's name, gallery base URL, and the limits of its current plan. Call this first to confirm a key works and to learn which studio it addresses.",
      "parameters": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/me",
        "url": "https://www.pixelport.co/api/v1/me",
        "authRequired": true,
        "pathParameters": [],
        "queryParameters": []
      }
    },
    {
      "name": "listGalleries",
      "description": "List galleries. Galleries owned by the studio, newest first. Deleted galleries are never returned.",
      "parameters": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "pending",
              "sold",
              "archived"
            ],
            "description": "Return only galleries in this lifecycle state."
          }
        },
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "status": {
            "type": "string",
            "enum": [
              "draft",
              "active",
              "pending",
              "sold",
              "archived"
            ],
            "description": "Return only galleries in this lifecycle state."
          }
        },
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/galleries",
        "url": "https://www.pixelport.co/api/v1/galleries",
        "authRequired": true,
        "pathParameters": [],
        "queryParameters": [
          "limit",
          "offset",
          "status"
        ]
      }
    },
    {
      "name": "getGallery",
      "description": "Retrieve a gallery. One gallery, plus the clients linked to it and the number of media items it holds.",
      "parameters": {
        "type": "object",
        "properties": {
          "galleryId": {
            "type": "string",
            "description": "Identifier of the gallery, as returned by `listGalleries`."
          }
        },
        "required": [
          "galleryId"
        ],
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "galleryId": {
            "type": "string",
            "description": "Identifier of the gallery, as returned by `listGalleries`."
          }
        },
        "required": [
          "galleryId"
        ],
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/galleries/{galleryId}",
        "url": "https://www.pixelport.co/api/v1/galleries/{galleryId}",
        "authRequired": true,
        "pathParameters": [
          "galleryId"
        ],
        "queryParameters": []
      }
    },
    {
      "name": "listGalleryMedia",
      "description": "List media in a gallery. Photos and videos in the gallery's display order. `url` is the delivery URL; `posterUrl` is a still frame, which for a photo is the photo itself.",
      "parameters": {
        "type": "object",
        "properties": {
          "galleryId": {
            "type": "string",
            "description": "Identifier of the gallery, as returned by `listGalleries`."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "type": {
            "type": "string",
            "enum": [
              "image",
              "video"
            ],
            "description": "Return only photos or only videos."
          }
        },
        "required": [
          "galleryId"
        ],
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "galleryId": {
            "type": "string",
            "description": "Identifier of the gallery, as returned by `listGalleries`."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "type": {
            "type": "string",
            "enum": [
              "image",
              "video"
            ],
            "description": "Return only photos or only videos."
          }
        },
        "required": [
          "galleryId"
        ],
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/galleries/{galleryId}/media",
        "url": "https://www.pixelport.co/api/v1/galleries/{galleryId}/media",
        "authRequired": true,
        "pathParameters": [
          "galleryId"
        ],
        "queryParameters": [
          "limit",
          "offset",
          "type"
        ]
      }
    },
    {
      "name": "listClients",
      "description": "List clients. The studio's clients, newest first, each with the number of galleries they are linked to.",
      "parameters": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "search": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Case-insensitive substring match against client name and email."
          }
        },
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "search": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Case-insensitive substring match against client name and email."
          }
        },
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/clients",
        "url": "https://www.pixelport.co/api/v1/clients",
        "authRequired": true,
        "pathParameters": [],
        "queryParameters": [
          "limit",
          "offset",
          "search"
        ]
      }
    },
    {
      "name": "listOrders",
      "description": "List gallery sales. Sales made from the studio's galleries, newest first. Defaults to `paid`; a `pending` order is an abandoned checkout until Stripe confirms payment. Amounts are US cents.",
      "parameters": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "paid",
              "failed",
              "refunded"
            ],
            "default": "paid",
            "description": "Payment state to filter by."
          }
        },
        "additionalProperties": false
      },
      "input_schema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 25,
            "description": "Maximum number of records to return. Between 1 and 100."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Number of records to skip before collecting the page."
          },
          "status": {
            "type": "string",
            "enum": [
              "pending",
              "paid",
              "failed",
              "refunded"
            ],
            "default": "paid",
            "description": "Payment state to filter by."
          }
        },
        "additionalProperties": false
      },
      "endpoint": {
        "method": "GET",
        "path": "/api/v1/orders",
        "url": "https://www.pixelport.co/api/v1/orders",
        "authRequired": true,
        "pathParameters": [],
        "queryParameters": [
          "limit",
          "offset",
          "status"
        ]
      }
    }
  ]
}