Hedra is a generative-media AI lab and creative platform that lets you produce image, video, and audio content through a web studio and a developer API. Its proprietary Character-3 model powers expressive talking-head and character video, and the platform brokers access to leading partner models (Veo, Kling, Grok, Nano Banana Pro, Flux, Sana) behind one credit-based account. The Hedra Web API exposes a small, uniform surface — list models and voices, upload assets, submit generations (image, video, avatar, text-to-speech, voice clone, upscale, video-to-video), poll generation status, and check billing credits — authenticated with an X-API-Key header. Hedra ships first-party Python, Node/TypeScript, and Rust CLI clients. Backed by a16z.
Hedra publishes 7 API contracts indexed on the APIs.io network, including Access API, Billing API, Jobs API, and 4 more. Tagged areas include Company, Artificial Intelligence, Generative AI, Video Generation, and Image Generation.
The Hedra catalog on APIs.io includes 1 event-driven AsyncAPI specification.
Hedra’s developer surface includes documentation, API reference, getting-started guide, pricing, signup flow, support, engineering blog, and 30 more developer resources.
Regulatory Posture applies to this provider. Its tags matched the
AI & Biometrics regime, so
Regulatory Posture carries 15 points of the composite.
If this regime is wrong for your business, say so on your
provider repo — the
applicability map is public and we will correct it.
Create-or-Update Ergonomics could not be measured. We hold no machine-readable contract for
this provider to read, so there is nothing to measure a write surface against. Excluded rather than scored zero:
never-measured and measured-empty are different facts. Publishing an OpenAPI is what makes this facet — and
several others — scorable at all.
The six quality facets above are damped to 85 points between them,
because the conditional facet above carries the other
15. That is why each facet's contribution is shown against a damped
maximum: raising a quality facet moves the composite by 85% of its nominal
weight, not 100%. The full arithmetic is at apis.io/rating/.
Show this score on your site.
It updates itself when the score changes. Paste this where you link to your API docs:
<a href="https://apis.io/providers/hedra/"><img src="https://apis.io/badge/hedra/card.svg" alt="Hedra on APIs.io — Kin Score by API Evangelist"></a>
Other styles, a README pill and a shields.io endpoint are on the badge page.
Raise your score.
Agent readiness — checks not met, largest first (exact, from this profile):
MCP Server+12 pts — deployment.mode + probe verdict on the mcp/ manifest, not the pointer; an unprobed slug falls back to authorship
A2A Agent Card+8 pts — a2a/-a2a.yml manifest, graded on conformance.grade against A2A 1.0.0
Delegated User Identity+6 pts — a served discovery document listing authorization_code in grant_types_supported (served), else an oauth2 authorizationCode flow or openIdConnect declared in an OpenAPI (documented)
Documented Reversibility+6 pts — a reversal operation in the contract, graded up when a window is documented too
Agentic Commerce Well-Known Document+5 pts — a parsing /.well-known/ucp.json or acp.json declaring a version and at least one service — `self` when its endpoints are on the provider's own domain, `platform` when they are on a vendor's
4 more unmet checks in the Agent Readiness table above.
Kin Score — facets with the most composite points still available (weight × headroom):
Stream signed job lifecycle logs to HTTPS destinations. **Why the last batch failed.** `last_error` is the same error envelope a failed job returns from `GET /jobs/{job_id}`, no...
One typed submit endpoint per image, video and audio model — titled `Run ()`, so the model you know by name is the operation you call. Every one returns the same `202` job enve...
Configure, test, verify, and inspect outbound webhooks. **Delivery and retries.** Delivery is at-least-once. A `2xx` from your endpoint is success; anything else — including a r...
Overlays applied on top of this provider's contracts. Each card says who wrote it: a document the provider publishes, or one API Evangelist derived or generated.
aid: hedra
name: Hedra
description: Hedra is a generative-media AI lab and creative platform that lets you produce image, video, and audio content
through a web studio and a developer API. Its proprietary Character-3 model powers expressive talking-head and character
video, and the platform brokers access to leading partner models (Veo, Kling, Grok, Nano Banana Pro, Flux, Sana) behind
one credit-based account. The Hedra Web API exposes a small, uniform surface — list models and voices, upload assets, submit
generations (image, video, avatar, text-to-speech, voice clone, upscale, video-to-video), poll generation status, and check
billing credits — authenticated with an X-API-Key header. Hedra ships first-party Python, Node/TypeScript, and Rust CLI
clients. Backed by a16z.
url: https://raw.githubusercontent.com/api-evangelist/hedra/refs/heads/main/apis.yml
x-type: company
x-source: vc-portfolio
x-backed-by:
- a16z
x-tier: enriched
x-tier-reason: has-public-api
deliveryModel:
model: saas
open_source: false
commercial: true
callable_host: false
label: Hosted service · you call their endpoint
confidence: medium
source:
- openapi
- pricing
generated: '2026-08-28'
method: derived
accessModel:
pricing: unknown
onboarding: unknown
trial: false
try_now: false
public: false
label: Unknown
confidence: low
source:
- authentication
- security
generated: '2026-09-03'
method: derived
specificationVersion: '0.23'
created: '2026-07-17'
modified: '2026-10-06'
image: https://www.hedra.com/assets/logo/light.svg
x-docs-platform: nextra
x-docs-platform-confidence: medium
x-docs-platform-checked: 2026-10-03
x-docs-hosting: vercel
tags:
- Company
- Artificial Intelligence
- Generative AI
- Video Generation
- Image Generation
- Audio Generation
- Text-to-Speech
- Avatars
- Media
- Machine Learning
tags_raw:
- Company
- Artificial Intelligence
- Generative AI
- Video Generation
- Image Generation
- Audio Generation
- Text to Speech
- Avatars
- Media
- Machine Learning
- Image-Generation
- Machine-Learning
apis:
- aid: hedra:hedra-access-api
name: Hedra Access API
description: API keys, browser tokens, and file uploads.
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Access
properties:
- type: OpenAPI
url: openapi/hedra-access-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- aid: hedra:hedra-billing-api
name: Hedra Billing API
description: Balance and usage, in US dollars.
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Billing
properties:
- type: OpenAPI
url: openapi/hedra-billing-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- aid: hedra:hedra-jobs-api
name: Hedra Jobs API
description: Poll, stream, and list submitted jobs.
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Job
tags_raw:
- Jobs
properties:
- type: OpenAPI
url: openapi/hedra-jobs-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- aid: hedra:hedra-log-drains-api
name: Hedra Log drains API
description: 'Stream signed job lifecycle logs to HTTPS destinations.
**Why the last batch failed.** `last_error` is the same error envelope a failed job returns from `GET /jobs/{job_id}`,
not a free-text diagnostic. It is null until a batch fails and is cleared again on the next success. Its `code` comes
from the one error vocabulary this API uses, narrowed for drain delivery to this set:
| `code` | Means |
| --- | --- |
| `DEADLINE_EXCEEDED` | Your destination did not respond before the delivery timeout. |
| `UNAVAILABLE` | Your destination could not be reached (DNS, TLS, or connection failure) or answered `5xx` — or redirected,
which is never followed. |
| `RESOURCE_EXHAUSTED` | Your destination answered `429`. |
| `UNAUTHORIZED` | Your destination answered `401`. |
| `PERMISSION_DENIED` | Your destination answered `403`. |
| `NOT_FOUND` | Your destination answered `404`. |
| `INVALID_ARGUMENT` | Your destination answered some other `4xx`. |
| `FAILED_PRECONDITION` | The URL is not a permitted log drain target — it resolves to a blocked address range. Fix the
URL; retrying will not help. |
| `INTERNAL` | Hedra could not prepare the batch. |
| `UNKNOWN` | No classification is available, including for drains that last failed before this field became structured.
|
`retryable` describes the condition, not what Hedra did: every failed batch is requeued until the drain auto-disables,
so it answers whether fixing the destination and re-enabling is likely to help. The `message` is a fixed summary — your
destination''s URL, headers, credentials, and response body are never echoed back, so treat your own logs, not this field,
as the record of what your destination returned.
`disabled_reason` answers a different question and stays its own small vocabulary: `consecutive_failures` when five batches
in a row failed, `disabled_by_user` when you turned the drain off.'
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Log drains
properties:
- type: OpenAPI
url: openapi/hedra-log-drains-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- aid: hedra:hedra-models-api
name: Hedra Models API
description: Discover models and estimate cost.
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Models
properties:
- type: OpenAPI
url: openapi/hedra-models-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- aid: hedra:hedra-run-a-model-api
name: Hedra Run a model API
description: 'One typed submit endpoint per image, video and audio model — titled `Run <name> (<id>)`, so the model you
know by name is the operation you call. Every one returns the same `202` job envelope; track it under Jobs.
`POST /models/{model}` is the same call with the id supplied at runtime and `input` untyped — use it for a model your
client was generated before, or one you looked up in `GET /models`.
A chat model (`modality: text` in `GET /models`) runs on `POST /chat/completions` instead, which answers with the completion
itself in the OpenAI chat-completions format, not a job.'
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Run a model
properties:
- type: OpenAPI
url: openapi/hedra-run-a-model-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- aid: hedra:hedra-webhooks-api
name: Hedra Webhooks API
description: 'Configure, test, verify, and inspect outbound webhooks.
**Delivery and retries.** Delivery is at-least-once. A `2xx` from your endpoint is success; anything else — including
a redirect, which is never followed — is retried. Hedra makes up to **12 attempts over approximately 6 hours**, backing
off 10s, 30s, 90s, 4m30s, 13m30s, 40m30s, then hourly. An endpoint that is unreachable for the whole window is marked
`FAILED` and is not retried again; replay it with `POST /webhooks/deliveries/{job_id}/redeliver`. Two failures are permanent
and stop the ladder immediately: a URL that resolves to a blocked address range, and a redirect pointing at one.
Because the retry window is bounded, respond quickly and do your own processing asynchronously — acknowledge with a `2xx`
first.
**Deduplication.** Key on **`X-Hedra-Webhook-Id`**. It identifies the *event* — it is the job''s own id, and it is byte-identical
across every retry and every replay. Do **not** hash the request body: each attempt re-signs the output URL, so the body
legitimately differs between attempts of the same event and a body hash would treat every retry as new.
Each POST also carries `X-Hedra-Webhook-Attempt` (1-based, informational) and **`X-Hedra-Webhook-Redelivery`** (`true`
/ `false`). Redelivery is the exception to deduplication: when it is `true`, an operator asked for this event to be sent
again — process it even if you have already recorded that id, because that request is the whole reason it was sent.
**Inspecting deliveries.** `GET /webhooks/deliveries` reports each delivery''s cumulative `attempts`, its latest outcome
(`status`, `last_response_status`, `last_error`), and its replay history: `redelivery_count` counts operator replays,
and `redeliveries` archives the outcome each replay superseded — a replay re-sends on the same delivery record. Each entry''s
`attempts` value is the cumulative total when that replay was requested, so the per-cycle attempt counts (and any total
beyond the 12-attempt ladder) can be read off the record directly.
**Why a delivery failed.** `last_error` — on the delivery and on every archived replay entry — is the same error envelope
a failed job returns from `GET /jobs/{job_id}`, not a free-text diagnostic. Its `code` comes from the one error vocabulary
this API uses, narrowed for delivery to this set:
| `code` | Means |
| --- | --- |
| `DEADLINE_EXCEEDED` | Your endpoint did not respond before the delivery timeout. |
| `UNAVAILABLE` | Your endpoint could not be reached (DNS, TLS, or connection failure) or answered `5xx` — or redirected,
which is never followed. |
| `RESOURCE_EXHAUSTED` | Your endpoint answered `429`. |
| `UNAUTHORIZED` | Your endpoint answered `401`. |
| `PERMISSION_DENIED` | Your endpoint answered `403`. |
| `NOT_FOUND` | Your endpoint answered `404`. |
| `INVALID_ARGUMENT` | Your endpoint answered some other `4xx`. |
| `FAILED_PRECONDITION` | The URL is not a permitted webhook target — it resolves to a blocked address range, or redirects
to one. Fix the URL; replaying will not help. |
| `INTERNAL` | Hedra could not build the payload. |
| `UNKNOWN` | No classification is available, including for deliveries that failed before this field became structured.
|
`retryable` describes the condition, not what Hedra did: every non-2xx response is retried on the ladder above, so it
answers whether replaying the delivery is likely to help. The `message` is a fixed summary — your endpoint''s URL, address,
headers, credentials, and response body are never echoed back, so treat your own logs, not this field, as the record of
what your endpoint returned.
**Verifying a delivery.** Every request carries `X-Hedra-Webhook-Signature`, a hex-encoded ed25519 signature over a canonical
string of **five newline-separated fields, in this order**:
```
{X-Hedra-Webhook-Timestamp}
{X-Hedra-Webhook-Id}
{X-Hedra-Webhook-Event}
{X-Hedra-Webhook-Redelivery}
{sha256 hex digest of the raw request body}
```
Rebuild that string from the request you received, verify it against the key from `GET /webhooks/public-key`, and reject
the delivery if the timestamp is more than 5 minutes old. Hash the body **exactly as received**, before any JSON parsing
or re-serialization.
The signature deliberately covers the deduplication id and the redelivery flag, not just the body — both of them decide
whether you process a duplicate, so an unsigned copy of either would let anyone who captured a delivery replay it past
your idempotency check. Verify *before* you act on any header. `X-Hedra-Webhook-Attempt` is outside the signature and
is informational only; do not branch on it.'
humanURL: https://www.hedra.com/docs
baseURL: https://api.hedra.com/web-app
tags:
- Webhook
tags_raw:
- Webhooks
properties:
- type: OpenAPI
url: openapi/hedra-webhooks-api-openapi.yml
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: Quickstart
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
maintainers:
- FN: Kin Lane
email: kin@apievangelist.com
- FN: APIs.json
email: info@apis.io
common:
- type: Plans
url: plans/hedra-plans-pricing.yml
- url: https://www.hedra.com/blog/feed.xml
type: BlogRSS
- type: Website
url: https://www.hedra.com/
- type: CapabilityMap
url: capabilities/hedra-capability-edges.yml
name: Hedra Business Capability Map
- type: Overlay
url: overlays/hedra-web-api-overlay.yaml
- type: DeveloperPortal
url: https://www.hedra.com/docs
- type: Documentation
url: https://www.hedra.com/docs
- type: APIReference
url: https://www.hedra.com/docs
- type: GettingStarted
url: https://www.hedra.com/docs/pages/developer/getting_started/quickstart
- type: Pricing
url: https://www.hedra.com/pricing
- type: SignUp
url: https://www.hedra.com/auth/start?flow=signup
- type: Login
url: https://www.hedra.com/auth/start?flow=login
- type: TermsOfService
url: https://www.hedra.com/terms
- type: PrivacyPolicy
url: https://www.hedra.com/privacy
- type: Support
url: https://www.hedra.com/support
- type: Blog
url: https://www.hedra.com/blog
- type: GitHubOrganization
url: https://github.com/hedra-labs
- type: StatusPage
url: https://status.hedra.com/
- type: AgenticAccess
url: agentic-access/hedra-agentic-access.yml
- type: Authentication
url: authentication/hedra-authentication.yml
- type: Packages
url: packages/hedra-packages.yml
- type: SDKs
url: packages/hedra-packages.yml
- type: CLI
url: cli/hedra-cli.yml
- type: X-MCPServerCandidate
url: mcp/hedra-mcp.yml
note: 'Renamed from MCPServer 2026-09-03 (roadmap#247): the manifest self-describes as status: candidate — a tool list derived
from the published API contracts, not an existing server. The scorer already read the manifest and reported mcp_server
correctly; the MCPServer type was crediting the artifact-type surfaces with a server that does not exist.'
- type: LLMsTxt
url: llms/hedra-llms.txt
- type: Conformance
url: conformance/hedra-conformance.yml
- type: ErrorCatalog
url: errors/hedra-error-codes.yml
- type: Conventions
url: conventions/hedra-conventions.yml
- type: DataModel
url: data-model/hedra-data-model.yml
- type: Lifecycle
url: lifecycle/hedra-lifecycle.yml
- type: DomainSecurity
url: security/hedra-domain-security.yml
- type: Webhooks
url: asyncapi/hedra-webhooks.yml
- type: AgentSkill
url: skills/_index.yml
- type: Arazzo
name: Generate an image
url: arazzo/hedra-generate-image.yml
- type: Arazzo
name: Generate a video from an image
url: arazzo/hedra-generate-video.yml
- type: Arazzo
name: Generate an avatar video
url: arazzo/hedra-generate-avatar-video.yml
- type: Arazzo
name: Generate text-to-speech audio
url: arazzo/hedra-generate-audio.yml
x-enrichment:
date: '2026-07-19'
status: backfilled
pass: local-v1
note: backfilled from .gitignore signal + verified work evidence
Hedra API — frequently asked questions
Does Hedra have an API?
Yes. APIs.io lists 7 APIs from Hedra, including Hedra Access API, Hedra Billing API and Hedra Jobs API, and 4 more.
Is there an OpenAPI specification for the Hedra API?
Yes. APIs.io indexes 7 OpenAPI specifications for Hedra, each linked for download from this page.
How do I authenticate with the Hedra API?
Hedra uses bearer-token authentication (apiKey · 1 scheme). The details are profiled on APIs.io as Hedra Authentication.
How much does the Hedra API cost?
APIs.io lists 19 pricing plans for Hedra, with each plan's price, limits and inclusions under Pricing Plans on this page.
Is the Hedra API ready for AI agents?
Hedra has a Kin Score of 57.4 out of 100 (strong) and an Agent Readiness score of 47.8 (agent-native), scored by API Evangelist on 2026-10-31.
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.