Is there an OpenAPI spec?+
Yes. We ship an OpenAPI 3.1 spec covering every public endpoint plus the webhook payloads. It is delivered as part of the full integration pack after we review your request — drop it into Postman, Insomnia, openapi-generator, oapi-codegen or any tool that consumes OpenAPI. The full pack is sent to qualified integrators only; request access via the contact form.
Do I need an SDK or can I use raw HTTP?+
Raw HTTP is fully supported and the recommended path. No SDK lock-in. The pack ships executable code samples in curl, Node.js, Python, Go (signature verification) and PHP — drop them into your project and ship. Any HTTP client (axios, fetch, requests, httpx, Guzzle, Go net/http) works.
How do I receive webhooks during local development?+
Use ngrok, Cloudflare Tunnel or localtunnel to expose your localhost over HTTPS. For replayable offline testing, the pack includes a `replay-firma.sh` script that re-signs a captured payload with your dev secret so you can iterate without waiting for a real dispatch.
What happens if my webhook endpoint is down for hours?+
BD-API retries with exponential backoff (1s / 2s / 4s, 3 attempts) per dispatch. After full failure, the dispatch row stays in the failed pool and the next CRON tick re-evaluates it as long as `retry_count < 3`. After permanent failure, the event is queryable via the REST API so you can backfill manually. Receivers should be idempotent — the same `event_id` may arrive more than once.
How is the license key scoped?+
Each license key authenticates exactly one installation. Cross-installation queries are not addressable. For multi-tenant integrations, request one key per tenant if you need isolation at the BD-API layer, or one key with tenant attribution handled inside your application.
What about rate limits on the /api/versions/* endpoints?+
Designed for daily polling per installation. There is no hostile rate limit on this surface today — higher-frequency polling is supported (up to once per minute is fine for integration testing) but production patterns should stay close to daily, because the upstream CosIng source itself does not update faster than that.
How many regulatory sources does BD-API cover?+
Five active sources, two integration channels. CosIng is delivered as signed incremental SQL patches via REST pull. EC Publications (Official Journal EU via EC Drupal), SCCS opinions, Safety Gate alerts and EUR-Lex acts are delivered as HMAC-signed webhooks. You can subscribe per-source — you do not have to take all of them to take one. How each source fits into the regulatory monitoring playbook →
How long does a typical integration take?+
A working integration against a sandbox license key — webhook receiver verifying HMAC, daily CosIng patch cron applying inside a single PostgreSQL transaction, feedback loop closed — is 4 to 12 engineering hours with the pack we provide. Production hardening (alerting, audit logging, multi-tenant attribution) is on top of that and depends on your stack.
Do you offer a sandbox or test license?+
Yes. Test license keys are provisioned manually on request. Production and test keys point to the same production environment but the test mode flag attenuates side effects (no impact on commercial metrics, separate audit trail). We do not run a separate sandbox installation — that gives you a more honest signal that everything you test will behave identically in prod.
What happens if BD-API stops operating?+
The CosIng data you have already applied lives in your own PostgreSQL — you keep it. Patches are pure SQL with no proprietary runtime. Webhook events you received are in your own database. There is no vendor-managed runtime to retire, no SDK that stops working, no opaque binary protocol that locks you in. We give you durability by design, not by promise.
Why sign webhooks with HMAC if I'm already using HTTPS?+
HTTPS protects the transport — it prevents someone on the network from reading or tampering with the payload in transit. HMAC protects the origin — it lets your receiver prove that the payload actually came from BD-API and not from anyone who learned your endpoint URL. Without HMAC, any attacker who guesses or discovers your webhook URL can forge events. HTTPS without HMAC is encryption without authentication, and authentication is the part that matters for compliance evidence. Five-minute HMAC verification guide with code samples →
What is a timing attack and why does it matter when verifying HMAC signatures?+
A timing attack exploits the fact that a naive string comparison (== or ===) returns as soon as it finds a mismatched character. An attacker who can measure response times can deduce signature bytes one by one until they forge a valid one. The fix is constant-time comparison — crypto.timingSafeEqual in Node, hmac.compare_digest in Python, hash_equals in PHP. The cost is identical to a normal comparison; the safety gain is total. Common HMAC verification mistakes — including timing comparisons →