Business card layout generator
Turn a small set of identity and contact details into a practical business card layout without guessing coordinates by eye.
Run — free
Choose a standard card size and orientation, set an optional safe margin, and receive deterministic regions for the name, title, company, email, phone, website, and address. Every returned coordinate is measured in millimetres, while type sizes are provided in points, making the result useful for document generators, design scripts, print templates, and repeatable brand workflows.
Start with the finished card and its safe area
A business card layout begins with the physical object, not a screen canvas. Select the US, ISO, or Japanese standard and choose landscape or portrait orientation. The generator reports the finished width and height in millimetres, then subtracts the requested inner margin to establish a safe area. That inset is where every text region is placed. It is not a printer bleed or crop allowance; those production values belong outside the finished dimensions and should be added by the document system that consumes the result. Keeping that distinction clear prevents text from drifting too close to a trimmed edge. The default four-millimetre margin is a conservative starting point for common cards, while the supported range lets a template owner adjust visual density. Because all positions use the same top-left origin and unit, the output can be transferred directly to SVG, canvas, PDF, or desktop-publishing coordinates with one deliberate unit conversion.
Understand how identity and contact regions are assigned
The safe area is divided into an identity section and a contact section. The identity section always starts with the required name, followed by the title and company when those values are present. Empty optional fields are omitted, so they do not leave mysterious blank rows in the result. The remaining contact section is shared by email, phone, website, and address in that stable order. Each region contains an identifier, semantic role, normalized text, position, dimensions, font size, line allowance, and alignment. This is a layout specification rather than a rendered design: it gives a downstream renderer reliable boxes while leaving font family, weight, colour, decorative rules, logos, and background treatment to the brand system. Landscape cards reserve slightly more vertical emphasis for identity, while portrait cards balance the sections for their taller composition. Identical input always produces identical geometry, which makes the capability suitable for tests, batch generation, and version-controlled templates.
Apply the result in a print or digital workflow
Use the returned card object to create the artboard and the safe_area object to draw optional layout guides during development. For every entry in regions, place the supplied text at x_mm and y_mm inside the stated width and height. Treat font_size_pt as a practical fitted recommendation: the calculation considers text length, available width, region height, and the permitted line count. A long address may use two lines, while compact identity and contact values stay on one line. Your renderer should still use its own font metrics because real typefaces differ in character width, and it may reduce the suggested size if a chosen family is unusually wide. Do not enlarge text beyond the recommendation without checking overflow. Add bleed, crop marks, colour profiles, and printer-specific tolerances after laying out the finished card. For digital previews, preserve the physical aspect ratio so approval images match the eventual print composition instead of stretching to an arbitrary viewport.
What you can do with it
Generate employee card templates
Convert staff directory fields into consistent text boxes before rendering branded cards in bulk.
Build a print design form
Preview how submitted identity and contact details occupy a chosen standard card size.
Create testable document layouts
Use deterministic coordinates as golden inputs for SVG, PDF, or canvas rendering pipelines.
FAQ
What does one request cost?
Each API request costs $0.002. The browser version can run the same deterministic calculation locally.
Which card sizes are supported?
The supported finished sizes are US at 88.9 by 50.8 millimetres, ISO at 85 by 55 millimetres, and Japanese at 91 by 55 millimetres.
Does the safe margin include print bleed?
No. The safe margin is inside the finished edge. Add bleed outside the returned card dimensions in your print-production system.
Are optional empty fields assigned regions?
No. Optional fields that are missing or contain only whitespace are omitted, allowing the remaining lines to use the available space.
Will the recommended font size fit every typeface?
It is a deterministic estimate based on geometry and text length. Check final fitting with the actual font metrics and reduce the size when necessary.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/doc/business-card-layout \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Jordan Lee","card_size":"us"}'const res = await fetch("https://api.kit.forhosting.com/doc/business-card-layout", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"name": "Jordan Lee",
"card_size": "us"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/doc/business-card-layout",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"name": "Jordan Lee",
"card_size": "us"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/doc/business-card-layout", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"name":"Jordan Lee","card_size":"us"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"name":"Jordan Lee","card_size":"us"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/doc/business-card-layout", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"name": "Jordan Lee",
"card_size": "us"
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "doc.business_card_layout",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_mb | 25 |
max_pages | 200 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |