Zum Inhalt springen
Menü der Dokumentation

Partner-API für Fachzeitschriften

Senden Sie Einreichungen aus Ihrem Redaktionssystem und erhalten Sie für jede einen Score, Befunde und einen Berichtslink.

Zuletzt aktualisiert

Ihr System sendet den Code einer Einreichung, optional mit dem Manuskript, und ruft das Ergebnis ab, sobald die Analyse abgeschlossen ist. Einreichende brauchen kein RepoReady-Konto.

Zugang und Signatur

RepoReady richtet den Zugang je Fachzeitschrift ein: einen Partnernamen und ein verschlüsselt gespeichertes Signaturgeheimnis. Zugang erhalten Sie über [email protected].

Alle Endpunkte liegen unter https://api.repoready.ai/api/partner-runs. Jede Anfrage trägt drei Header:

  • x-partner-name: Ihr Partnername.
  • x-partner-timestamp: die aktuelle Unix-Zeit in Sekunden.
  • x-partner-signature: der hexadezimal kodierte HMAC-SHA256 der folgenden Zeichenkette, mit Ihrem Geheimnis als Schlüssel.
signature string
<x-partner-timestamp>.<METHOD>.<path>.<body>

1789650000.GET./api/partner-runs/jobs/partner_3f9c2a71d0b84e5c6a2f1b07.{}

path enthält /api, aber keinen Query-String. body ist das gesendete JSON in kompakter Form (ohne Leerraum, Schlüssel in gesendeter Reihenfolge, Nicht-ASCII unmaskiert), bei GET {}. Eine falsche Signatur oder ein um mehr als fünf Minuten abweichender Zeitstempel ergibt 401.

Ein minimaler Client in Python:

client.py
import hashlib, hmac, json, time
import requests

API = "https://api.repoready.ai"
PARTNER = "your-journal"          # your partner name
SECRET = b"your-signing-secret"   # never commit it

def call(method, path, body=None):
    ts = str(int(time.time()))
    raw = json.dumps(body or {}, separators=(",", ":"), ensure_ascii=False)
    signed = f"{ts}.{method}.{path.split('?')[0]}.{raw}"
    digest = hmac.new(SECRET, signed.encode(), hashlib.sha256).hexdigest()
    headers = {
        "x-partner-name": PARTNER,
        "x-partner-timestamp": ts,
        "x-partner-signature": digest,
        "Content-Type": "application/json",
    }
    data = raw.encode() if method == "POST" else None
    r = requests.request(method, API + path, headers=headers, data=data)
    return r.json()

Einen Auftrag anlegen

Senden Sie den Code als ZIP-Datei oder als öffentliches GitHub-Repository.

ZIP-Datei

Fordern Sie einen Upload-Link an, laden Sie die Datei per PUT hoch und legen Sie den Auftrag mit dem zurückgegebenen uploadKey an. Der Link ist zeitlich begrenzt. Ein Manuskript laden Sie genauso hoch, mit "kind": "manuscript".

POST /jobs/uploads, PUT, POST /jobs
# 1. Ask for an upload link
up = call("POST", "/api/partner-runs/jobs/uploads",
          {"kind": "code", "filename": "JRNL-2026-0412.zip"})

# 2. Upload the zip file
with open("JRNL-2026-0412.zip", "rb") as f:
    requests.put(up["uploadUrl"], data=f,
                 headers={"Content-Type": "application/zip"})

# 3. Create the job
job = call("POST", "/api/partner-runs/jobs", {
    "partnerSubmissionId": "JRNL-2026-0412",
    "source": {"type": "upload", "uploadKey": up["uploadKey"]},
})
job_id = job["run"]["id"]

Öffentliches GitHub-Repository

Senden Sie owner/repo und einen Tag, Branch oder Commit als ref, möglichst einen Tag oder Commit, damit sich der Bericht auf eine feste Version bezieht. Private Repositorys werden nicht abgerufen: Senden Sie diese als ZIP-Datei.

POST /api/partner-runs/jobs
{
  "partnerSubmissionId": "JRNL-2026-0413",
  "source": {
    "type": "github",
    "repoFullName": "example-lab/cell-atlas",
    "ref": "v1.2.0"
  },
  "manuscript": {
    "type": "upload",
    "uploadKey": "uploads/...",
    "name": "manuscript.pdf"
  },
  "effortLevel": "medium"
}

Felder

  • partnerSubmissionId (Pflicht): Ihre ID der Einreichung. Eine erneut gesendete ID liefert den bestehenden Auftrag ("idempotent": true) statt einer neuen Analyse; für eine Überarbeitung oder einen neuen Versuch verwenden Sie eine neue ID.
  • manuscript (optional): ein hochgeladenes Manuskript zum Abgleich mit dem Code.
  • effortLevel (optional): die Analysetiefe low, medium (Standard) oder high. Vergleichen Sie Scores nur bei gleicher Analysetiefe.

Verwenden Sie run.id aus der Antwort für die folgenden Aufrufe.

Status und Bericht

Es gibt keine Webhooks: Fragen Sie GET /jobs/:id ab, etwa einmal pro Minute. run.status ist queued, running, completed, failed oder cancelled; errorMessage erklärt einen Fehlschlag.

