Attesto

Marketplace

Marketplace de connecteurs

L'Attesto Marketplace sur https://marketplace.attesto.eu est le catalogue public des producteurs de preuve validés. Les visiteurs publics peuvent parcourir les connector cards. Tenant acquisition, install, update, revoke et artifact download exigent une session dashboard tenant authentifiée. Publisher signup, publisher profile management et connector submission utilisent un compte developer marketplace-only séparé. Attesto review et publication sont des processus internes privés et ne sont pas exposés aux visiteurs publics ni aux marketplace developers.

Marketplace model

Un marketplace item est un connector asset validé. Le catalogue stocke asset metadata, current version, manifest hash, artifact hash, validation result, entitlement state, install state et marketplace evidence events. Le marketplace n'exécute pas le code connecteur dans le navigateur et n'expose pas les connector secrets.

ObjectSignification
assetUn listing de connecteur comme GitHub, GitLab ou S3/R2 object commitments.
versionUn connector manifest validé avec manifest et artifact hashes.
entitlementLe droit du tenant de télécharger ou installer une version.
installUn installation record tenant-scoped pour la version sélectionnée.
evidence eventUne marketplace receipt canonique pour acquisition, installation, submission ou validation.

Parcourir le catalogue public

Le catalogue public expose uniquement des assets publics validés. Il peut être consulté sans tenant session :

GET https://marketplace.attesto.eu/v1/marketplace/categories
GET https://marketplace.attesto.eu/v1/marketplace/items?category=devops
GET https://marketplace.attesto.eu/v1/marketplace/items/attesto-github-repository-reference

Chaque card affiche evidence score, validation state, supported languages, category, current version et lien de documentation. Les visiteurs publics voient une action sign-in au lieu des commandes acquire/install/download.

L'Evidence Score n'est pas une note marketing. C'est une sortie déterministe de attesto-marketplace-validation-v1 : le même manifest, la même source reference et la même validator version produisent le même score. Le score est la somme de critères explicites pour receipts, offline verification, secret scanning, dependency scanning, witness compatibility, documentation, repository reference, Proofstream capability, source reference et langues Attesto supportées. Le validation report conserve formula, criteria, components, total et max afin que operators et publishers puissent reproduire pourquoi un connecteur a reçu son tier.

Tenant acquisition and install lifecycle

Les tenant users avec rôle owner, admin ou developer peuvent acquérir et installer un connecteur first-party gratuit. Le navigateur doit contenir le tenant session cookie et le CSRF token lisible. Les production cookies sont scoped sur .attesto.eu, donc une session créée sur dashboard.attesto.eu fonctionne aussi sur marketplace.attesto.eu.

POST /v1/marketplace/items/attesto-github-repository-reference/acquire
X-CSRF-Token: <attesto_csrf cookie>

POST /v1/marketplace/items/attesto-github-repository-reference/install
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "configRef": "tenant-managed-github-installation"
}

Les assets gratuits installés peuvent être mis à jour vers la version validée actuelle ou révoqués par un owner/admin. Revoke désactive à la fois l'entitlement et le tenant install ; artifact download échoue jusqu'à ce que le tenant acquière et installe à nouveau l'asset.

POST /v1/marketplace/items/attesto-github-repository-reference/install/update
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "configRef": "tenant-managed-github-installation-v2"
}

POST /v1/marketplace/items/attesto-github-repository-reference/revoke
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "reason": "tenant_request"
}

L'endpoint artifact renvoie le connector manifest uniquement lorsque le tenant dispose d'un entitlement actif :

GET /v1/marketplace/items/attesto-github-repository-reference/artifact

Connector manifest

Un manifest décrit le connecteur sans inclure de secrets. C'est l'objet que Python, TypeScript, Go, CLI, backend validation et le marketplace valident tous contre le même contrat.

