> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.voicecheap.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Een afbeelding genereren

> Genereer een afbeelding voor het verbonden account. Gebruikt dezelfde medialimieten en waarborgen als de webapp. Bewaar de geretourneerde generationId en gebruik images_download om de afbeelding op te halen. Gebruik requestId opnieuw wanneer je dezelfde aanvraag opnieuw probeert.

Genereer een afbeelding voor het verbonden account. Gebruikt dezelfde medialimieten en waarborgen als de webapp. Bewaar de geretourneerde generationId en gebruik images\_download om de afbeelding op te halen. Gebruik requestId opnieuw wanneer je dezelfde aanvraag opnieuw probeert.

```http theme={null}
POST https://api.voicecheap.ai/v1/actions/images_generate
```

## Authenticatie en machtigingen

<ParamField header="x-api-key" type="string" required>
  Stuur een VoiceCheap API-sleutel mee in deze header. Authorization: Bearer met dezelfde API-sleutel wordt ook ondersteund. OAuth-toegangstokens
  worden alleen door MCP geaccepteerd, niet door dit REST-endpoint.
</ParamField>

Vereiste machtigingen: `images:write`.

Een actief betaald abonnement is vereist. Machtigingen wijzigen geen teamrollen, eigendom van resources, mediategoed of abonnementslimieten.

## Parameters

<ParamField body="requestId" type="string">
  Optioneel op transportniveau: als de identificatie ontbreekt, voegt de server deze vóór de validatie toe. Geef zelf een stabiele UUID v4 op om veilig te kunnen herstellen als een antwoord verloren gaat.

  Formaat: "uuid". Patroon: `^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`.
</ParamField>

<ParamField body="prompt" type="string" required>
  Tekstwaarde.

  Minimale lengte: 10. Maximale lengte: 1200.
</ParamField>

<ParamField body="aspectRatio" type="string">
  Tekstwaarde.

  Toegestane waarden: "square", "landscape", "portrait". Standaardwaarde: "square".
</ParamField>

<ParamField body="referenceImageKey" type="string">
  Een geüploade JPG-, PNG- of WebP-objectsleutel onder uploads/\{yourUserId}/. Externe URL's worden niet geaccepteerd.

  Minimale lengte: 1. Maximale lengte: 512.
</ParamField>

<Accordion title="Volledig invoerschema">
  Het onderstaande JSON Schema behoudt de exacte veldnamen, geneste typen, standaardwaarden, grenzen en toegestane waarden die discovery beschikbaar stelt. Aanvullende regels tussen velden staan in de opmerkingen bij de bewerking.

  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "requestId": {
        "type": "string",
        "format": "uuid",
        "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$",
        "description": "UUID v4 for this action. Reuse the same ID with identical arguments on retries."
      },
      "prompt": {
        "type": "string",
        "minLength": 10,
        "maxLength": 1200
      },
      "aspectRatio": {
        "default": "square",
        "type": "string",
        "enum": ["square", "landscape", "portrait"]
      },
      "referenceImageKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 512,
        "description": "An uploaded JPG, PNG or WebP object key under uploads/{yourUserId}/. Remote URLs are not accepted."
      }
    },
    "required": ["prompt"],
    "additionalProperties": false
  }
  ```
</Accordion>

## Idempotentie

Gebruik voor elke wijziging een UUID v4 in requestId of de HTTP-header Idempotency-Key. Gebruik na een netwerkfout dezelfde identificatie en identieke argumenten opnieuw. Als je beide opgeeft, moeten ze overeenkomen. Het opnieuw versturen van een opgeslagen aanvraag herhaalt de bewerking niet en verbruikt geen extra maandelijkse aanroep. Mislukte of onderbroken aanvragen worden niet automatisch opnieuw gestart.

Elke wijziging kan HTTP 202 retourneren wanneer een nieuwe poging vaststelt dat dezelfde aanvraag nog loopt, ook wanneer de eerste uitvoering normaal synchroon is. Als de uitvoering is voltooid maar resultStored false is, retourneert een nieuwe poging HTTP 200 met de opgeslagen aanvraagstatus in plaats van het oorspronkelijke resultaat. Haal de uitvoer op via de geschiedenis-, resultaat- of downloadactie van het betreffende domein.

## Voorbeeldaanvragen

Vervang de voorbeeldidentificaties van resources en mediasleutels door waarden die voor je account zijn geretourneerd. Behoud dezelfde aanvraagidentificatie wanneer je dezelfde wijziging opnieuw probeert.

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST 'https://api.voicecheap.ai/v1/actions/images_generate' \
    --header "x-api-key: $VOICECHEAP_API_KEY" \
    --header 'Content-Type: application/json' \
    --data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","prompt":"A peaceful coastal village at sunrise, with warm natural light.","aspectRatio":"square","referenceImageKey":"uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"}'
  ```

  ```javascript JavaScript theme={null}
  const input = {
    requestId: '61becb70-00d6-4de0-9eb1-05829a0d851c',
    prompt: 'A peaceful coastal village at sunrise, with warm natural light.',
    aspectRatio: 'square',
    referenceImageKey: 'uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png',
  };
  const response = await fetch('https://api.voicecheap.ai/v1/actions/images_generate', {
    method: 'POST',
    headers: {
      'x-api-key': process.env.VOICECHEAP_API_KEY,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(input),
  });
  const body = await response.json();
  if (!response.ok) throw new Error(body.code + ': ' + body.message);
  console.log(body);
  ```

  ```python Python theme={null}
  import os
  import requests

  response = requests.post(
      "https://api.voicecheap.ai/v1/actions/images_generate",
      headers={"x-api-key": os.environ["VOICECHEAP_API_KEY"]},
      json={"requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c", "prompt": "A peaceful coastal village at sunrise, with warm natural light.", "aspectRatio": "square", "referenceImageKey": "uploads/example-user/2502829e-3fde-4aad-b3c7-ce0f779fa2e6-reference.png"},
      timeout=120,
  )
  body = response.json()
  if not response.ok:
      raise RuntimeError(f"{body.get('code')}: {body.get('message')}")
  print(body)
  ```
