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
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.
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.