Sign Customiser

Navigation

Dark mode

AI sign designs

retry_ai_sign_design_job_exports

write

Retry AI sign design job exports

Copy page

Repair a failed manufacturing file of a delivered design without buying another design.

Overview

Retry the failed EPS or Illustrator-compatible PDF conversions of a delivered AI sign design job. A retry is free: it uses no credit, does not change the charge, and does not run the AI sign designer again. Each job has a small number of free retries, reported as export_retries_remaining. Requires ai_sign_designs:write, supports dry_run, and requires an idempotency_key for an actual retry.

Permission

Requires theai_sign_designs:writepermission. A connection without it answersinsufficient_scopenaming the permission to approve.

Annotations

readOnlyHintfalse
destructiveHintfalse
idempotentHinttrue
openWorldHintfalse

Prerequisites

  • A delivered job whose eps or illustrator_pdf file has state failed and error.retryable true, from get_ai_sign_design_job.
  • A merchant has connected this store and approved the ai_sign_designs:write scope.

Side effects

  • Queues the conversion of each failed requested format again.
  • Uses one free export retry of the job. Uses no credit.
  • Claims the idempotency_key for at least 24 hours.

Arguments

job_idstringrequired

The id of a delivered job, from get_ai_sign_design_job.

idempotency_keystringrequired unless dry_run is true

A client-generated key unique to this logical write, such as a UUID. Required: repeating the call with the same key and the same arguments replays the original result instead of writing twice, and the same key with different arguments is an idempotency_key_conflict.

dry_runboolean

When true, the retry is checked against the job and its retry budget is checked and nothing is written: the result is the same verdict the apply would have reached, and a problem the apply would have raised comes back as the same tool error. Defaults to false. A dry run claims no key.

Result

The job, with the retried files in processing. Read it again with get_ai_sign_design_job. A dry run returns the formats a retry would convert, the retries left and required_units 0.

request_idstringalways present
storeobjectalways present
store.idintegeralways present
store.namestringalways present
jobobject

The job after the retry started. Absent on a dry run.

job.idstringalways present
job.statusstringalways present

queued, processing, delivered (one credit charged) or failed (no credit charged). Expected to grow: tolerate unknown values.

One of: queued, processing, delivered, failed

job.product_familystringalways present

One of: neon, channel_letter, metal_cut_out

job.customiser_idinteger or null
job.letter_type_idinteger or null
job.source_fileobjectalways present
job.source_file.idstringalways present
job.source_file.media_typestring or null
job.source_file.byte_sizeinteger or null
job.source_file.width_pxinteger or null
job.source_file.height_pxinteger or null
job.source_file.download_urlstring or null
job.output_formatsarray of stringalways present
job.poll_after_secondsinteger or null

While the job runs, how long to wait before reading it again. Null once it is delivered or failed.

job.resultobject or null

The delivered design, or null until delivery and for an erased design. Each ready file has a download_url that needs no login and can be given to a manufacturer.

job.result.display_treatmentstring or null
job.result.filesobject
job.result.assessed_dimensionsobject or null
job.result.advisoriesarray of object
job.result.export_retries_remaininginteger
job.chargeobjectalways present

reserved while the credit is held, charged once the design is delivered, released when the design failed.

job.charge.statestringalways present

One of: reserved, charged, released

job.charge.unitsintegeralways present
job.errorobject or null
job.error.codestringalways present
job.error.detailstringalways present
job.created_atstringalways present
job.completed_atstring or null
idempotent_replayboolean

True when this call replayed a previously recorded response for the same idempotency_key instead of applying the write again.

dry_runboolean

Present and true only when dry_run was requested.

validboolean

Present only on a dry run, and always true: a failing dry run returns a tool error instead.

verdictobject

Present only on a dry run: the formats a retry would convert, the free retries left, and required_units, which is always 0.

verdict.operationstring
verdict.output_formatsarray of string
verdict.export_retries_remaininginteger
verdict.required_unitsinteger

Error cases

ai_sign_design_erased

The design was erased. Do not retry.