</RequestExample>

## Antwoord

Deze bewerking retourneert HTTP 202 zolang deze wordt uitgevoerd. Bewaar requestId en controleer action\_request\_get met die identificatie en de oorspronkelijke bewerkingsnaam. De mogelijke statussen zijn running, completed, failed en interrupted. Een voltooid resultaat kan naar een afzonderlijke mediataak verwijzen; ga dan verder met de status- of uitvoeractie van die bewerking.

Definitieve generatiemetadata die de handler retourneert nadat de afbeelding is gegenereerd. Bevat geen afbeeldingsbytes, previewDataUrl of download-URL.

<ResponseExample>
  ```json HTTP 202 theme={null}
  {
    "data": {
      "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
      "status": "running",
      "pollAction": "action_request_get",
      "pollAfterSeconds": 5
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```

  ```json HTTP 200 theme={null}
  {
    "data": {
      "generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
      "status": "completed",
      "aspectRatio": "square",
      "width": 1024,
      "height": 1024,
      "referenceImageCount": 1,
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "expiresAt": 1792749600000
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```

  ```json HTTP 202 replay_running theme={null}
  {
    "data": {
      "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
      "operation": "images_generate",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "running",
      "pollAfterSeconds": 5
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```

  ```json HTTP 200 replay_completed_without_result theme={null}
  {
    "data": {
      "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
      "operation": "images_generate",
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "status": "completed",
      "resultStored": false,
      "message": "The action completed. Retrieve its output from the corresponding history or resource action."
    },
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c"
  }
  ```
</ResponseExample>

## Resultaatvelden

| Veld | Beschrijving |
| - | - |
| `data.generationId` | ID die je ongewijzigd moet doorgeven aan images\_get of images\_download. |
| `data.status` | pending, completed, failed of expired. De vervaltijd heeft voorrang op de opgeslagen status. |
| `data.aspectRatio` | square, landscape of portrait. |
| `data.width` | Uitvoerbreedte in pixels, of null voordat afmetingen beschikbaar zijn. |
| `data.height` | Hoogte van de uitvoer in pixels, of null zolang de afmetingen niet beschikbaar zijn. |
| `data.referenceImageCount` | Aantal gebruikte referentieafbeeldingen: 0 of 1. |
| `data.createdAt` | Aanmaaktijdstip in Unix-milliseconden. |
| `data.updatedAt` | Tijdstip van de laatste update in Unix-milliseconden. |
| `data.expiresAt` | Tijdstip in Unix-milliseconden waarna de gegenereerde afbeelding niet meer kan worden gedownload. |

## Deze aanvraag herstellen en controleren

Gebruik dezelfde identificatie, ook nadat de verbinding is verbroken. Als resultStored false is, haal je de uitvoer op via de bijbehorende geschiedenis-, resultaat- of downloadactie. Start nooit een tweede generatie alleen om de voortgang te controleren.

```bash theme={null}
curl --request POST 'https://api.voicecheap.ai/v1/actions/action_request_get' \
  --header "x-api-key: $VOICECHEAP_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{"requestId":"61becb70-00d6-4de0-9eb1-05829a0d851c","operation":"images_generate"}'
```

