The API

Issue a passport on order, in one call.

Wire Veritura into your fulfillment, Shopify, or pharmacy system. The cleared lot is the gate, so an uncleared lot can never publish a passport.

The model

Four objects, and the rules between them.

Read this once and the endpoints below explain themselves.

  • Lot

    The batch a document set belongs to. A lot clears on its whole SET of documents for that subject and dosage form, not on the newest file, which is why a single-panel certificate cannot clear one on its own. Everything else hangs off the lot.

  • Order

    One customer's purchase, written against a lot and carrying your own order reference. A customer reference that reads like patient information is rejected outright rather than stored and scrubbed later.

  • Policy

    Your documentation rules: a preset, eleven named toggles and one threshold. The version in force is pinned inside every decision, so a decision replays to the same answer years later.

  • Passport

    The released, order-bound proof. It mints only from a cleared lot and its lot binding is permanent, which is the only reason a recall published months later can still reach a record already issued.

Start here

One path, in this order.

Start on a test key. Everything below works in sandbox with synthetic records, and nothing you do there can publish a production passport.

  1. 01

    Take a test key

    Create a vk_test_ key in Settings. No call and no approval queue, on a Facility or Platform workspace: key creation checks the API entitlement before it looks at test or live, so a workspace without it is refused either way. Sandbox records answer with their environment attached so a test result can never be mistaken for a production one downstream.

  2. 02

    Check a document

    POST the document to the check endpoint and read the four lanes back. Each lane reports whether it ran, did not apply, or could not verify, and a lane that produced no result never reads as one that passed.

  3. 03

    Ask the gate

    POST the order to ClearGate and read Allow, Review, or Hold with the reasons that fired and your policy version pinned inside the decision.

  4. 04

    Issue the passport

    POST to the passport endpoint with the lot and an order reference. An uncleared lot answers 409 with the reason, never a passport, which is the whole point of the release floor.

  5. 05

    Subscribe to the signal

    Point a webhook at your endpoint and verify the HMAC signature on every delivery. A recall matching one of your lots arrives here, months after the paperwork was filed.

What this API is

A documentation API, and the whole public surface.

  • The endpoint list below is the complete key-authed /v1 surface. The four that carry a worked request, response, and error table on this page are the integration path; the rest are listed with their contract summarised. Workspace administration, billing, and the operator console are not exposed and are not documented here.
  • Every response describes DOCUMENTATION. Nothing on this surface asserts that a product is safe, effective, authentic, legal, or approved, and no endpoint returns a product judgment.
  • Sandbox and production are separated by key prefix and every record answers with the environment it was created in. A sandbox passport can never be presented as a released one.

Endpoints

Nine routes, one engine behind them.

The same checks that run in the dashboard, addressable from your own system, returning the same records. The first four are documented in depth below; the rest carry the same key, the same entitlement, and the same environment rule.

POST/v1/passports
Issue from a cleared lot with an order reference.
POST/v1/cleargate
One decision per order against the policy you set.
POST/v1/eligibility
Allow, Review, or Hold on whether a substance is eligible to compound for a facility type against the current FDA lists.
POST/v1/check
The document check, as an embeddable call.
POST/v1/seal-batches
Mint up to 500 serialized vial seals for one lot, optionally bound one-to-one to your own order numbers. Same plan entitlement as sealing from the dashboard.
GET/v1/seal-batches/{id}/labels
Fetch the labels for a minted batch as format=avery, thermal, or zpl. Avery and thermal return a PDF; zpl returns raw printer text for a direct feed.
GET/v1/network/directory
The public verified-source directory, ordered by the published documentation-coverage grade. Read-only, documented status only, never a recommendation.
GET/v1/network/source
One source's portable grade and its trust signals, by source id. Read-only.
POST/v1/network/route
A ship-to-state routing decision: Allow, Review, or Hold against the eligibility rules, for platforms embedding the network in their own ordering flow.

Every /v1 call authenticates with a bearer key in the Authorization header, not a session cookie. Test keys resolve to the sandbox environment and live keys to production, and every record the API returns carries the environment it was created in.

The cleared lot is the gate. A lot that is not cleared, that carries a ClearGate hold, or that is exposed to a recall signal cannot mint a passport through the API any more than it can from the dashboard, and the gate is the same predicate in both places.

POST /v1/passports

One order in, one verifiable record out.

Order-level proof tied to its exact lot, COA, supplier, reviewer, and a verify link or QR, minted from your own system at the moment the order is placed.

