placementapi-com · Schema

Order

An order as listed by GET /v1/orders. Supplier identity is intentionally not exposed anywhere in this API. You are buying from us; which upstream marketplace fulfils a placement is not something you need or can act on.

CompanyAISEOMarketingBacklinksAutomationTechnology

Properties

Name Type Description
order_id string
status object
offer_id string
placement_type object
inventory_mode object
site_id stringnull
target_url string
anchor_text stringnull
anchor_plan object
target_keyword stringnull
quantity integer
total_credits integer Credits. 1 credit = 1 US cent.
ordered_at string
due_at stringnull
content object
cancellable boolean True while nothing has been sent to a supplier yet.
submitted_at stringnull
delivered_at stringnull
placement_url stringnull
delivery_state string Derived at read time, never stored. `refund_eligible` is a delivery-timing milestone (past due plus the account grace period) judged from the calendar alone; it does not check supplier recovery, does
days_late integernull
refund_eligible_at stringnull When the order passes due_at plus the account grace period. Delivery timing only: it does not mean credits have been returned and it is not an automatic credit refund. A credit refund for an order alr
supplier_report stringnull The supplier's latest word from the check-in loop: completed | on_time | delayed, or null.
supplier_report_at stringnull
link_audit objectnull Our own audit of the delivered page: link present in served HTML, dofollow, bought anchor intact. Null before the first sweep.
turnaround_revised boolean
outcome objectnull Compact outcome (no per-keyword series). `detail` names GET /v1/orders/{order_id}/outcome. Null until tracking has produced anything.
View JSON Schema on GitHub

JSON Schema

