Certification

Runs automatically on every submission. Pass → operator review queue. Fail → a structured report that tells you exactly what to fix.

The checks

check idfails when
manifest.schemathe manifest doesn't parse against the package schema (every issue listed)
permissions.knowna requested scope isn't in the platform scope list
permissions.declaredprovisioned resources aren't covered by declared scopes
custom_objects.*duplicate field names · formula fields without formulas · references without targets · picklists without options
workflows.*unknown node types · unknown trigger events · ≠ 1 trigger · dangling connections (else-branches included)
webhooks.* / ui.*non-https URLs, localhost/private-network/metadata targets
connection.oauth2OAuth connectors missing authorization/token URLs
pricing.paidpaid model without a monthly price

Warnings (don't block, but reviewers read them)

warningmeaning
connection.sync.cursorinbound sync with no cursor — full re-pulls don't scale
connection.sync.rate-limitno declared upstream rate limit — the platform can't pace your syncs
permissions.least-privilegescopes nothing in the package uses
listing.descriptiondescription under 40 chars
package.substancenothing to install — listing-only package

Run it any time

curl -s -X POST https://app.ivorycomcrm.com/api/marketplace/certify \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"manifest": { … }}'
# → { "passed": true, "checks": [ { "id", "title", "level", "detail?" } … ] }

The SDK's certify-cli and the console's Certify button call this same endpoint — one suite, three doors.