How a passport comes to exist.

The same sequence whether the order was written in the workspace or posted to this endpoint. The call is one step of it, not the whole of it.

  1. Operator

    An order ships, from the workspace or from the API.

    The order is written with its lot number. The lot is resolved by number within the account and stamped as an exact reference. An ambiguous lot number matching several lots is refused, never guessed.

    Record state: Passport record created
  2. Engine

    Release is attempted.

    The floor is checked: the lot must exist, be cleared, carry no ClearGate hold and no recall signal, and satisfy any human-review or ClearGate-Allow requirement the policy sets.

    Record state: Release authorized, or a 409 naming the unmet requirement
  3. Engine

    The order arrived before its lot cleared.

    The order parks rather than releasing on its own say-so. Nothing is lost and nothing is published.

    Record state: source_review
  4. Your policy

    The lot clears: the source is named, the missing document lands, the receiving gate passes.

    When the account's policy authorizes unattended release, the parked order releases through the same sanctioned path, stamped with the exact policy id and version that authorized it and the lot evidence it rested on.

    Record state: released, with releasedBy naming the policy
  5. Patient or buyer

    The buyer or patient opens the shared record.

    The public page prints the read, the lab and the date. It states documentation completeness in plain words and no number.

    Record state: Published at /verify/<publicShareId>
  6. Engine

    A passport is issued.

    A passport.issued event fires to any subscribed endpoint, signed with an HMAC over the body. Internal, loopback, link-local and private targets are refused outright.

    Record state: Delivered, or the endpoint was refused

An Evidence Passport publishes what the documentation for a lot states and where it came from. It is not a certificate of quality, an approval, or a statement about the medicine.

Unattended release is bounded per sweep and per account and bills through the same idempotent ledger, so a backlog of parked orders clearing at once cannot produce a wave of duplicate charges.

curl -X POST https://veritura.co/v1/passports \
  -H "Authorization: Bearer vk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"lot_id":"LOT-...","order_id":"ORD-1042"}'

# 200 -> a released, verifiable passport bound to the order
# 409 -> lot_pending_review (the lot is not cleared yet)
HTTP/1.1 200 OK

{
  "ok": true,
  "reused": false,
  "passport": {
    "id": "PASS-...",
    "environment": "production",
    "orderId": "ORD-1042",
    "supplierName": "...",
    "productName": "...",
    "lotNumber": "...",
    "coaId": "...",
    "reportId": "...",
    "reviewer": "Automated clear-gate",
    "releaseGate": "Released by account policy (API mint)",
    "status": "released",
    "publicShareId": "...",
    "lookupCode": "...",
    "evidenceRows": [...],
    "auditTrail": [...]
  }
}

# Abridged. The same record carries the supplier qualification
# snapshot, the verification links, and the output standard.
  • Address the lot two ways

    Send lot_id for an explicit match, or send supplier plus product plus lot and the call resolves the logged lot by identity. Neither one matching answers 404 with the same instruction: provide lot_id, or supplier plus product plus lot to match a logged lot.

  • order_id or customer_ref is required

    A passport with nothing to bind to is not a passport. One of the two must be present, and the reference you send is echoed on the record and on the page the buyer opens.

  • Opaque references only

    customer_ref is screened before anything is written. A reference that reads as patient information is refused with phi_in_customer_ref and the instruction to use an order or PO number instead. There is no field on this call that carries a patient, a prescriber, or clinical content.

  • A repeat is not a second passport

    The same order and lot called twice returns the record that already exists with reused set to true. A sandbox replay of an order that already holds a production passport returns that production record untouched, so a test run can never downgrade a customer's real one.

The five ends past the mint gate.

Two of them are a 200. A 409 is the gate reporting, not the call failing, and the body names which gate refused it alongside the lot's own state.

What you send

One call

A bearer key, and a lot addressed either by lot_id or by supplier plus product plus lot. order_id or customer_ref is required, and the reference is screened before anything is written. The bucket that admits the call is the API key, never the address it came from.

What runs

The mint gate

The lot must be cleared, carry no ClearGate hold, and carry no live recall signal. A recall blocks on its own, independent of every other state on the record. Whatever your own policy adds is then checked on top.

