Finetuning.aiFinetuning.ai

Certificates

Generation certificates — what they are, when to request one, and how to archive the PDF before you delete a track

A generation certificate is a formal, single-page PDF issued by Riku AI LLC, the operator of Finetuning. It attests that a named creator generated a specific work on Finetuning, records the prompt, the settings and the AI model used, and states that all rights in the work belong to its creator. Every certificate carries a permanent certificate number and a public verification URL.

Certificates are free — issuing one never costs a credit.

Certificates require a Plus, Pro, or Lifetime plan. Free-tier tracks are licensed for personal use only — see Licensing.

Two ways to get one

Which one you want depends on a single question: do you keep your tracks in Finetuning, or delete them once you've archived them?

If you…Then…
keep your tracksyou don't need anything new — store the generation id and call the certificate endpoint whenever you like
delete your tracksset certificate: true when you create them, and download the PDF the moment the webhook arrives

If you keep your tracks

This is the simpler path, and the one we recommend. Store the generation id and call GET /v1/generations/:id/certificate whenever you need the PDF — the day you generate, or a year later. The first request issues the certificate; every later one returns the same number and issue date.

If you delete your tracks

A certificate is rendered from the generation, so that endpoint stops working the moment you delete it — and after the 30-day retention window the underlying track is purged and the certificate can no longer be produced at all: the prompt and the settings it prints are gone with the track.

Pass certificate: true at creation instead. We issue the certificate at completion — the last moment the prompt, the settings and the audio all still exist — and send you a download URL on your webhook.

Requesting one at generation time

certificate is an optional boolean on POST /v1/generations and POST /v1/instrumental. Default false.

curl -X POST https://pub.finetuning.ai/v1/generations \
  -H "X-API-Key: ft_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "tags": "lofi chill piano night",
    "duration": 120,
    "certificate": true,
    "webhook": "https://your-app.com/finetuning-callback?token=YOUR_SECRET"
  }'

The 202 response echoes the flag back, so you can confirm we accepted it:

202 Accepted
{
  "data": {
    "id": "gen_xyz789",
    "status": "processing",
    "webhook": "https://your-app.com/finetuning-callback?token=YOUR_SECRET",
    "certificate": true,
    "creditsRemaining": 412,
    "createdAt": "2026-09-02T09:00:00.000Z"
  }
}

certificate must be a real JSON boolean. We accept true and nothing else — the string "true" is read as "no certificate", and the response's certificate: false is how you'll spot it.

Sound effects do not accept certificate at creation. Their certificates are always fetched on demand from GET /v1/sound-effects/:id/certificate.

The webhook payload

When you set certificate: true and supply a webhook, the completion callback carries one extra object. Everything else in the payload is unchanged — see Webhooks for the rest.

status: completed
{
  "id": "gen_abc123def456",
  "status": "completed",
  "audioUrl": "https://media.finetuning.ai/abc123def456.mp3",
  "duration": 120.4,
  "prompt": "lofi chill piano night",
  "parameters": {
    "bpm": 120,
    "duration": 120,
    "keyscale": "C major",
    "timesignature": 4,
    "seed": 42
  },
  "createdAt": "2026-09-02 09:00:00",
  "completedAt": "2026-09-02T09:00:08.000Z",

  "certificate": {
    "number": "FT-A7K2-M9QX-4BQC",
    "issuedAt": "2026-09-02 09:00:08",
    "verifyUrl": "https://finetuning.ai/verify/FT-A7K2-M9QX-4BQC",
    "downloadUrl": "https://pub.finetuning.ai/v1/generations/gen_abc123def456/certificate",
    "sizeBytes": 17537
  }
}
FieldTypeDescription
certificate.numberstringThe certificate number. Store it — it's how you find the certificate later, and what a verifier types in
certificate.issuedAtstringWhen the certificate was issued. UTC, YYYY-MM-DD HH:MM:SS
certificate.verifyUrlstringPublic, no-login verification page. Printed and QR-encoded on the PDF. Does not expire
certificate.downloadUrlstringWhere to fetch the PDF. Works for as long as the generation exists — see below
certificate.sizeBytesnumberSize of the PDF in bytes

Three things about when the object appears:

  • A certificate problem never stops us delivering your track. If we couldn't issue one, certificate is null and the rest of the payload is unaffected.
  • It's absent entirely from payloads for generations that didn't request one, from status: "failed" payloads, and from Zapier trigger payloads.
  • No webhook is fine too. certificate: true without a webhook still issues the certificate at completion — you just collect it from the endpoint yourself afterwards.

Download the PDF

curl -H "X-API-Key: $FINETUNING_API_KEY" \
  "https://pub.finetuning.ai/v1/generations/$GENERATION_ID/certificate" \
  -o certificate.pdf

Returns the PDF binary (application/pdf, around 17 KB).

This URL needs the X-API-Key header, so it isn't clickable in a browser — pasting it into the address bar returns 401. It's an endpoint for your code. If you just want to eyeball a certificate, open its verifyUrl instead: that page is public and needs no account.

Download the PDF when the webhook arrives

downloadUrl works for as long as the generation exists, and there is deliberately no expiry on it and no second, longer-lived link. So if you're going to delete the track, fetch the PDF in the same step that archives the MP3.

Once you delete the generation the URL returns 404, and after the 30-day retention window the certificate can no longer be produced at all.

Either way, store certificate.number in your own database. The verification URL built from it never expires — it keeps working after the track and the PDF are both gone.

  1. POST /v1/generations with webhook and certificate: true.
  2. On the callback: download audioUrl, download certificate.downloadUrl, store both.
  3. Record certificate.number in your own database next to the track — it's how you find the certificate afterwards, and what a verifier types in.
  4. Delete the generation from Finetuning whenever you like. Steps 2 and 3 are what make that safe.

What's on the certificate

  • The certificate number and issue date
  • Who generated the work (your account's display name — no email or other personal data)
  • The work's title, ID, type, duration, and generation date
  • The full generation prompt and settings, and the AI model used
  • The statement that all rights in the work belong to its creator
  • The public verification URL and QR code

For the endpoint details — headers, path parameters, error codes — see GET /v1/generations/:id/certificate and GET /v1/sound-effects/:id/certificate.

On this page