{
  "schemaVersion": "attesto.connector.v2",
  "slug": "attesto-github-repository-reference",
  "name": "GitHub Repository Reference",
  "version": "1.0.0",
  "assetType": "connector",
  "category": "devops",
  "summary": "Creates Proofstream references for repository changes.",
  "description": "Records repository change references as verifiable Attesto events.",
  "publisher": {
    "slug": "attesto",
    "name": "Attesto"
  },
  "repository": {
    "url": "https://git.example.com/attesto/connectors/github"
  },
  "documentation": {
    "url": "https://docs.attesto.eu/manuals/connectors.html#github"
  },
  "capabilities": ["proofstream", "offline-verification"],
  "evidence": {
    "receipts": true,
    "offlineVerification": true,
    "witnessCompatible": true
  },
  "security": {
    "secretScan": true,
    "dependencyScan": true
  },
  "supportedLanguages": ["en", "nl", "de", "fr", "es", "pl", "it"],
  "provider": {
    "id": "github",
    "name": "GitHub",
    "websiteUrl": "https://github.com"
  },
  "auth": {
    "mode": "signed-webhook",
    "scopes": ["repo", "push-events"]
  },
  "sync": {
    "modes": ["webhook"],
    "supportsReplay": true,
    "rateLimitPolicy": "provider-default"
  },
  "eventTypes": ["repository.push", "repository.merge_request"],
  "sourceTime": {
    "required": true,
    "timezonePolicy": "source-offset-required"
  },
  "configSchema": { "type": "object", "properties": {} },
  "secretSchema": { "type": "object", "properties": {} },
  "diagnostics": {
    "providerAuthStatus": true,
    "testConnection": true,
    "syncLag": true,
    "replayConflictCheck": true,
    "revocationCheck": true
  },
  "runtime": {
    "officialConnectorKit": true,
    "sdkSurfaces": ["python", "typescript", "go", "cli"],
    "requiredMethods": [
      "metadata",
      "validateConfig",
      "testConnection",
      "sync",
      "handleWebhook",
      "emitProofstreamEvent",
      "diagnostics",
      "revoke"
    ],
    "canary": {
      "status": "green",
      "ref": "release/attesto-2.0-connector-assurance-readiness/result.json"
    }
  },
  "installRequirements": {
    "tenantLoginRequired": true,
    "entitlementRequired": true
  },
  "changelog": [
    {
      "version": "1.0.0",
      "date": "2026-06-09",
      "changes": ["Validated first-party connector release."]
    }
  ]
}

Les champs requis sont contrôlés avant qu'un asset puisse être accepté. Le backend validator échoue les hidden assets sous un Evidence Score de 50; Attesto peut toujours appliquer une release policy privée plus stricte pour les connectors first-party ou partner. Un score est un validation output dérivé de l'evidence, pas un adoption badge ni un jugement marketing.

Marketplace CLI publishing flow

Publisher automation peut utiliser l'Attesto CLI pour le même manifest contract que le backend et les connector kits. La CLI valide le manifest localement avant d'envoyer quoi que ce soit à Attesto. Submission utilise un marketplace publisher bearer token. La documentation publique couvre uniquement le publisher path; Attesto review et publication restent des processus internes privés. Les commandes publisher n'impriment jamais stored tokens, Stripe identifiers, connector secrets ou raw customer payloads.

attesto --json marketplace init \
  --output attesto.connector.json \
  --slug acme-risk-connector \
  --name "ACME Risk Connector" \
  --version 1.0.0 \
  --category ai-governance \
  --summary "Produces Attesto evidence for ACME risk decisions." \
  --description "Produces verifiable Proofstream events for ACME risk decisions." \
  --publisher-slug acme \
  --publisher-name ACME \
  --repository-url https://git.example.com/acme/risk-connector \
  --docs-url https://docs.example.com/acme/risk-connector \
  --provider-url https://example.com/acme \
  --auth-mode oauth2 \
  --auth-scopes risk.read,risk.events \
  --sync-modes polling,webhook \
  --event-types risk.decision.created,risk.decision.updated \
  --canary-ref release/acme-risk-connector/canary-result.json \
  --capabilities proofstream,offline-verification

attesto --json marketplace validate \
  --manifest-file attesto.connector.json

attesto --json --token-env ATTESTO_MARKETPLACE_TOKEN marketplace submit \
  --manifest-file attesto.connector.json \
  --source-ref https://git.example.com/acme/risk-connector/releases/v1.0.0 \
  --visibility public \
  --pricing-model free