One of these

  • Record state: 200 released

    The lot passed the gate and no passport exists yet for this order and lot. The record is written, billed once, and a passport.issued event fires to every subscribed endpoint.

    status: released

  • Record state: 200 reused

    The same order and lot were sent before. The existing record comes back with reused set to true and no second event fires. A sandbox replay of an order that already holds a production passport returns that production record untouched.

    reused: true

  • Record state: 409 lot_pending_review

    The lot is not cleared. The body returns the lot's own current state next to the code, so your system can tell a lot still awaiting diligence from one a signal has flagged.

    state: pending_review, or flagged

  • Record state: 409 cleargate_hold

    The lot is otherwise cleared but carries a ClearGate hold. Closing the reason that set the hold lifts it on the next decision, and the held decision stays in the log exactly as it was written.

    state: cleared

  • Record state: 409 cleargate_required

    Your own policy asks for a ClearGate Allow on the lot before any passport issues. Calling the mint directly does not skip the rail.

    state: cleared

A call can also answer 404 when no lot matches, 400 on a missing order reference or on PHI in the customer ref, 401, and 429. The full table is below.

HTTP/1.1 409 Conflict

{
  "error": "This lot is not cleared.",
  "code": "lot_pending_review",
  "state": "pending_review"
}

A 409 is the gate reporting, not the call failing. The body names which gate: lot_pending_review for a lot that is not cleared, cleargate_hold for a lot carrying a hold, and cleargate_required when your own policy asks for a ClearGate Allow before any passport issues.

Sample workspace · not a live account

Evidence Passport

Semaglutide (base) API

V-SBX-00013

Evidence posture

Evidence posture: Clear

The document set met the configured policy. It describes the paperwork, not the medicine.

Certificate of analysis

Source-confirmed

The issuing laboratory confirmed issuance through the recorded verification route.

Order
PO-DEMO-0413
Lot
LOT-7741-A
Supplier
Aurora Pharma Supply
Quantity
250 g
Received
July 22, 2026
Released
July 23, 2026
Passport issued
July 23, 2026
Methodology
v1.0 · April 30, 2026

Documents on file

6

  • Certificate of analysis

    COA-7741-A.pdf · Issuing laboratory confirmed issuance through the recorded route

    Source-confirmed
  • Certificate of conformance

    CoC-7741.pdf · Required identity, lot, and date fields present

    Veritura evaluated
  • Safety data sheet

    SDS-SEMA-04.pdf · Current revision on file

    Veritura evaluated
  • GMP certificate

    GMP-AUR-2026.pdf · Supplied by the operator

    Operator attested
  • Receiving inspection

    Recorded in workspace · Container and label checked at receipt

    Operator attested
  • Shipment label

    LBL-7741-A.jpg · Lot identifier matches the certificate of analysis

    Veritura evaluated

What this record does not establish

  • Documentation diligence only. No product was tested and no supplier was approved.
  • Absence of a public-source match is not proof of absence.
  • Produced under methodology v1.0, April 30, 2026.

The record the call returns, as the page a buyer opens. Posture and evidence origin are shown under separate labels, because they answer different questions.

POST /v1/cleargate

One decision per order, against the policy you set.

Call one endpoint at order time and get one decision read from the supplier's qualification file and the lot. You set the bar. We keep the record.

ClearGate: Allow
Meets your policy
ClearGate: Review
Needs review
ClearGate: Hold
Does not meet policy

A ClearGate decision always means the documentation meets your policy. It never means Veritura approves the supplier.

curl -X POST https://veritura.co/v1/cleargate \
  -H "Authorization: Bearer vk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"supplier":"...","product":"...","lot":"...","order_id":"ORD-1042"}'
HTTP/1.1 200 OK

{
  "ok": true,
  "decision": {
    "decisionId": "cgd_...",
    "decision": "review",
    "label": "Needs review",
    "policy": { "id": "pol_...", "version": 3, "preset": "standard" },
    "supplier": "...",
    "lotId": "lot_...",
    "orderRef": "ORD-1042",
    "reasons": [
      { "level": "review",
        "code": "lot_pending",
        "detail": "The lot is pending review." }
    ],
    "evidence": {...},
    "environment": "production",
    "timestamp": "<ISO 8601>",
    "signature": "sha256=..."
  }
}
  • Every reason names the rule that fired

    reasons is a list, not a score. Each entry carries the level that produced it, the policy rule's own code, and the sentence a person reads. Hold beats review, and review beats allow.

  • The policy version is pinned into the record

    The decision stores the policy id, its version, and the preset it resolved from, so a decision made last quarter can be read against the policy that actually governed it rather than today's.

  • A tamper-evident signed decision log

    Each decision is HMAC-signed and appended to a per-account hash chain that binds the previous decision's hash to this one's bytes. Altering any past decision breaks every later link.

  • Presets, then bounded custom rules

    Strict, Standard, and Lenient are the presets. Custom policy is a bounded set of toggles and thresholds mapped to fields ClearGate actually evaluates, not a free-form rule language.

