Skip to content

API reference — conventions

This section documents every endpoint. Read this page first — it covers the base URL, auth, request formats, the response and error envelopes, and the shared object shapes every endpoint reuses.

Base URL

https://api-ghost.fluidvip.com/api

Every path below is relative to that base. So POST /jobs is POST https://api-ghost.fluidvip.com/api/jobs.

Authentication

Send your API key as a bearer token on every request:

Authorization: Bearer fg_sk_live_…

See Authentication. Missing/invalid → 401 unauthorized.

Request formats

  • Job creation and inspection accept multipart/form-data (to carry the file upload). Non-file fields like recipeId, copies, delivery, options, and recipeConfig are form fields; object fields (options, recipeConfig) are JSON-encoded strings in multipart.
  • File-free job creation (using a pre-uploaded inputKey) also accepts application/json, where object fields are real JSON objects.
  • Reads (GET) take no body.

Success responses

Endpoints return their payload directly as JSON, with a conventional HTTP status:

  • POST /jobs202 Accepted with { jobId, statusUrl }.
  • GET reads → 200 OK with the resource.

Error envelope

Errors return a flat JSON body:

json
{
  "error": "insufficient_balance",
  "message": "Not enough balance for this job.",
  "details": { "balance": 0.4, "required": 3 }
}
  • error — a machine-readable code that maps to the HTTP status.
  • message — a human-readable explanation.
  • details — present on some errors (validation findings, balance shortfall). Optional.

The full code table is in Errors.

Shared object shapes

These appear across multiple endpoints.

Variant

One produced result within a job.

FieldTypeNotes
indexinteger0-based position in the batch.
statusprocessing | completed | failedPer-variant state.
fileNamestringDevice-authentic download name (e.g. IMG_4827.HEIC). Absent on older results.
urlstringPersistent served URL (drive delivery).
downloadUrlstringOne-time download link (ephemeral delivery). Deletes on successful download.
expiresAtstring (ISO-8601)Fallback purge time for an ephemeral variant.
errorstringFailure reason (present when status: failed).
previewKey / previewUrlstringBrowser-playable H.264 preview for a video result.
videoUrl / videoMp4Url / contentIdentifierstringLive Photo companion video(s) + pairing UUID (live captures).
detectionRisknumber 0–100Similarity-vs-original score; higher = more detectable.
riskBandlow | medium | highCoarse band.
riskAuditobjectPer-hash distances behind the score.
metadataRiskobject{ severity, tells[] } — lingering metadata tells.
copyCollisionbooleantrue if this copy couldn't be fully separated from a sibling (its distinctness ceiling was hit).

Progress

FieldTypeNotes
doneintegerVariants settled (succeeded or failed).
totalintegerVariants this job will produce (= copies).
stoppedEarlybooleanUltra Safe circuit breaker tripped; done < total valid variants produced.
stoppedReasonstringHuman-readable reason when stoppedEarly.

Job status

FieldTypeNotes
jobIdstringThe job's id.
statusqueued | processing | completed | partial | failedLifecycle state; the last three are terminal.
progressProgressSee above.
variantsVariant[]Per-variant results, filled in as they settle.
errorstringPresent when the whole job failed.

Endpoints at a glance

Method & pathPurpose
POST /jobsSubmit a spoof job (photo, video, or a carousel slide).
GET /jobsList your recent jobs.
GET /jobs/{id}Poll a job's status.
GET /jobs/{id}/download/{variant}Download a one-time (ephemeral) variant.
GET /optionsThe option vocabulary + limits + starter recipes.
GET /meYour account balance + tier.

FluidGhost API — part of the Fluidvip ecosystem.