openapi: 3.2.0 info: title: Offerpad WordPress REST API (wp/v2) Media API version: 2.0.0 summary: The wp/v2 namespace of the WordPress REST API served by Offerpad's marketing site. description: DERIVED, NOT PUBLISHED BY OFFERPAD. Offerpad publishes no OpenAPI definition and does not document or support this surface as a developer product. This document was derived mechanically by API Evangelist from the live WordPress route-discovery document fetched from https://www.offerpad.com/wp-json/ on 2026-07-26 (411 routes across 20 namespaces; the wp/v2 namespace is captured here). Every path, method, parameter name, type, enum, default and description is copied verbatim from that discovery document. Response bodies are intentionally left as generic objects because the discovery document does not publish response schemas; error responses are grounded in payloads probed live against this host. This is a content-management surface for the marketing site - it is NOT a real estate, listing, valuation or transaction API. contact: name: Offerpad url: https://www.offerpad.com/contact/ x-apievangelist-method: derived x-apievangelist-source: openapi/offerpad-wp-json-discovery.json x-apievangelist-derived: '2026-07-26' x-upstream-documentation: https://developer.wordpress.org/rest-api/ servers: - url: https://www.offerpad.com/wp-json description: Offerpad marketing site (WP Engine) security: [] tags: - name: media description: WordPress media resource routes. paths: /wp/v2/media: get: operationId: listMedia summary: List media tags: - media parameters: - name: context schema: type: string enum: - view - embed - edit default: view required: false description: Scope under which the request is made; determines fields present in response. in: query - name: page schema: type: integer default: 1 minimum: 1 required: false description: Current page of the collection. in: query - name: per_page schema: type: integer default: 10 minimum: 1 maximum: 100 required: false description: Maximum number of items to be returned in result set. in: query - name: search schema: type: string required: false description: Limit results to those matching a string. in: query - name: after schema: type: string format: date-time required: false description: Limit response to posts published after a given ISO8601 compliant date. in: query - name: modified_after schema: type: string format: date-time required: false description: Limit response to posts modified after a given ISO8601 compliant date. in: query - name: author schema: type: array default: [] items: type: integer required: false description: Limit result set to posts assigned to specific authors. in: query - name: author_exclude schema: type: array default: [] items: type: integer required: false description: Ensure result set excludes posts assigned to specific authors. in: query - name: before schema: type: string format: date-time required: false description: Limit response to posts published before a given ISO8601 compliant date. in: query - name: modified_before schema: type: string format: date-time required: false description: Limit response to posts modified before a given ISO8601 compliant date. in: query - name: exclude schema: type: array default: [] items: type: integer required: false description: Ensure result set excludes specific IDs. in: query - name: include schema: type: array default: [] items: type: integer required: false description: Limit result set to specific IDs. in: query - name: search_semantics schema: type: string enum: - exact required: false description: How to interpret the search input. in: query - name: offset schema: type: integer required: false description: Offset the result set by a specific number of items. in: query - name: order schema: type: string enum: - asc - desc default: desc required: false description: Order sort attribute ascending or descending. in: query - name: orderby schema: type: string enum: - author - date - id - include - modified - parent - relevance - slug - include_slugs - title default: date required: false description: Sort collection by post attribute. in: query - name: parent schema: type: array default: [] items: type: integer required: false description: Limit result set to items with particular parent IDs. in: query - name: parent_exclude schema: type: array default: [] items: type: integer required: false description: Limit result set to all items except those of a particular parent ID. in: query - name: search_columns schema: type: array default: [] items: type: string enum: - post_title - post_content - post_excerpt required: false description: Array of column names to be searched. in: query - name: slug schema: type: array items: type: string required: false description: Limit result set to posts with one or more specific slugs. in: query - name: status schema: type: array default: inherit items: type: string enum: - inherit - private - trash required: false description: Limit result set to posts assigned one or more statuses. in: query - name: media_type schema: type: array default: null items: type: string enum: - image - video - text - application - audio required: false description: Limit result set to attachments of a particular media type or media types. in: query - name: mime_type schema: type: array default: null items: type: string required: false description: Limit result set to attachments of a particular MIME type or MIME types. in: query responses: '200': description: Successful response. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' post: operationId: createMedia summary: Create media tags: - media requestBody: required: false content: application/json: schema: type: object properties: date: type: string format: date-time description: The date the post was published, in the site's timezone. date_gmt: type: string format: date-time description: The date the post was published, as GMT. slug: type: string description: An alphanumeric identifier for the post unique to its type. status: type: string enum: - publish - future - draft - pending - private - acf-disabled description: A named status for the post. title: type: object description: The title for the post. 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 enum: - open - closed description: Whether or not comments are open on the post. ping_status: type: string enum: - open - closed description: Whether or not the post can be pinged. meta: type: object description: Meta fields. template: type: string description: The theme file to use to display the post. alt_text: type: string description: Alternative text to display when attachment is not displayed. caption: type: object description: The attachment caption. description: type: object description: The attachment description. post: type: integer description: The ID for the associated post of the attachment. security: - applicationPasswords: [] responses: '200': description: Successful response. content: application/json: schema: type: object '201': description: Resource created. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' /wp/v2/media/{id}: get: operationId: getMediaById summary: Retrieve media tags: - media parameters: - name: id in: path required: true schema: type: integer description: Unique identifier for the post. - name: context schema: type: string enum: - view - embed - edit default: view required: false description: Scope under which the request is made; determines fields present in response. in: query responses: '200': description: Successful response. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' post: operationId: createMediaById summary: Create media tags: - media parameters: - name: id in: path required: true schema: type: integer description: Unique identifier for the post. requestBody: required: false content: application/json: schema: type: object properties: date: type: string format: date-time description: The date the post was published, in the site's timezone. date_gmt: type: string format: date-time description: The date the post was published, as GMT. slug: type: string description: An alphanumeric identifier for the post unique to its type. status: type: string enum: - publish - future - draft - pending - private - acf-disabled description: A named status for the post. title: type: object description: The title for the post. 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 enum: - open - closed description: Whether or not comments are open on the post. ping_status: type: string enum: - open - closed description: Whether or not the post can be pinged. meta: type: object description: Meta fields. template: type: string description: The theme file to use to display the post. alt_text: type: string description: Alternative text to display when attachment is not displayed. caption: type: object description: The attachment caption. description: type: object description: The attachment description. post: type: integer description: The ID for the associated post of the attachment. security: - applicationPasswords: [] responses: '200': description: Successful response. content: application/json: schema: type: object '201': description: Resource created. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' delete: operationId: deleteMediaById summary: Delete media tags: - media parameters: - name: id in: path required: true schema: type: integer description: Unique identifier for the post. - name: force schema: type: boolean default: false required: false description: Whether to bypass Trash and force deletion. in: query responses: '200': description: Successful response. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' /wp/v2/media/{id}/edit: post: operationId: createMediaByIdEdit summary: Create media edit tags: - media parameters: - name: id in: path required: true schema: type: string description: Path parameter id declared by the route regex. requestBody: required: true content: application/json: schema: type: object properties: src: type: string format: uri description: URL to the edited image file. modifiers: type: array items: type: object description: Array of image edits. rotation: type: integer minimum: 0 maximum: 360 description: 'The amount to rotate the image clockwise in degrees. DEPRECATED: Use `modifiers` instead.' x: type: number minimum: 0 maximum: 100 description: 'As a percentage of the image, the x position to start the crop from. DEPRECATED: Use `modifiers` instead.' y: type: number minimum: 0 maximum: 100 description: 'As a percentage of the image, the y position to start the crop from. DEPRECATED: Use `modifiers` instead.' width: type: number minimum: 0 maximum: 100 description: 'As a percentage of the image, the width to crop the image to. DEPRECATED: Use `modifiers` instead.' height: type: number minimum: 0 maximum: 100 description: 'As a percentage of the image, the height to crop the image to. DEPRECATED: Use `modifiers` instead.' caption: type: object description: The attachment caption. description: type: object description: The attachment description. title: type: object description: The title for the post. post: type: integer description: The ID for the associated post of the attachment. alt_text: type: string description: Alternative text to display when attachment is not displayed. required: - src security: - applicationPasswords: [] responses: '200': description: Successful response. content: application/json: schema: type: object '201': description: Resource created. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' /wp/v2/media/{id}/post-process: post: operationId: createMediaByIdPostProcess summary: Create media post process tags: - media parameters: - name: id in: path required: true schema: type: integer description: Unique identifier for the attachment. requestBody: required: true content: application/json: schema: type: object properties: action: type: string enum: - create-image-subsizes required: - action security: - applicationPasswords: [] responses: '200': description: Successful response. content: application/json: schema: type: object '201': description: Resource created. content: application/json: schema: type: object '400': description: 'Invalid parameter(s). Probed live: {"code":"rest_invalid_param"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '401': description: 'Authentication required or capability missing. Probed live: {"code":"rest_forbidden"}' content: application/json: schema: $ref: '#/components/schemas/WPError' '404': description: 'No route matched, or the resource id is invalid. Probed live: {"code":"rest_no_route"} / {"code":"rest_post_invalid_id"}' content: application/json: schema: $ref: '#/components/schemas/WPError' components: schemas: WPError: type: object description: WordPress REST error envelope, observed live on this host. properties: code: type: string description: Machine-readable error code, e.g. rest_no_route. message: type: string description: Human-readable error message. data: type: object properties: status: type: integer description: HTTP status code, repeated in the body. params: type: object description: Per-parameter validation messages (rest_invalid_param). details: type: object description: Per-parameter structured error detail. required: - code - message examples: - code: rest_post_invalid_id message: Invalid post ID. data: status: 404 securitySchemes: applicationPasswords: type: http scheme: basic description: WordPress application passwords, advertised by the discovery document at https://www.offerpad.com/wp-admin/authorize-application.php. Sent as HTTP Basic credentials. Required for write operations and for reads in the edit context; issuing a credential requires an Offerpad WordPress account, which is not self-serve.