Danach rufen Sie GET /jobs/:id/report ab. Prüfen Sie ok in jeder Antwort: Eine unbekannte Auftrags-ID oder ein zu früh angeforderter Bericht liefert "ok": false.

GET /jobs/:id, GET /jobs/:id/report
while True:
    run = call("GET", f"/api/partner-runs/jobs/{job_id}")["run"]
    if run["status"] not in ("queued", "running"):
        break
    time.sleep(60)

if run["status"] == "completed":
    result = call("GET", f"/api/partner-runs/jobs/{job_id}/report")

Inhalt des Berichts

  • score: 0 bis 100 oder null, wenn ein Teil der Analyse nicht abgeschlossen wurde; die Zusammenfassung nennt dann den Teil. Die Kategorie ergibt sich aus den Score-Bereichen.
  • summary: eine kurze Zusammenfassung der Prüfung.
  • report.sections: Befunde nach Bereich (Execution, Data & Results, Code Health und, mit Manuskript, Manuscript), jeweils mit name, description, status, Dateiverweisen (citations) und Korrekturvorschlägen (suggestions).
  • report.summary: die Zahl der Befunde je Status.
  • reportUrl: die Berichtsseite der Einreichung (siehe Berichtslinks).
  • metadata: Auftrags-ID, Erstellungszeitpunkt und Hinweis zur Einordnung.
GET /api/partner-runs/jobs/:id/report
{
  "ok": true,
  "score": 64,
  "summary": "...",
  "reportUrl": "https://app.repoready.ai/shared/...",
  "report": {
    "sections": [{
      "name": "Execution",
      "checks": [{
        "name": "...",
        "description": "...",
        "status": "critical",
        "citations": ["scripts/load.py:12"],
        "suggestions": ["..."]
      }]
    }],
    "summary": { "critical": 1, "warning": 3, "improvement": 4,
                 "good": 9, "info": 2, "total": 19 }
  },
  "metadata": {
    "runId": "partner_...",
    "generatedAt": "...",
    "disclaimer": "Automated analysis may contain errors and ..."
  }
}

Die Statusantwort enthält außerdem tokensUsed und estimatedCostUsd. Worauf jede Prüfung achtet, beschreiben die Reproduzierbarkeitsprüfungen.

Nutzung und Limits

  • GET /usage liefert Ihre Aufträge nach Status, mit Tokens und geschätzten Kosten, insgesamt oder ab einem Datum (?since=2026-09-01).
  • Ihr Zugang kann ein Limit für neue Aufträge pro 24 Stunden haben. Darüber hinaus liefern neue Aufträge 429. Eine bereits verwendete partnerSubmissionId erneut zu senden, zählt nicht zum Limit.

Berichtslinks und Vertraulichkeit

  • Aufträge gehören zum API-Zugang Ihrer Fachzeitschrift, nicht zu einem Nutzerkonto, und jede Fachzeitschrift kann nur ihre eigenen Aufträge abrufen.
  • RepoReady erstellt den Berichtslink, wenn Ihr System einen abgeschlossenen Auftrag zum ersten Mal abfragt. Der Link enthält ein langes Zufallstoken und ist nirgends gelistet.
  • Berichtsseiten weisen Suchmaschinen an, sie nicht zu indexieren.
  • Wer den Link hat, kann den Bericht ohne Anmeldung öffnen. Links laufen nicht ab und lassen sich über die API nicht zurückziehen. Geben Sie sie nur an Personen weiter, die die Ergebnisse sehen sollen, etwa die zuständige Redaktion und Gutachtende.

Datenverarbeitung

  • Code, Manuskripte und Berichte werden bei unserem Hosting-Anbieter in Deutschland gespeichert. Die Analyse nutzt die in unserer Datenschutzerklärung genannten Modellanbieter.
  • Einreichungen bleiben gespeichert, bis sie auf Anfrage gelöscht werden; die API hat keinen Lösch-Endpunkt. Die Aufbewahrungsdauer für Ihre Fachzeitschrift wird in ihrem Vertrag vereinbart.
  • Für personenbezogene Daten, die RepoReady im Auftrag einer Fachzeitschrift verarbeitet, schließen beide Seiten einen Vertrag zur Auftragsverarbeitung nach Art. 28 DSGVO (AGB § 13); Muster über [email protected].
  • Senden Sie keine Einreichungen mit besonderen Kategorien personenbezogener Daten nach Art. 9 DSGVO, etwa nicht pseudonymisierte Patientendaten.
  • Dateien mit Passwörtern oder API-Schlüsseln werden wie jede andere Datei gelesen; bitten Sie Einreichende, eingecheckte Zugangsdaten zu entfernen und zu erneuern.

Die beteiligten Dienste beschreibt die Seite Datenverarbeitung.

Ergebnisse anzeigen

Die Berichtsantwort enthält diesen Hinweis als metadata.disclaimer. Zeigen Sie ihn überall dort an, wo Sie Score oder Befunde darstellen:

Automated analysis may contain errors and is not a substitute for peer review.