The API is governed by the OpenAI 86 Services Agreement (effective 1 January 2026): you need the rights to every input, reference images included, and you are "solely responsible for all use of the Outputs." Commercial use is allowed, but an image that recreates a trademark, an artist's style or a real person can still infringe. The U.S. Copyright Office's January 2025 report on copyrightability concluded that "the mere provision of prompts" does not make you an author, while human "creative arrangements or modifications of the output" can be protected.
<!doctype html>
<style>
body { margin: 0; padding: 8px; background: #fafaf7; font: 12px system-ui, sans-serif; color: #263238; }
svg { width: 100%; max-width: 600px; display: block; }
g.q { cursor: pointer; }
</style>
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
<p>Click the answers. A general illustration of the terms described on this page, not legal advice.</p>
<svg viewBox="0 0 600 300" font-size="11"></svg>
<script>
const steps = [
{ q: 'Do you hold the rights to every input, reference images included?', no: 'Stop: you need those rights (Services Agreement).' },
{ q: 'Does the output recreate a trademark, an artist\'s style or a real person?', yes: 'Risky: it can still infringe, even if commercial use is allowed.', invert: true },
{ q: 'Did a human creatively arrange or modify the output?', no: 'Use allowed, but "the mere provision of prompts" gives no authorship: little to protect.' },
];
const answers = [null, null, null];
const svg = d3.select('svg');
function draw() {
svg.selectAll('*').remove();
let y = 16, stopped = false;
steps.forEach((s, i) => {
if (stopped) return;
const g = svg.append('g').attr('transform', `translate(10,${y})`);
g.append('rect').attr('width', 400).attr('height', 44).attr('rx', 8).attr('fill', '#fff').attr('stroke', '#1f5f8b');
g.append('text').attr('x', 10).attr('y', 26).text(s.q);
['yes', 'no'].forEach((a, k) => {
const b = g.append('g').attr('class', 'q').attr('transform', `translate(${420 + k * 80},8)`).on('click', () => {
answers[i] = a; for (let j = i + 1; j < 3; j++) answers[j] = null; draw();
});
b.append('rect').attr('width', 64).attr('height', 28).attr('rx', 14).attr('fill', answers[i] === a ? '#1f5f8b' : '#e3e8ec');
b.append('text').attr('x', 32).attr('y', 18).attr('text-anchor', 'middle').attr('fill', answers[i] === a ? '#fff' : '#263238').text(a);
});
y += 56;
const bad = answers[i] && (s.invert ? answers[i] === 'yes' : answers[i] === 'no');
const msg = answers[i] === 'yes' ? s.yes : s.no;
if (answers[i] && msg) {
svg.append('text').attr('x', 30).attr('y', y).attr('fill', bad && i < 2 ? '#b5452f' : '#e09a10').text('→ ' + msg);
y += 22;
}
if (!answers[i] || (bad && i < 2)) stopped = true;
});
if (answers.every((a, i) => a && (steps[i].invert ? a === 'no' : a === 'yes'))) {
svg.append('rect').attr('x', 10).attr('y', y).attr('width', 580).attr('height', 40).attr('rx', 8).attr('fill', '#d8eee2');
svg.append('text').attr('x', 20).attr('y', y + 24).attr('fill', '#1f5a33')
.text('✔ Commercial use allowed; the human arrangement (layout, typography, edits) can be protected.');
}
}
answers[0] = 'yes'; answers[1] = 'no'; // a sample path to start
draw();
</script>