All three presets re-run the gate automatically when new evidence lands. Standard and Lenient also release the Passport on a policy Allow; Strict keeps the release with a person.

Eligibility and the check

The substance rail and the document rail.

ClearGate answers a question about a supplier and a lot. These two answer the other questions an order raises before it is placed.

POST /v1/eligibility

Returns an Allow, Review, or Hold on whether a substance is eligible to compound for a facility type against the current FDA lists, for every compounded medicine: hormones, sterile injectables, GLP-1s, peptides.

curl -X POST https://veritura.co/v1/eligibility \
  -H "Authorization: Bearer vk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"substance":"...","facility_type":"503a","order_id":"ORD-1042"}'
  • facility_type selects the lists the substance is evaluated against: 503a or 503b.
  • The decision comes back in the same shape ClearGate uses, with its own decisionId prefix, its pinned policy, its reasons, and its signature, on the same hash-chained log.
  • The live openFDA shortage feed and the NDC directory are checked in parallel and returned alongside the decision, so the record reflects today's lists rather than a snapshot.
  • A substance resolved live by name match alone can never come back Allow. It is capped at Review, with the exact thing to confirm named in the reasons.

POST /v1/check

The document check, as an embeddable call. Send the document as base64 and get the structured read back: the certificate, the lab, the specs, and the source.

curl -X POST https://veritura.co/v1/check \
  -H "Authorization: Bearer vk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"document":"<base64>","file_name":"coa.pdf",
       "supplier":"...","customer_ref":"PO-7231"}'
HTTP/1.1 200 OK

{
  "ok": true,
  "checkId": "VTR-CHK-...",
  "environment": "production",
  "customerRef": "PO-7231",
  "document": { "band": "...", "bandLabel": "...", "score": 0,
                "docType": "...", "dosageForm": "...",
                "unreadable": false, "identity": {...},
                "read": [...], "findings": [...] },
  "labVerification":     {...},
  "specChecks":          {...},
  "predictiveRead":      {...},
  "fileForensics":       {...},
  "syntheticDocument":   {...},
  "templateConsistency": {...},
  "containerPanel":      null,
  "nextActions":         [...],
  "correctedCoaRequest": {...},
  "source":              {...},
  "note": "Documentation completeness and consistency only..."
}
  • The response shape is a contract. Sections are added, never repurposed: an integration that reads document.band today reads the same thing after the next depth module lands.
  • PHI-free by construction. The request takes a document and an optional supplier name; no field on either side carries a patient, a prescriber, or an order's clinical content. customer_ref is echoed back verbatim as an opaque correlation string.
  • containerPanel is null on any document that is not a container or component certificate, which is most of them. On a drug COA that null is the correct shape, never a gap.
  • labVerification.confirmed is always false. Static logic never confirms a document; only the issuing lab's portal or its recorded reply does, and every predictive claim carries its own confidence value.
  • Documents are capped at 8 MB and a document that cannot be read answers 422 rather than guessing at it.
See every check the engine runs

Operate safely

What happens under load, on a retry, and on a bad day.

The answers that decide whether your first incident is a page or a shrug.

  • Retrying a passport is safe

    Issuing against a lot that already has a passport returns the existing record with reused set to true, rather than minting a second one. A timeout you did not see the response to can be retried without creating a duplicate.

  • The rate-limit bucket is your address, then the route

    On the five call-heavy routes the key narrows it further, so two keys from one address get their own allowance there. On eligibility and the three network routes it does not, so two keys behind one egress address share that route's bucket. Plan for the shared case if you call from fixed egress, and expect 429 with Retry-After at the ceiling.

  • A lot resolves two ways

    Pass lot_id when you have it, or supplier plus product plus lot to match a lot you already logged. Neither matching answers 404 with the reason, never a guess.

  • Test and live cannot mix

    A vk_test_ key resolves to sandbox and a vk_live_ key to production, and every record answers with the environment it was created in. A sandbox passport can never be presented downstream as a released one.

Rate limits, per API key
EndpointLimit
POST /v1/passports120 requests per minute
POST /v1/cleargate120 requests per minute
POST /v1/eligibility120 requests per minute
POST /v1/check60 requests per minute
POST /v1/seal-batches60 requests per minute
GET /v1/seal-batches/{id}/labels60 requests per minute
GET /v1/network/source240 requests per minute
GET /v1/network/directory120 requests per minute
POST /v1/network/route240 requests per minute

In depth

POST /v1/seal-batches

Mint a batch of serialized seal labels against a lot, from 1 to 500 at a time. Serials come back in the VS-XXXX-XXXX shape, collision-checked against every serial already issued, and the mint response carries the labels URL for the batch. Fetch it as format=avery or thermal for a PDF, or format=zpl for raw printer text you can feed a 203dpi thermal printer directly.

Seal minting follows the same entitlement ladder as the workspace: demo lots are free, a lot with a released production passport seals without limit, a paid workspace has a metered monthly allowance for non-passported lots, and anything else answers 402.

Errors

What each status actually means.

The gate refusing an order and the request being malformed are different events, and they never share a status.

Every status and machine code the /v1 endpoints return, and what each one means.
StatusCodeMeaning
400not setA required input is missing. Passports need order_id or customer_ref; ClearGate needs a supplier, or a lot_id; eligibility needs a substance name; the check needs the document as base64.
400phi_in_customer_refThe reference you sent reads as patient information. Send an opaque reference, an order or PO number, and never patient information.
401not setNo usable key. The header must be Authorization: Bearer vk_live_... or vk_test_...
404not setNo matching lot. Provide lot_id, or supplier plus product plus lot to match a logged lot.
409lot_pending_reviewThe lot is not cleared yet. The body returns the lot's current state with it.
409cleargate_holdThe lot carries a ClearGate hold, so it cannot mint until the hold lifts.
409cleargate_requiredYour own policy requires a ClearGate Allow on the lot before a passport can be issued. The rail cannot be skipped by calling the mint directly.
413not setThe document exceeds the 8 MB maximum on POST /v1/check.
422not setThe document could not be read. The check declines rather than returning a read it cannot stand behind.
429concurrency_limitedToo many checks in flight for this key, or the service is at capacity. The body carries retryAfterSeconds and the response carries a Retry-After header. Retry and nothing is lost.
429not setThe key's request bucket is exhausted, or its daily document-read allowance is used up.

Rate limiting is per calling address and per route, and on POST /v1/check, /v1/passports, /v1/seal-batches, /v1/cleargate and the seal-label fetch the key narrows the bucket further. On /v1/eligibility and the three network routes it does not, so two keys behind one egress address share that route's allowance. The per-route ceilings are published in the reliability table above.

The concurrency guard is taken before the request body is parsed, so a burst past the ceiling is shed for the cost of reading a header instead of building an invisible queue behind it.

Keys and environments

No sales call, no approval queue.

Both key types are self-serve from Settings on a Facility or Platform workspace, and neither one is free. Test keys run in sandbox; live keys issue real production passports.

  • Two keys, two environments

    A vk_test_ key resolves to sandbox and a vk_live_ key to production. Every record answers with the environment it was created in, so a sandbox result can never be mistaken for a production one downstream.

  • The secret is shown once, and revocation is instant

    A key's secret is displayed at creation and never again. Rotate a key by creating a new one and revoking the old, which is a two-step you can do without talking to anyone, and a revoked key stops working immediately.

  • Two gates, and a test key clears neither for free

    Key creation checks the API entitlement before it looks at the mode, so a workspace without it is refused for a test key on exactly the same terms as for a live one. A live key is then checked a second time for a production workspace, so a workspace not yet set up for production cannot issue a billable passport by accident.

  • Sandbox first

    Sandbox records are non-billable, so an integration can be built end to end, including the webhook path, before a single production passport exists. The key itself comes with the plan; the sandbox records it writes cost nothing.

The /v1 API, its keys (test and live), and its signed webhooks are part of the Facility plan at $399 per month and of the Platform contract. There is no free-tier API key: a workspace without that entitlement is refused at key creation, for a test key as well as a live one.

Per-order passports are $3 for everyone, or $0.50 each on a volume agreement at 500 or more per month, and high-volume platforms get a custom committed rate. Platform accounts pre-commit a year of volume upfront at a bought-down rate to unlock the API.

