{
  "name": "SP3ND",
  "description": "Create and pay server-priced shipped-product and tokenized Collector Crypt card orders with USDC. Approved Partners can search, quote, order, and pay without a separate card opt-in; SP3ND manually purchases and delivers paid cards.",
  "url": "https://us-central1-sp3nddotshop-prod.cloudfunctions.net",
  "provider": {
    "organization": "SP3ND",
    "url": "https://sp3nd.shop"
  },
  "version": "1.11.0",
  "documentationUrl": "https://sp3nd.shop/partner-api/docs",
  "legacyAgenticSkillDocumentationUrl": "https://sp3nd.shop/skill.md",
  "defaultPaymentSurface": "createPartnerTransaction",
  "collectorCryptPaymentSurface": "partnerPayment",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "x402Payment": false,
    "legacyX402Compatibility": true,
    "asynchronousQuotes": true,
    "manualReview": true,
    "shippingOptionSelection": true,
    "idempotentOrderCreation": true,
    "serverAuthoritativePricing": true,
    "walletAttribution": true,
    "collectorCryptSearch": true,
    "walletAssetDelivery": true,
    "collectorCryptFulfillmentEnabledByDefault": true,
    "manualWalletAssetFulfillment": true,
    "automatedWalletAssetFulfillment": false
  },
  "supportedAmazonTLDs": [
    "amazon.com",
    "amazon.co.uk",
    "amazon.ca",
    "amazon.de",
    "amazon.fr",
    "amazon.es",
    "amazon.it",
    "amazon.nl",
    "amazon.com.be",
    "amazon.be",
    "amazon.ie",
    "amazon.pl",
    "amazon.se",
    "amazon.com.br",
    "amazon.com.mx",
    "amazon.com.au",
    "amazon.in",
    "amazon.co.jp",
    "amazon.sg",
    "amazon.ae",
    "amazon.sa",
    "amazon.eg",
    "amazon.com.tr",
    "amazon.co.za",
    "amazon.cn"
  ],
  "supportedEbayTLDs": [
    "ebay.com",
    "ebay.ca",
    "ebay.co.uk",
    "ebay.de",
    "ebay.at",
    "ebay.fr",
    "ebay.it",
    "ebay.es",
    "ebay.ie",
    "ebay.nl",
    "ebay.be",
    "ebay.ch",
    "ebay.pl",
    "ebay.com.au",
    "ebay.com.hk",
    "ebay.com.my",
    "ebay.ph",
    "ebay.com.sg",
    "ebay.in",
    "ebay.cn",
    "ebay.com.tw",
    "ebay.vn",
    "ebay.co.th"
  ],
  "supportedShortLinkHosts": [
    "a.co",
    "amzn.to",
    "amzn.eu",
    "amzn.asia",
    "ebay.io/m/<code>"
  ],
  "tldNote": "For shipped products, use a vetted marketplace URL appropriate for the recipient and send the complete final destination when creating the order. Short links are expanded and revalidated, and returned items use canonical product URLs. eBay pricing and shipping are destination-dependent. Collector Crypt-only orders omit shipping and use asset_recipient_wallet.",
  "collectorCryptContract": {
    "searchEndpoint": "/searchCollectorCryptCards",
    "provider": "collectorcrypt",
    "network": "solana",
    "currency": "USDC",
    "supportedTokenStandards": [
      "Pnft",
      "Cnft",
      "StandardNft",
      "CoreNft"
    ],
    "pricePrecision": "positive cent-denominated USDC amount",
    "canonicalAssetUrl": "https://collectorcrypt.com/assets/solana/<asset-address>",
    "cartItemLimit": 1,
    "quantity": 1,
    "mixedCarts": false,
    "quoteLifetimeMinutes": 5,
    "shippingAddressRequired": false,
    "assetRecipientField": "asset_recipient_wallet",
    "recipientRule": "user_wallet and asset_recipient_wallet resolve to the same valid on-curve Solana wallet; gifting is unsupported in this release.",
    "realOrderAndPaymentDefault": "enabled_for_approved_partners",
    "paymentEndpoint": "/partnerPayment",
    "paymentActions": [
      "prepare",
      "submit"
    ],
    "createPartnerTransactionSupported": false,
    "wrongPaymentMethodErrorCode": "COLLECTOR_CRYPT_PAYMENT_METHOD_UNSUPPORTED",
    "recipientMismatchErrorCode": "ASSET_RECIPIENT_WALLET_MISMATCH",
    "cartWalletInvalidErrorCode": "USER_WALLET_INVALID",
    "searchResponseMetadata": {
      "schema_version": 2,
      "item": [
        "pricing_source",
        "card_id",
        "back_image_url",
        "card_type",
        "grading_id",
        "price",
        "currency",
        "listing_price_usdc",
        "insured_value_usd",
        "listed_at",
        "listing_updated_at"
      ],
      "catalog": [
        "total",
        "marketplace_total",
        "total_pages",
        "category_counts"
      ],
      "note": "listing_price_usdc is the live cent-denominated listing amount mirrored by generic price. Returned items have a supported token_standard. Upstream totals, pages, and category counts are computed before SP3ND local eligibility filtering and may exceed items.length. Insured value and timestamps are informational; createPartnerCart refetches the asset and establishes the authoritative quote."
    },
    "paidMeaning": "SP3ND treasury receipt confirmed; provider purchase and wallet delivery remain pending.",
    "fulfillmentStatuses": [
      "awaiting_payment",
      "pending_acquisition",
      "review_required",
      "delivered"
    ],
    "queueMeaning": "After confirmed payment, pending_acquisition means a server-only job is queued for SP3ND's manual operations team to purchase the exact card and transfer it to the fixed buyer wallet. No automatic purchase or transfer occurs; queueing is not delivery.",
    "availabilityRisk": "The listing may sell or change before SP3ND purchases it, requiring manual handling and potentially a refund.",
    "searchAndQuotesAccess": "all_authenticated_approved_partners",
    "partnerOptInRequired": false,
    "discoveryCapabilityField": "getAgentStatus.agent.collector_crypt_enabled",
    "discoveryCapabilityMeaning": "Derived true after normal approved-Partner authentication, not a stored setting.",
    "fulfillmentMode": "manual",
    "requiresManualFulfillment": true,
    "fulfillmentEvidence": "Confirmed transaction references plus authorized operator attestations; delivery also checks current asset ownership. These checks do not cryptographically prove that a referenced transaction caused the specific purchase or asset transfer."
  },
  "authentication": {
    "schemes": [
      "apiKey"
    ],
    "description": "Register with POST /registerAgent. Include X-API-Key and X-API-Secret on authenticated requests."
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "schemaVersion": 2,
  "lifecycle": {
    "paymentGate": "Only pay when payment_ready is true. pricing_status is informational and is never a second payment gate.",
    "checkoutRoles": [
      "direct_payment",
      "manual_review"
    ],
    "pricingStatuses": [
      "awaiting_team_quote",
      "shipping_selection_required",
      "ready_for_payment"
    ],
    "manualReview": "Mixed or unverified carts remain one Awaiting Review order with checkout_role manual_review, pricing_status awaiting_team_quote, requires_manual_quote true, and payment_ready false.",
    "shippingSelection": "When pricing_status is shipping_selection_required, payment_ready remains false until the user selects a current opaque shipping_option_id.",
    "requiredTransition": "An Awaiting Review order must reach Ready for Payment before Paid. Ready for Payment means the payment gate passes, the quote is current, and any required shipping option is selected.",
    "quoteSafety": "Honor quote_revision, quote_expires_at, shipping_options, selected_shipping_option_id, and selected_shipping_option. Refresh expired or changed quotes.",
    "pricingAuthority": "SP3ND resolves product data and payment requirements. Caller-provided prices, totals, currency, recipient, and memo are not authoritative.",
    "walletAttribution": "Send user_wallet for end-user history and points attribution.",
    "assetDelivery": "Collector Crypt orders use a fixed asset_recipient_wallet and manual fulfillment. Paid confirms SP3ND treasury receipt only and queues pending_acquisition for SP3ND's manual operations team. Authorized operations must verify the wallet transfer and atomically record delivered fulfillment metadata and transfer evidence with top-level status Delivered; clients use that top-level status as the completion gate. A claim mismatch uses review_required, and a sold or changed listing may require manual handling and a refund.",
    "paymentFlow": "Choose the surface required by the order type. Shipped-product Partner API integrations default to createPartnerTransaction. Collector Crypt uses partnerPayment prepare/submit only; both createPartnerTransaction and payAgentOrder reject real cards. Legacy agentic-skill x402 integrations call payAgentOrder only for supported non-card orders. MCP tools use partnerPayment behind their OAuth/session boundary. Do not chain surfaces.",
    "settlementAuthority": "Clients never call or configure an upstream facilitator directly. SP3ND is the only settlement service exposed to the integration."
  },
  "paymentSurfaces": {
    "default": "partnerApiDefault",
    "partnerApiDefault": {
      "endpoint": "/createPartnerTransaction",
      "description": "Default for shipped products only. Request server-authoritative payment instructions once with order_id and sender_address. SP3ND returns amount, currency, memo, and recipient_address but does not sign or broadcast. Collector Crypt is rejected with COLLECTOR_CRYPT_PAYMENT_METHOD_UNSUPPORTED.",
      "productionUsdcMint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      "paymentSignatureHeader": false,
      "facilitator": false
    },
    "collectorCryptPartnerPayment": {
      "endpoint": "/partnerPayment",
      "method": "POST",
      "actions": [
        "prepare",
        "submit"
      ],
      "description": "Collector Crypt wallet payment is available to approved Partners without separate opt-in. Prepare one immutable, expiry-bound transaction, sign its exact bytes with payer_address, submit only that exact signed serialization, and poll the order. Confirmed USDC payment queues manual purchase and wallet delivery by SP3ND; Paid is not delivery.",
      "prepareIdempotency": "An unchanged safe replay returns the same unsigned_transaction_base64 with idempotent_replay=true.",
      "submitIdempotency": "On an unknown outcome, read the order and retry only the identical signed_transaction_base64. Never rebuild, re-sign, or prepare a replacement while unknown.",
      "facilitator": false
    },
    "legacyAgenticSkillX402": {
      "endpoint": "/payAgentOrder",
      "description": "Advanced legacy compatibility only for supported non-card orders. Real Collector Crypt orders are rejected with COLLECTOR_CRYPT_PAYMENT_METHOD_UNSUPPORTED.",
      "documentationUrl": "https://sp3nd.shop/skill.md",
      "discoverableByDefault": false
    },
    "mcp": {
      "url": "https://mcp.sp3nd.shop/mcp",
      "description": "OAuth-protected MCP tools backed by the same partnerPayment prepare/submit endpoint; the MCP layer owns session and approval binding."
    }
  },
  "shippingContract": {
    "optionFields": [
      "shipping_option_id",
      "label",
      "description",
      "estimated_delivery",
      "shipping_amount",
      "tax_amount",
      "total_amount",
      "currency"
    ],
    "compatibilityAliases": [
      "id",
      "name",
      "min_days",
      "max_days"
    ],
    "selectionRequestField": "shipping_option_id",
    "selectedIdField": "selected_shipping_option_id",
    "selectedObjectField": "selected_shipping_option",
    "deprecatedSelectedObjectAlias": "selected_manual_shipping_option"
  },
  "skills": [
    {
      "id": "register-agent",
      "name": "Register Agent",
      "description": "Register an agent and receive API credentials.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/registerAgent",
      "method": "POST",
      "authentication": false,
      "parameters": {
        "agent_name": {
          "type": "string",
          "required": true
        },
        "solana_public_key": {
          "type": "string",
          "required": true
        },
        "contact_email": {
          "type": "string",
          "required": true
        },
        "description": {
          "type": "string",
          "required": false
        }
      }
    },
    {
      "id": "search-collector-crypt-cards",
      "name": "Search Collector Crypt Cards",
      "description": "Search eligible native-Solana Collector Crypt V2 buy-now listings with supported token standards and cent-denominated USDC prices. Upstream counts precede local eligibility filtering and may exceed items.length. createPartnerCart refetches the exact asset and establishes the authoritative quote.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/searchCollectorCryptCards",
      "method": "GET",
      "authentication": true,
      "parameters": {
        "q": {
          "type": "string",
          "required": false,
          "maxLength": 200,
          "description": "Optional substring card/item-name search or exact NFT-address/grading-ID lookup. Omit to browse."
        },
        "limit": {
          "type": "integer",
          "required": false,
          "minimum": 1,
          "maximum": 100,
          "default": 20
        },
        "cursor": {
          "type": "string",
          "required": false,
          "minLength": 1,
          "maxLength": 2048,
          "description": "Opaque, nonblank next_cursor returned unchanged; control characters are rejected; takes precedence over page."
        },
        "page": {
          "type": "integer",
          "required": false,
          "minimum": 1,
          "maximum": 10000
        }
      }
    },
    {
      "id": "create-cart",
      "name": "Create Server-Priced Cart",
      "description": "Create a server-priced cart from shipped-product URLs or one Collector Crypt asset. Display metadata and prices supplied by callers are non-authoritative.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/createPartnerCart",
      "method": "POST",
      "authentication": true,
      "parameters": {
        "items": {
          "type": "array",
          "required": true,
          "description": "Products to resolve and price on the server.",
          "items": {
            "product_url": {
              "type": "string",
              "required": false,
              "description": "Canonical Amazon/eBay HTTPS product URL, a supported Amazon/eBay product-share link, or an exact https://collectorcrypt.com/assets/solana/<asset-address> URL."
            },
            "provider": {
              "type": "string",
              "required": false,
              "enum": [
                "collectorcrypt"
              ],
              "description": "Use with nft_address instead of product_url for a Collector Crypt card."
            },
            "nft_address": {
              "type": "string",
              "required": false,
              "description": "Exact Collector Crypt Solana asset address; requires provider=collectorcrypt."
            },
            "quantity": {
              "type": "integer",
              "required": true,
              "minimum": 1,
              "description": "Physical products follow normal cart bounds. Collector Crypt assets require exactly 1 and one card per cart."
            }
          }
        },
        "user_wallet": {
          "type": "string",
          "required": false,
          "description": "Optional valid on-curve Solana wallet saved on the cart. createPartnerOrder uses it when the order request omits user_wallet; the final Collector Crypt buyer and asset-recipient wallets must still resolve identically."
        }
      }
    },
    {
      "id": "create-order",
      "name": "Create Lifecycle-Aware Order",
      "description": "Create one idempotent order from a cart. Shipped products require a complete shipping address. A Collector Crypt-only cart omits shipping and resolves user_wallet plus asset_recipient_wallet to the same buyer wallet; gifting is unsupported. Approved Partners may create and pay card orders without separate opt-in; confirmed payment queues SP3ND's manual purchase and wallet delivery.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/createPartnerOrder",
      "method": "POST",
      "authentication": true,
      "headers": {
        "Idempotency-Key": {
          "type": "string",
          "required": false,
          "description": "Stable key for this intended checkout. Supply this header or the idempotency_key body field, and reuse it for retries."
        }
      },
      "parameters": {
        "cart_id": {
          "type": "string",
          "required": true
        },
        "idempotency_key": {
          "type": "string",
          "required": false,
          "description": "Stable key supplied in the body instead of the Idempotency-Key header. If both are present, use the same value."
        },
        "user_wallet": {
          "type": "string",
          "required": false,
          "description": "End-user Solana wallet. For Collector Crypt it resolves to the asset recipient; send both wallet fields identically."
        },
        "asset_recipient_wallet": {
          "type": "string",
          "required": false,
          "description": "Collector Crypt delivery wallet. It must resolve to the same valid on-curve address as user_wallet; gifting is unsupported and a mismatch is rejected."
        },
        "customer_email": {
          "type": "string",
          "required": true
        },
        "shipping_address": {
          "type": "object",
          "required": false,
          "description": "Complete final destination required for shipped-product carts. Omit for a Collector Crypt-only cart.",
          "properties": {
            "name": {
              "type": "string",
              "required": false,
              "description": "Supply at least one of name or recipient."
            },
            "recipient": {
              "type": "string",
              "required": false,
              "description": "Supply at least one of recipient or name."
            },
            "address1": {
              "type": "string",
              "required": true
            },
            "address2": {
              "type": "string",
              "required": false
            },
            "city": {
              "type": "string",
              "required": true
            },
            "state": {
              "type": "string",
              "required": false
            },
            "postalCode": {
              "type": "string",
              "required": true
            },
            "country": {
              "type": "string",
              "required": true
            },
            "countryCode": {
              "type": "string",
              "required": false
            },
            "phone": {
              "type": "string",
              "required": true
            }
          }
        }
      },
      "outputLifecycleFields": [
        "schema_version",
        "status",
        "checkout_role",
        "pricing_status",
        "requires_manual_quote",
        "payment_ready",
        "quote_revision",
        "quote_expires_at",
        "shipping_options",
        "selected_shipping_option_id",
        "selected_shipping_option",
        "selected_manual_shipping_option",
        "order_type",
        "fulfillment_type",
        "fulfillment_provider",
        "fulfillment_mode",
        "requires_manual_fulfillment",
        "fulfillment_status",
        "asset_recipient_wallet",
        "provider_purchase_signature",
        "asset_transfer_signature",
        "fulfilled_at",
        "delivered_at"
      ]
    },
    {
      "id": "get-order",
      "name": "Get One Order",
      "description": "Read an order and its schema v2 quote, payment-readiness, and fulfillment fields.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/getPartnerOrder",
      "method": "GET",
      "authentication": true,
      "parameters": {
        "order_id": {
          "type": "string",
          "required": true
        }
      }
    },
    {
      "id": "get-orders",
      "name": "List Orders",
      "description": "List authenticated partner orders. Omit status to return all orders (recommended); status=all is also supported for compatibility.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/getPartnerOrders",
      "method": "GET",
      "authentication": true,
      "parameters": {
        "status": {
          "type": "string",
          "required": false,
          "description": "A real named status such as Created, Awaiting Review, Paid, Ordered, Shipped, or Delivered. Omit for all (recommended), or use all for compatibility."
        },
        "limit": {
          "type": "integer",
          "required": false,
          "minimum": 1,
          "maximum": 100,
          "default": 50
        },
        "offset": {
          "type": "integer",
          "required": false,
          "minimum": 0,
          "maximum": 499,
          "default": 0,
          "description": "The combined limit plus offset may not exceed 500."
        },
        "user_wallet": {
          "type": "string",
          "required": false
        },
        "customer_email": {
          "type": "string",
          "required": false
        }
      }
    },
    {
      "id": "select-shipping-option",
      "name": "Select Order Shipping Option",
      "description": "When pricing_status is shipping_selection_required, select an opaque shipping_option_id from the order's current shipping_options. The server enforces quote revision and expiry.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/selectPartnerOrderShippingOption",
      "method": "POST",
      "authentication": true,
      "parameters": {
        "order_id": {
          "type": "string",
          "required": true
        },
        "shipping_option_id": {
          "type": "string",
          "required": true
        }
      }
    },
    {
      "id": "prepare-collector-crypt-payment",
      "name": "Prepare Collector Crypt Payment",
      "description": "Prepare one server-authoritative, immutable, expiry-bound Solana USDC transaction for a payment-ready Collector Crypt order. Payment goes to SP3ND and queues manual acquisition and wallet delivery after confirmation; it does not itself deliver the card.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/partnerPayment",
      "method": "POST",
      "authentication": true,
      "parameters": {
        "action": {
          "type": "string",
          "required": true,
          "const": "prepare"
        },
        "order_id": {
          "type": "string",
          "required": true
        },
        "payer_address": {
          "type": "string",
          "required": true,
          "description": "Valid Solana address that must match the order wallet and sign the exact returned transaction."
        },
        "order_number": {
          "type": "string",
          "required": false,
          "description": "Compatibility field; validated if present."
        }
      },
      "responseFields": [
        "success",
        "status",
        "idempotent_replay",
        "order_id",
        "order_number",
        "amount",
        "currency",
        "network",
        "payer_address",
        "recipient_address",
        "token_mint",
        "token_decimals",
        "amount_atomic",
        "memo",
        "unsigned_transaction_base64",
        "recent_blockhash",
        "last_valid_block_height"
      ]
    },
    {
      "id": "submit-collector-crypt-payment",
      "name": "Submit Collector Crypt Payment",
      "description": "Submit only the exact wallet-signed serialization from the matching prepare response. On an unknown result, read the order and retry only those identical signed bytes; never rebuild or re-sign.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/partnerPayment",
      "method": "POST",
      "authentication": true,
      "parameters": {
        "action": {
          "type": "string",
          "required": true,
          "const": "submit"
        },
        "order_id": {
          "type": "string",
          "required": true
        },
        "signed_transaction_base64": {
          "type": "string",
          "required": true,
          "maxLength": 16000,
          "description": "Exact signed transaction returned by the matching prepare action; never rebuilt or modified."
        },
        "order_number": {
          "type": "string",
          "required": false,
          "description": "Compatibility field; validated if present."
        }
      },
      "responseStatuses": [
        "verifying_payment",
        "already_paid"
      ]
    },
    {
      "id": "create-transaction",
      "name": "Create Partner API Payment Attempt",
      "description": "Default shipped-product Partner API payment path. Request authoritative payment instructions, broadcast the wallet payment, and poll the order while SP3ND confirms it asynchronously. Collector Crypt is unsupported and must use partnerPayment prepare/submit.",
      "defaultPaymentSurface": true,
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/createPartnerTransaction",
      "method": "POST",
      "authentication": true,
      "parameters": {
        "order_id": {
          "type": "string",
          "required": true
        },
        "order_number": {
          "type": "string",
          "required": false,
          "description": "Optional and validated against order_id."
        },
        "sender_address": {
          "type": "string",
          "required": true,
          "description": "Buyer wallet; used as Solana fee payer and USDC transfer authority."
        }
      }
    },
    {
      "id": "pay-order",
      "name": "Legacy Agentic-Skill x402 Payment",
      "description": "Advanced legacy compatibility only for supported non-card orders and not discoverable as the default Partner API payment method. Real Collector Crypt orders are rejected and must use partnerPayment. Never call an upstream facilitator directly.",
      "legacyOnly": true,
      "discoverableByDefault": false,
      "documentationUrl": "https://sp3nd.shop/skill.md",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/payAgentOrder",
      "method": "POST",
      "authentication": true,
      "x402": {
        "enabled": true,
        "asset": "server_authoritative",
        "network": "server_authoritative",
        "signatureHeader": "PAYMENT-SIGNATURE",
        "signatureSubmissionEndpoint": "/payAgentOrder",
        "settlementAuthority": "SP3ND payAgentOrder",
        "contractAvailability": "Advanced legacy agentic-skill compatibility only. Contact SP3ND for the versioned wire contract."
      },
      "parameters": {
        "order_id": {
          "type": "string",
          "required": true
        },
        "order_number": {
          "type": "string",
          "required": false,
          "description": "Optional and validated against order_id."
        }
      }
    },
    {
      "id": "agent-status",
      "name": "Agent Status",
      "description": "Return agent registration and operational status.",
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ],
      "endpoint": "/getAgentStatus",
      "method": "GET",
      "authentication": true
    }
  ]
}