Après submission, l'asset reste private pending Attesto review. Attesto examine validation evidence, source reference, publisher identity, pricing et release provenance en privé. Les docs publiques s'arrêtent volontairement à la developer submission boundary.

Publisher validation

Les marketplace developer accounts sont marketplace-only. Ils peuvent s'inscrire et se connecter sur marketplace.attesto.eu, gérer un publisher profile, choisir un developer tier, soumettre des connector assets gratuits pour private Attesto review et démarrer le vrai developer billing flow pour paid publishing. Ils ne peuvent pas se connecter à dashboard.attesto.eu ; les tenant users normaux ont toujours besoin d'un compte tenant Attesto normal pour le dashboard.

POST /v1/marketplace/auth/signup
Content-Type: application/json

{
  "displayName": "ACME Evidence Labs",
  "name": "Publisher Operator",
  "email": "publisher@example.com",
  "password": "<operator-chosen password>"
}

POST /v1/marketplace/auth/login
Content-Type: application/json

{
  "email": "publisher@example.com",
  "password": "<operator-chosen password>"
}

GET /v1/marketplace/auth/me

Créer ou mettre à jour un publisher profile enregistre marketplace evidence avant la soumission d'assets. Un profile seul ne publie jamais un asset : les free submissions sont private pending review, et les paid submissions exigent un paid developer tier actif plus Stripe Connect readiness. Cela empêche le marketplace public de devenir une surface d'upload ouverte.

POST /v1/marketplace/publisher/profile
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "displayName": "Attesto Official Connector Team"
}

GET /v1/marketplace/publisher/profile

PATCH /v1/marketplace/publisher/profile
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "displayName": "Attesto Business Connectors"
}

Les developer publisher rights sont mis à niveau in-place. Le publisher garde le même compte marketplace-only et le même publisher profile. Les Community developers peuvent soumettre des assets gratuits pour private review. Verified Developer, Professional Publisher et Marketplace Partner plans utilisent un 14-day Stripe trial et déverrouillent paid connector submission seulement après confirmation Stripe de la subscription. Paid listing publication exige aussi Stripe Connect payout readiness. Les URLs checkout et portal sont créées côté serveur via l'encrypted Stripe integration store.

GET /v1/marketplace/developer-tiers

[
  {
    "tier": "community",
    "label": "Free Developer",
    "monthlyCents": 0,
    "annualCents": 0,
    "currency": "EUR",
    "checkoutRequired": false,
    "submissionEnabledWhenActive": false,
    "description": "Marketplace-only developer identity for profile management, manifest preparation, documentation review, and free connector submission into private Attesto review.",
    "requirements": [
      "marketplace publisher profile",
      "private Attesto review before public listing",
      "paid developer publisher tier before paid connector submission"
    ],
    "trialDays": 0
  },
  {
    "tier": "premium",
    "label": "Verified Developer",
    "monthlyCents": 1900,
    "annualCents": 19000,
    "currency": "EUR",
    "checkoutRequired": true,
    "submissionEnabledWhenActive": true,
    "description": "Paid developer publishing tier with a 14-day Stripe trial.",
    "requirements": [
      "active developer subscription",
      "connector validation passes",
      "private Attesto review before public listing"
    ],
    "trialDays": 14
  }
]

GET /v1/marketplace/publisher/billing-state

{
  "publisher": {
    "tier": "premium",
    "developerSubscriptionState": "active",
    "payoutState": "ready",
    "commercialEnabled": true
  },
  "checkoutAvailable": true,
  "billingPortalAvailable": true,
  "canSubmitAssets": true,
  "developerSignupRequired": false,
  "supportedTiers": [
    {"tier": "premium", "label": "Verified Developer", "monthlyCents": 1900, "annualCents": 19000, "currency": "EUR"},
    {"tier": "professional", "label": "Professional Publisher", "monthlyCents": 4900, "annualCents": 49000, "currency": "EUR"},
    {"tier": "partner", "label": "Marketplace Partner", "monthlyCents": 9900, "annualCents": 99000, "currency": "EUR"}
  ],
  "submissionRequirements": [],
  "commercialRequirements": [
    "active developer subscription",
    "Stripe Connect payout readiness"
  ],
  "gracePeriodDays": 14
}