Signed webhooks

A recall that lands after fulfillment has to find its way back.

In plain terms: we POST to your URL the moment a passport issues or a recall hits one of your lots, so your own system knows without anyone checking a dashboard.

passport.issued

A passport was minted. The payload carries the passport id, the order id, the lot id, the environment, and the verify link.

lot.recall_hit

A recall record matched one or more of your logged lots. The payload lists each lot with its product, supplier, and recall number.

supplier.alert

A new signal landed on a supplier you watch, or a lab answered a verification request. The payload names the supplier and what changed.

How a record published months later reaches your system.

An FDA enforcement record published months later is matched to the lots it names, then to the passports minted from those lots, and your own system is told without anyone opening a dashboard.

  1. Scheduled sweep

    The sweep runs on its cycle.

    Recent FDA drug enforcement records are pulled inside a rolling window, and separately each account's tracked supplier names are queried.

    Record state: Enforcement records in hand
  2. Engine

    Enforcement records in hand.

    Each record's code info and product description are scanned for known lot numbers. A match must sit on a token boundary, so '1305' can never match inside '213055'. A product hint keeps two unrelated suppliers reusing the same lot number from being conflated.

    Record state: Matched lots identified
  3. Engine

    A lot matched.

    Every matching lot, in every account that logged it, flips to flagged and carries the recall signal with its hits, confidence, detail and the lot number that matched.

    Record state: Lot: flagged
  4. Engine

    A flagged lot has passports minted from it.

    Every passport bound to that lot is stamped with a post-release recall signal. Stamping is idempotent: the record stays in the FDA window for its whole duration, so a repeat sweep refreshes the existing signal in place rather than stacking duplicates.

    The passport stays bound to its lot forever, which is what lets a later recall reach it at all.

    Record state: Passport carries a post-release signal and a recall exposure line
  5. Engine

    Lots were flagged.

    Each affected account is notified privately: a lot.recall_hit webhook and an email to the account owner, each seeing only its own lots. The fan-out is deduped so a given account, lot and recall fires once.

    Record state: Account notified

A lot-number match against public FDA enforcement data is a documentation and enforcement signal, never a safety or approval determination. A lot number can be reused across firms, so the firm identity and the lot must be confirmed against the FDA record.

supplier.alert only emails on a hard match: a lot-level hit, or a confirmed or strong firm-name match. A weak name-only match still surfaces in the workspace for review, but never triggers an email off a name collision.

POST /veritura-webhook HTTP/1.1
Content-Type: application/json
User-Agent: Veritura-Webhooks/1.0
X-Veritura-Event: passport.issued
X-Veritura-Signature: sha256=<hex digest>

{
  "event": "passport.issued",
  "created": "<ISO 8601>",
  "data": {
    "passportId": "PASS-...",
    "orderId": "ORD-1042",
    "lotId": "lot_...",
    "environment": "production",
    "verifyUrl": "/verify/..."
  }
}
  • Verify the signature, not the source address

    X-Veritura-Signature is sha256= followed by an HMAC-SHA256 of the exact request body, computed with the signing secret for that endpoint. Recompute it over the raw bytes before you parse them.

  • The signing secret is returned exactly once

    It is shown when the webhook is registered and never again. A lost secret is replaced by registering the endpoint again, the same rule the API keys follow.

  • Answer 2xx, quickly

    Any 2xx marks the delivery successful. A delivery that has not been answered in five seconds is recorded as failed, so acknowledge first and do your work afterwards.

  • Prove it works before it matters

    Settings sends a signed sample event to a single endpoint on demand, so the receiving side can be confirmed against a real signature before a real event ever fires.

Boundary

Veritura performs independent documentation diligence only. Embedded checks, supplier verification, and co-branded Evidence Passports confirm that paperwork is complete and consistent, they are not a representation of product quality, safety, efficacy, legality, or FDA approval, and "Verified by Veritura" is never a certification or approval.

Boundary

Veritura does not test medicine, approve suppliers, recommend purchases, or make medical, legal, product-safety, or FDA-approval determinations. There is no paid or subjective placement: suppliers cannot pay for a better result or a better position, no listing fee, no subscription, and no pay-to-rank. Where results are ordered rather than filtered, the order is set by a published documentation-coverage grade, and that grade is never a recommendation, a preference, or a statement about any product.

Build against it today.

Create your dashboard, generate a test key, and run the whole integration in sandbox before a production passport exists.