```json HTTP 200 theme={null}
{
  "data": {
    "requestId": "61becb70-00d6-4de0-9eb1-05829a0d851c",
    "operation": "images_generate",
    "status": "completed",
    "createdAt": 1792144800000,
    "updatedAt": 1792144820000,
    "resultStored": true,
    "result": {
      "generationId": "6224018c7635dcb933ce5c8f7804aea73738dd1c",
      "status": "completed",
      "aspectRatio": "square",
      "width": 1024,
      "height": 1024,
      "referenceImageCount": 1,
      "createdAt": 1792144800000,
      "updatedAt": 1792144820000,
      "expiresAt": 1792749600000
    }
  }
}
```

## Opmerkingen bij de bewerking

* Vereist images:write. Witruimte aan het begin en einde van de prompt wordt verwijderd en de prompt moet 10–1200 tekens bevatten; vóór generatie wordt de prompt ook genormaliseerd. aspectRatio is standaard square en accepteert ook landscape of portrait. Er wordt maximaal één referenceImageKey geaccepteerd.
* Dit is een langdurige actie. De eerste API/MCP-respons meldt normaal gesproken running; vraag action\_request\_get op met operation images\_generate en dezelfde requestId om het hier getoonde definitieve resultaat te verkrijgen.
* Gebruikt het normale dagelijkse quotum voor afbeeldingsgeneratie van het account. Gegenereerde accountafbeeldingen verlopen zeven dagen na aanmaak; download het resultaat vóór expiresAt.
* Deze actie gebruikt de eigen creaties en uploads van de gekoppelde gebruiker, ook wanneer het toegangsmiddel in een teamcontext is gekoppeld.
* Referentiesleutels moeten verwijzen naar voltooide uploads onder uploads/\{yourUserId}/ en eindigen op .jpg, .jpeg, .png of .webp. Externe URL's, sleutels van andere gebruikers, padtraversalsegmenten, backslashes, procentcoderingen, querystrings, fragmenten en besturingstekens worden geweigerd.
* Elke referentie moet niet-leeg zijn, maximaal 8 MiB (8,388,608 bytes) groot zijn, kunnen worden gedecodeerd als het afbeeldingstype dat de extensie aangeeft en aan elke zijde 128–4096 pixels meten. Ook het aantal gedecodeerde pixels is begrensd. Een geüploade referentie blijft herbruikbaar; deze generatieacties verbruiken of verwijderen het geüploade bestand niet.
* Gebruik een UUID v4 als requestId of de HTTP-header Idempotency-Key en hergebruik deze met identieke invoer wanneer je opnieuw probeert. De integratielaag legt elke wijziging vast en retourneert de vastgelegde status of het resultaat zonder deze opnieuw uit te voeren. Een mislukte of onderbroken aanvraag wordt niet automatisch opnieuw geprobeerd.
* Voor deze gebruiker kan slechts één afbeelding tegelijk worden gegenereerd. Gebruik images\_list en images\_get om de aanmaakstatus te controleren en images\_download voor PNG-bytes. De generatie-ID is een ondoorzichtige tekenreeks; vervang deze niet door requestId.

## Verbruik

Elke geslaagde aanroep verbruikt één maandelijkse API/MCP-aanroep. Ook het mediategoed en de eigen generatielimieten van de bewerking zijn van toepassing.

## Fouten

