API Documentation
Updated October 22, 2026
vcrd.co has a JSON API for reading and managing your cards and stats. Create an API key under Settings → API keys; it's shown once, so keep it safe. Reading works on every plan. Creating, changing and deleting cards needs the Personal Pro plan or above, and the same card limits apply as in the control panel.
API v2
Send your key in the Authorization header, and JSON in request bodies:
curl https://vcardhosting.com/v2/cards -H "Authorization: Bearer vch_…"
| Method | Path | What it does |
|---|---|---|
| GET | /v2/account |
Your plan, card limit, card count and whether the API can make changes |
| GET | /v2/cards?q=&sort=&page=&per_page= |
List your cards (50 per page, at most 200) |
| POST | /v2/cards |
Create a card; answers 201 with the card |
| GET | /v2/cards/{id} |
Get one card |
| PATCH | /v2/cards/{id} |
Change some fields; fields you leave out keep their values |
| DELETE | /v2/cards/{id} |
Delete a card (you can restore it from the control panel for 30 days) |
| GET | /v2/cards/{id}/stats?from=YYYY-MM-DD&to=YYYY-MM-DD |
Daily views, scans, QR page views, downloads and texts (the last 30 days by default, at most 400) |
A card has the fields title, prefix, first_name, middle_name, last_name, suffix, nickname, birthday, organization, job_title, job_department, street_1, street_2, city, state, zip, country, email, website, phone, mobile, fax, facebook, twitter, linkedin, notes and custom (up to five {"type", "title", "value"} objects, where type is tel, url, email or note). You can also set noindex, password (write-only; "" removes it), published and sms_name.
curl -X POST https://vcardhosting.com/v2/cards \
-H "Authorization: Bearer vch_…" -H "Content-Type: application/json" \
-d '{"title": "Sales", "first_name": "Ada", "email": "ada@example.com"}'
Errors use HTTP status codes (400 invalid, 401 bad key, 403 not on your plan or over your card limit, 404 not found, 429 too many requests) and a JSON body with code, message and details.reason, plus details.field for an invalid field. Each key can make 120 requests a minute.
API v1 (legacy)
The original API still works for existing integrations. Every method is a GET to https://vcardhosting.com/api/<method>.php with these parameters:
key: your API keyformat:json,xml,php(serialized PHP) ortest(readable output, the default)callback: withformat=json, wraps the result for JSONP. It must be a plain JavaScript name, likehandleCardsorapp.cards.load.
| Method | Extra parameters | Result |
|---|---|---|
getvCards |
All your cards, in cards |
|
getvCard |
id |
One card, in cards |
getStats |
All-time totals per card and type, in cards |
|
createvCard |
xml |
Creates a card from the XML's fields; data has its id and url |
updatevCard |
id, xml |
Changes the fields given in the XML |
deletevCard |
id |
Deletes the card |
Responses always use HTTP status 200, and report success or failure in status and message: "200" with "Created Successfully", "Updated Successfully" or "Deleted Successfully"; "500" with "No Results Found" or "Not Authorized"; or "Error" with "Bad Request - Invalid XML".
The xml parameter is URL-encoded XML whose root element's children are card fields, using the names listed under v2 (except custom, password and the photo, which v1 doesn't set):
https://vcardhosting.com/api/createvCard.php?key=…&format=json&xml=%3Cvcard%3E%3Cfirst_name%3EAda%3C%2Ffirst_name%3E%3C%2Fvcard%3E
Example response:
{"status":"200","message":"vcrd.co API","link":"http:\/\/vcardhosting.com\/docs\/api\/",
"request":{"method":"getvCard","id":36,"format":"json","key":"…","date":"2026-10-22 04:05:06"},
"cards":[{"id":"36","url":"https:\/\/vcrd.co\/ccagle8\/36","title":"My vCard","first_name":"Joe"}]}
New integrations should use v2.