POST /v1/marketplace/publisher/upgrade
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "tier": "premium",
  "interval": "month",
  "successUrl": "https://marketplace.attesto.eu/?publisher=upgrade-success",
  "cancelUrl": "https://marketplace.attesto.eu/?publisher=upgrade-cancel"
}

POST /v1/marketplace/publisher/billing-portal
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "returnUrl": "https://marketplace.attesto.eu/?publisher=billing-return"
}

Les publishers qui veulent vendre des paid assets doivent compléter Stripe Connect payout onboarding après activation du developer account. L'API utilise la configuration Stripe chiffrée côté serveur d'Attesto et retourne uniquement une Stripe-hosted onboarding URL. Elle ne retourne pas de Stripe secret keys, connected-account IDs ou payout credentials au frontend.

POST /v1/marketplace/publisher/payout/onboarding
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "returnUrl": "https://marketplace.attesto.eu/?publisher=payout-return",
  "refreshUrl": "https://marketplace.attesto.eu/?publisher=payout-refresh",
  "country": "NL"
}

POST /v1/marketplace/publisher/payout/status

Paid connector acquisition utilise Stripe Checkout avec Stripe Connect. Le backend crée la Checkout Session, applique l'Attesto application fee, route la part developer vers le connected account et attend le verified Stripe webhook avant de créer le tenant entitlement et la marketplace ledger entry.

POST /v1/marketplace/items/{slug}/acquire
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "successUrl": "https://marketplace.attesto.eu/?marketplace=checkout-success",
  "cancelUrl": "https://marketplace.attesto.eu/?marketplace=checkout-cancel"
}

Webhook result:
marketplace_purchase_created
marketplace_entitlement_created
marketplace_revenue_split_recorded

Les notifications Stripe refund et payout sont aussi traitées par l'endpoint verified webhook. Un full refund ferme l'entitlement, révoque les installs actifs du connecteur, bloque artifact download et enregistre refund et entitlement-revocation evidence. Les payout events réconcilient les eligible publisher ledger entries et enregistrent payout evidence sans exposer Stripe object identifiers ou provider payloads au navigateur.

Webhook result for full refund:
marketplace_refund_recorded
marketplace_entitlement_revoked

Webhook result for payout:
developer_payout_completed

Webhook result for failed payout/refund:
developer_payout_failed
marketplace_refund_failed

Les developer publishers actifs peuvent ensuite soumettre des business connectors via la marketplace publisher surface. L'action submit valide le manifest, enregistre un validation run, crée un private pending-review asset, stocke les version hashes et écrit marketplace evidence. Même si visibility est demandé comme public, le listing reste caché jusqu'à ce que la private Attesto review et la publication policy soient terminées. Les tenants non qualifiés reçoivent une réponse fail-closed avant que manifest validation ne s'exécute.

POST /v1/marketplace/publisher/assets
Content-Type: application/json
X-CSRF-Token: <attesto_csrf cookie>

{
  "sourceRef": "https://example.com/repository/connector-release",
  "visibility": "private",
  "pricingModel": "free",
  "manifest": { "...": "attesto.connector.v2 manifest" }
}

Attesto review et publication sont des processus internes privés. Ils écrivent marketplace evidence, mais les endpoints et procédures internes ne font pas partie de la documentation publique developer. Le catalogue public ne retourne que des versions approved et non-revoked.

La source reference doit pointer vers la vraie release source du connecteur. Secrets, private keys, API tokens et customer payloads ne doivent jamais être placés dans les connector manifests.

Marketplace evidence events

Marketplace publisher profile create/update, acquisition, install, install update, entitlement revoke, paid purchase, refund, payout, publisher submission et validation/review actions écrivent une marketplace evidence canonique. Le receipt hash est dérivé de l'evidence envelope canonique et du payload hash ; le receipt record stocke tenant, actor, subject, timestamp et sanitized payload pour les vues tenant audit. Cela donne aux operators un audit trail déterministe indiquant qui a changé publisher identity et qui a acquired, installed, updated, reviewed, published, refunded, paid out ou revoked quelle connector version.

GET /v1/marketplace/evidence/<receipt-id-or-receipt-hash>

Security boundaries