| HTTP-status | Code | Betekenis of herstel |
| - | - | - |
| 400 | `BAD_REQUEST` | De server kon de vertrouwde netwerkcontext van de aanvraag niet bepalen. |
| 400 | `CREDENTIAL_IN_QUERY` | Inloggegevens zijn opgegeven in een queryparameter access\_token of api\_key. Stuur inloggegevens in headers. |
| 400 | `IDEMPOTENCY_CONFLICT` | De header Idempotency-Key en het bodyveld requestId moeten overeenkomen. |
| 400 | `IMAGE_PROMPT_INVALID` | De genormaliseerde prompt valt buiten het bereik van 10–1200 tekens. |
| 400 | `IMAGE_REFERENCE_INVALID` | De referentiebytes voldoen niet aan het ondersteunde afbeeldingstype, de byteslimiet, de afmetingen of de decoderingsvereisten. |
| 400 | `INVALID_REQUEST_ID` | requestId of Idempotency-Key is geen UUID v4. |
| 400 | `REFERENCE_IMAGE_INVALID` | De referentiesleutel is onveilig, behoort niet aan je toe, wordt niet ondersteund, is niet beschikbaar of is groter dan 8 MiB. |
| 400 | `VALIDATION_ERROR` | Een argument ontbreekt, heeft een niet-ondersteunde waarde, overschrijdt de limiet of maakt geen deel uit van het strikte invoerschema. |
| 401 | `API_KEY_EXPIRED` | De API-sleutel is verlopen. |
| 401 | `INVALID_API_KEY` | Geef een geldige, niet-verlopen API-sleutel op. |
| 401 | `INVALID_CREDENTIAL` | De Authorization-header heeft een ongeldige indeling of is in strijd met x-api-key. |
| 401 | `MISSING_CREDENTIAL` | Er is geen bruikbaar authenticatiemiddel in de header opgegeven, of het overschreed 4096 tekens. |
| 401 | `USER_NOT_FOUND` | Het account dat bij de toegangsgegevens hoort, bestaat niet meer. |
| 403 | `ACCOUNT_UNAVAILABLE` | Het uitvoerende of factureringsaccount is niet beschikbaar of wordt verwijderd. |
| 403 | `AMBIGUOUS_TEAM_API_KEY` | De gebruiker van het authenticatiemiddel behoort tot meer dan één team, waardoor de factureringscontext onduidelijk is. |
| 403 | `INSUFFICIENT_SCOPE` | Verleen alle vereiste machtigingen of kies andere toegangsgegevens. |
| 403 | `INTEGRATION_PLAN_UNSUPPORTED` | De integratielimieten van het account konden niet worden geverifieerd. |
| 403 | `SUBSCRIPTION_REQUIRED` | Gebruik een actief betaald abonnement. |
| 403 | `TEAM_OWNER_NOT_FOUND` | Het effectieve account van de teameigenaar kon niet worden gevonden. |
| 409 | `CONCURRENT_ACTION_LIMIT_REACHED` | Voor dit account worden al 10 integratieacties uitgevoerd. Controleer een bestaande aanvraag voordat je een nieuwe start. |
| 409 | `IDEMPOTENCY_CONFLICT` | De aanvraag-ID is al gebruikt met andere argumenten; een verschil tussen de ID in de header en die in de body retourneert HTTP 400 met dezelfde code. |
| 409 | `IMAGE_GENERATION_IN_PROGRESS` | Deze afbeeldingsaanvraag of een andere afbeelding voor de gekoppelde gebruiker wordt nog verwerkt. |
| 409 | `IMAGE_REQUEST_ID_REUSED` | De afbeeldingsaanvraag-ID is al gekoppeld aan andere invoer. |
| 422 | `IMAGE_REQUEST_REJECTED` | De afbeelding kan niet worden gegenereerd op basis van deze prompt of referentie. Wijzig de inhoud voor een nieuwe aanvraag. |
| 429 | `IMAGE_DAILY_LIMIT_REACHED` | De daglimiet van het account voor het genereren van afbeeldingen is bereikt. |
| 429 | `INTEGRATION_MONTHLY_LIMIT_REACHED` | Wacht tot de maandelijkse reset of wijzig je abonnement. |
| 429 | `INTEGRATION_RATE_LIMIT_REACHED` | Wacht de tijd uit Retry-After af wanneer deze aanwezig is en vergroot de wachttijd tussen nieuwe pogingen. |
| 500 | `INTERNAL_ERROR` | Controleer de opgeslagen aanvraagstatus en de resourcegeschiedenis voordat je besluit een wijziging opnieuw te proberen. |
| 502 | `INTERNAL_ERROR` | Het genereren of voorbereiden van de afbeelding is mislukt. Controleer de aanvraagstatus voordat je besluit een nieuwe generatie te starten. |
| 503 | `ACTION_RESULT_UNAVAILABLE` | De actie is uitgevoerd, maar het resultaat kon niet worden opgeslagen. Controleer de opgeslagen aanvraagstatus en resourcegeschiedenis voordat je een nieuwe generatie start. |
| 503 | `INTERNAL_ERROR` | De afbeeldingsgeneratie of het opgeslagen resultaat ervan is tijdelijk niet beschikbaar. Controleer de aanvraagstatus voordat je het opnieuw probeert. |
| 503 | `SERVER_RESTARTING` | De server wordt opnieuw gestart. Probeer het zo opnieuw en behoud bij een wijziging dezelfde aanvraagidentificatie. |

```json theme={null}
{
  "code": "INSUFFICIENT_SCOPE",
  "message": "This credential does not permit the requested action.",
  "status": 403,
  "details": {
    "requiredScopes": ["images:write"]
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.