placementapi-com-order-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/placementapi-com/json-schema/placementapi-com-order-schema.json",
  "title": "Order",
  "description": "An order as listed by GET /v1/orders. Supplier identity is intentionally not exposed anywhere in this API. You are buying from us; which upstream marketplace fulfils a placement is not something you need or can act on.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/placementapi-com-openapi.json#/components/schemas/Order",
  "type": "object",
  "properties": {
    "order_id": {
      "type": "string"
    },
    "status": {
      "$ref": "#/$defs/OrderStatus"
    },
    "offer_id": {
      "type": "string"
    },
    "placement_type": {
      "$ref": "#/$defs/PlacementType"
    },
    "inventory_mode": {
      "$ref": "#/$defs/InventoryMode"
    },
    "site_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "target_url": {
      "type": "string"
    },
    "anchor_text": {
      "type": [
        "string",
        "null"
      ]
    },
    "anchor_plan": {
      "oneOf": [
        {
          "$ref": "#/$defs/AnchorPlan"
        },
        {
          "type": "null"
        }
      ]
    },
    "target_keyword": {
      "type": [
        "string",
        "null"
      ]
    },
    "quantity": {
      "type": "integer"
    },
    "total_credits": {
      "type": "integer",
      "description": "Credits. 1 credit = 1 US cent."
    },
    "ordered_at": {
      "type": "string",
      "format": "date-time"
    },
    "due_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "content": {
      "$ref": "#/$defs/OrderContent"
    },
    "cancellable": {
      "type": "boolean",
      "description": "True while nothing has been sent to a supplier yet."
    },
    "submitted_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "delivered_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "placement_url": {
      "type": [
        "string",
        "null"
      ]
    },
    "delivery_state": {
      "type": "string",
      "enum": [
        "in_progress",
        "on_time",
        "delivered_late",
        "overdue",
        "refund_eligible",
        "unknown_turnaround",
        "closed"
      ],
      "description": "Derived at read time, never stored. `refund_eligible` is a delivery-timing milestone (past due plus the account grace period) judged from the calendar alone; it does not check supplier recovery, does not mean a claim has been filed with a supplier, and is not a refund decision."
    },
    "days_late": {
      "type": [
        "integer",
        "null"
      ]
    },
    "refund_eligible_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "When the order passes due_at plus the account grace period. Delivery timing only: it does not mean credits have been returned and it is not an automatic credit refund. A credit refund for an order already with a supplier requires that we have recovered from the supplier, plus the supplier's refund window and the account grace period. The customer can ask us to pursue a supplier recovery review at hello@placementapi.com."
    },
    "supplier_report": {
      "type": [
        "string",
        "null"
      ],
      "description": "The supplier's latest word from the check-in loop: completed | on_time | delayed, or null."
    },
    "supplier_report_at": {
      "type": [
        "string",
        "null"
      ]
    },
    "link_audit": {
      "type": [
        "object",
        "null"
      ],
      "description": "Our own audit of the delivered page: link present in served HTML, dofollow, bought anchor intact. Null before the first sweep.",
      "properties": {
        "checked_at": {
          "type": "string"
        },
        "link_found": {
          "type": "boolean"
        },
        "dofollow": {
          "type": [
            "boolean",
            "null"
          ]
        },
        "anchor_matched": {
          "type": [
            "boolean",
            "null"
          ]
        }
      }
    },
    "turnaround_revised": {
      "type": "boolean"
    },
    "outcome": {
      "type": [
        "object",
        "null"
      ],
      "description": "Compact outcome (no per-keyword series). `detail` names GET /v1/orders/{order_id}/outcome. Null until tracking has produced anything.",
      "properties": {
        "days_observed": {
          "type": [
            "integer",
            "null"
          ]
        },
        "latest_checkpoint": {
          "type": [
            "string",
            "null"
          ]
        },
        "keywords": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "keywords_improved": {
          "type": "integer"
        },
        "keywords_declined": {
          "type": "integer"
        },
        "entered_top10": {
          "type": "integer"
        },
        "median_delta": {
          "type": [
            "number",
            "null"
          ]
        },
        "serp_churn": {
          "type": [
            "number",
            "null"
          ]
        },
        "visibility": {
          "type": "object"
        },
        "survival": {
          "type": "object"
        },
        "confidence": {
          "type": "string",
          "enum": [
            "low",
            "medium",
            "high"
          ]
        },
        "confidence_note": {
          "type": "string"
        },
        "detail": {
          "type": "string"
        }
      }
    }
  },
  "$defs": {
    "AnchorPlan": {
      "type": "object",
      "description": "Anchor text is a DISTRIBUTION, not a string. Many links with one exact-match anchor is the classic over-optimisation footprint. Mix branded, topical, generic and naked_url anchors.",
      "required": [
        "anchors"
      ],
      "properties": {
        "anchors": {
          "type": "array",
          "minItems": 1,
          "items": {
            "type": "object",
            "required": [
              "text",
              "type"
            ],
            "properties": {
              "text": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300
              },
              "type": {
                "type": "string",
                "enum": [
                  "branded",
                  "naked_url",
                  "generic",
                  "topical",
                  "partial_match",
                  "exact_match"
                ]
              },
              "weight": {
                "type": "number",
                "exclusiveMinimum": 0,
                "default": 1,
                "description": "Relative weight; normalised across the plan."
              }
            }
          }
        }
      }
    },
    "InventoryMode": {
      "type": "string",
      "enum": [
        "named",
        "pre_approval",
        "blind"
      ],
      "description": "The most important field. 'named' = a specific, identified domain you can inspect before ordering. 'pre_approval' = the vendor proposes candidate domains and the buyer approves them BEFORE placement. 'blind' = a promise (e.g. DR50+, finance) where the domain is assigned at fulfilment with no veto. Only 'named' carries a site_id. Never present a pre_approval or blind offer as though a specific site were secured, and never price-compare a specification against a named domain as the same product."
    },
    "OrderContent": {
      "type": "object",
      "description": "The article on an order: who writes it, what it cost, when it is due.",
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "publisher",
            "service",
            "supplied",
            "papi_written"
          ]
        },
        "tier": {
          "type": [
            "string",
            "null"
          ]
        },
        "price_credits": {
          "type": "integer"
        },
        "due_at": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time"
        },
        "if_no_content": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "convert_to_service",
            "cancel",
            null
          ]
        },
        "version": {
          "type": "integer",
          "description": "How many versions have been sent so far."
        },
        "awaiting": {
          "type": "boolean",
          "description": "True in awaiting_content or content_revision_requested: the order is paid and held, not with a supplier."
        }
      }
    },
    "OrderStatus": {
      "type": "string",
      "enum": [
        "ordered",
        "awaiting_content",
        "content_revision_requested",
        "awaiting_operator",
        "submitted_to_vendor",
        "delivered",
        "cancelled",
        "refunded",
        "failed"
      ]
    },
    "PlacementType": {
      "type": "string",
      "enum": [
        "guest_post",
        "niche_edit",
        "link_insert",
        "homepage_link",
        "media_placement"
      ]
    }
  }
}

Work with this as data

Every JSON Schema 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 schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • 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 JSON Schema
curl "https://apis.io/api/v1/json-schemas/placementapi-com-order"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

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

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

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