Merchant-0 · Authentication Profile

Merchant 0 Com Authentication

Authentication

Merchant-0 declares 0 security scheme(s) across its OpenAPI definitions.

AgentsAgentic CommerceA2AAP2Universal Commerce ProtocolTrade IntelligenceMarket IntelligenceSupply ChainSoutheast AsiaDecentralized IdentityAgent-Native
Methods: Schemes: 0 OAuth flows: API key in:

Security Schemes

Source

Authentication Profile

Raw ↑
generated: '2026-09-19'
method: searched
source: https://api.merchant-0.com/openapi.json
derived_from: openapi/merchant-0-com-openapi.json
docs:
- https://merchant-0.com/.well-known/agent-card.json
- https://merchant-0.com/.well-known/did.json
summary: >-
  The OpenAPI declares NO securitySchemes and NO security requirements on any of its 95 operations, and
  derive-authentication.py therefore produced no profile. Read against the contract's own descriptions and
  the agent card, the real model is: buyer-facing routes are open — a caller asserts its identity by placing
  its own did:web DID in the request body (buyer_did) and, at the sign step, an opaque buyer_signature whose
  message and key the contract never defines; access is then shaped by reputation (a FLAGGED DID gets a 402
  proof-of-work challenge answered with the X-PoW-Solution header) and by a semantic firewall (403
  sentinel_blocked), not by credentials. Trial execution is authenticated by a trial_nonce issued with the
  grant. Operator routes take an undocumented sandbox_token as a query or body field — "Body-field token (NOT
  Bearer) per the established convention" — and answer 401 {"detail":"Unauthorized"} without it. There are no
  API keys, no OAuth, no OIDC, no mTLS and no bearer tokens anywhere. The provider's own identity is a did:web
  DID with a published Ed25519 key.
schemes_declared: []
schemes_observed:
- id: buyer-did-assertion
  type: body-field identity assertion
  field: buyer_did (also subscriber_did as a query parameter on delivery/referral reads)
  format: 'did:web:<domain> (AP2NegotiateBody description: {"buyer_did":"did:web:..."})'
  applies_to: [ap2_negotiate_alias_api_ap2_negotiate_post, submit_intent_api_ap2_intent_post, checkout_api_ucp_checkout_post, ap2_dispute_file_api_ap2_dispute_post, post_trial_grant_api_ap2_trial_grant_post, get_subscription_delivery_api_subscriptions_delivery_get, get_referral_code_api_subscription_referral_code_get]
  verification: >-
    Not described. Nothing in the contract says the server resolves the DID document or checks a signature at
    negotiate time; what it describes is reputation scoring on the DID (Diplomat, FLAGGED state), ownership
    matching ("Buyer match enforced against the contract owner so rival agents cannot file disputes on other
    agents' contracts") and, for referral codes, "auth = proven active subscription for the supplied DID".
  privacy: 'Never echoed back — every response carries buyer_did_hash ("Rule #11").'
- id: buyer-signature
  type: body-field signature (opaque)
  field: buyer_signature
  applies_to: [ap2_sign_alias_api_ap2_sign_post, sign_cart_api_ap2_sign__intent_id__post]
  detail: '"The buyer_signature length is logged -- never the signature material itself." The signed message, algorithm and key are not specified; the card calls it "AP2 buyer_signature" under authentication.methods.'
- id: pow-challenge
  type: HTTP 402 proof-of-work challenge / response header
  header: X-PoW-Solution
  applies_to: [ap2_negotiate_alias_api_ap2_negotiate_post]
  detail: 'Issued only to FLAGGED buyers; "SHA-256 difficulty 4" per GET /api/publicist/manifest security.pow_challenge. Retry the same request with the solution in the header.'
- id: trial-nonce
  type: body-field one-time credential
  fields: [trial_id, trial_nonce]
  applies_to: [post_trial_execute_api_ap2_trial_execute_post]
  detail: '"Public (authenticated by trial_nonce)"; issued by post_trial_grant, one per DID, expires 24h.'
- id: operator-sandbox-token
  type: query/body-field token (operator only)
  field: sandbox_token
  applies_to: [get_trial_status_api_trial_status_get, get_discovery_registry_package_api_discovery_registry_package_get, list_scout_proposals_api_scout_proposals_get, get_advocate_disputes_api_advocate_disputes_get, get_settlement_records_api_settlement_records_get, get_outbound_targets_api_outbound_targets_get, post_settlement_confirm_api_settlement_confirm_post, update_harvest_threshold_config_harvest_threshold_post, update_credit_limit_config_credit_limit_post, 'and the other operator control-plane writes (emergency, config, scout, sentinel, strategist, diplomat, advocate, outbound)']
  observed: {url: 'GET https://api.merchant-0.com/api/discovery/registry-package', status: 401, body: '{"detail":"Unauthorized"}'}
  detail: Not a buyer credential and never issued to third parties. Recorded because the contract publishes these routes in the public document.
- id: x-payment-header
  type: header (declared, undocumented)
  header: X-Payment
  applies_to: [check_inventory_alias_api_ucp_inventory_check_get]
  detail: The x402 header name, declared optional on one read; an anonymous GET returned 200 with the catalog. No 402 PaymentRequirements was observed and no other route declares it.
- id: wise-webhook-signature
  type: inbound webhook signature verification (provider is the verifier)
  header: X-Signature-SHA256
  applies_to: [wise_webhook_receiver_api_webhooks_wise_post]
  detail: '"RSA-SHA256 signature verification against Wise''s PUBLISHED production public key (NO DB operations until this passes)"; always-200 contract. Documents how the provider authenticates Wise, not how callers authenticate to the provider.'
provider_identity:
  did: did:web:merchant-0.com
  did_document: https://merchant-0.com/.well-known/did.json
  verification_method: {id: 'did:web:merchant-0.com#key-1', type: Ed25519VerificationKey2020, publicKeyMultibase: z6MktCZfJjbzX4rGjqf8bz9zBmBehF5cyPeWiyDR5uZ6nSRc}
  purposes: [authentication, assertionMethod]
  note: The card's authentication.methods lists "DID Web" first. The proof capability returns a merchant_signature; the DID key above is the only published key a verifier could try against it.
oauth: {declared: false, discovery: {oauth_authorization_server: 404, openid_configuration: 404, oauth_protected_resource: 404}}
api_keys: {declared: false, issued: false}
mtls: {declared: false}
gaps:
- No securitySchemes in the contract, so every tooling-derived auth profile (SDK generators, gateways, this pipeline's own derive script) reads the API as unauthenticated.
- The signing scheme for buyer_signature is unspecified; an integrator cannot produce a valid signature from the published material.
- Public write operations (negotiate, dispute, trial-grant, intent, checkout) accept any buyer_did with no proof of control described.
- Operator routes are published in the same document as buyer routes with no security requirement marking them.

Work with this as data

Every security artifact 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 security posture

4 MCP tools reach this
  • find_securityBrowse and filter every security artifact 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 security artifact
curl "https://apis.io/api/v1/security/merchant-0-com-authentication"
All security posture
curl "https://apis.io/api/v1/security?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.