ai_sign_design_export_not_retryable

No requested conversion has failed, one still runs, or the design needs manufacturing review.

ai_sign_design_export_retries_exhausted

The free retries of the job are used.

ai_sign_design_export_retry_limited

The export was tried too often in a short period. Wait retry_after seconds.

ai_sign_design_not_delivered

The job has not delivered a design. Poll it first.

insufficient_scope

The connection was approved without ai_sign_designs:write.

resource_not_found

The id is unknown or belongs to another store.

Retry a failed EPS conversion

tools/call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "retry_ai_sign_design_job_exports",
    "arguments": {
      "job_id": "aijob_4k8m2p6r0t3v7x1z5b9d3f7h2j",
      "idempotency_key": "7d9f1b3c-5e7a-4c9e-8b1d-3f5a7c9e1b3d"
    }
  }
}
result
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "job": {
        "id": "aijob_4k8m2p6r0t3v7x1z5b9d3f7h2j",
        "status": "delivered",
        "product_family": "neon",
        "customiser_id": null,
        "letter_type_id": null,
        "source_file": {
          "id": "aisrc_9f2c4b7ad13e6058ba41cd4201",
          "media_type": "image/png",
          "byte_size": 482133,
          "width_px": 1600,
          "height_px": 900,
          "download_url": "https://web.signcustomiser.com/ai-design-files/src9x2k7c8f3m5n6p7q8r9s0tabcd"
        },
        "output_formats": [
          "svg",
          "eps",
          "illustrator_pdf"
        ],
        "poll_after_seconds": null,
        "result": {
          "display_treatment": "fill_and_bloom",
          "files": {
            "svg": {
              "state": "ready",
              "purpose": "design",
              "media_type": "image/svg+xml",
              "byte_size": 18432,
              "download_url": "https://web.signcustomiser.com/ai-design-files/svg9x2k7c8f3m5n6p7q8r9s0tabcd",
              "error": null
            },
            "eps": {
              "state": "processing",
              "purpose": "manufacturing_export",
              "media_type": "application/postscript",
              "byte_size": null,
              "download_url": null,
              "error": null
            },
            "illustrator_pdf": {
              "state": "ready",
              "purpose": "manufacturing_export",
              "media_type": "application/pdf",
              "byte_size": 18432,
              "download_url": "https://web.signcustomiser.com/ai-design-files/pdf9x2k7c8f3m5n6p7q8r9s0tabcd",
              "error": null
            },
            "raster_preview": {
              "state": "ready",
              "purpose": "preview",
              "media_type": "image/png",
              "byte_size": 18432,
              "download_url": "https://web.signcustomiser.com/ai-design-files/png9x2k7c8f3m5n6p7q8r9s0tabcd",
              "error": null
            },
            "face_svg": null
          },
          "assessed_dimensions": {
            "width_cm": 50,
            "width_in": 19.69,
            "height_cm": 25,
            "height_in": 9.84,
            "authored_units": {
              "width_cm": "centimetres",
              "height_cm": "centimetres"
            }
          },
          "advisories": [],
          "export_retries_remaining": 2
        },
        "charge": {
          "state": "charged",
          "units": 1
        },
        "error": null,
        "created_at": "2026-10-20T09:31:00Z",
        "completed_at": "2026-10-20T09:33:40Z"
      },
      "idempotent_replay": false
    }
  }
}

A job that has not delivered (error)

tools/call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "retry_ai_sign_design_job_exports",
    "arguments": {
      "job_id": "aijob_4k8m2p6r0t3v7x1z5b9d3f7h2j",
      "dry_run": true
    }
  }
}
result
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "ai_sign_design_not_delivered",
        "title": "Design not delivered",
        "detail": "This job has not delivered a design, so it has no exports to retry. Poll the job until status is delivered. A failed design has no exports. Nothing was started.",
        "recovery": "The job has not delivered a design. Read it with get_ai_sign_design_job until status is delivered. A failed design has no files to export."
      }
    }
  }
}

Type a question and press Enter. Use the arrow keys to move between the results.