Browse documentation

Type to search the documentation. Press Esc to close.

Scribble account API: keys, designs, handwritings and credits

For developers

Four small GET endpoints that answer the questions every integration asks first: is this key any good (/me), which card can I send (/designs), which hand can I write in (/handwriting), and can I afford it (/credits). None of them cost a credit or change anything.

On this page

design_id and handwriting on a send both take an id, and for a long time there was no way to find one except by opening the web app and reading a uuid out of the address bar. These endpoints are that missing half. They are also what populates the dropdowns in a Zapier or Make connector, which is why a key scoped only to cards:send can still read the two catalogue endpoints.

#GET/api/v1/me

Check a key and read the account it belongs to. Use this as your connection test.

Requires scope any valid key

Test a key
curl https://scribblecards.com/api/v1/me \
  -H "Authorization: Bearer sk_live_U9BXdSSU_your_key_here"
200 OK
{
  "object": "account",
  "organization": {
    "name": "On Top of I.T.",
    "default_handwriting": "miriam"
  },
  "key": {
    "name": "Production CRM",
    "prefix": "sk_live_U9BXdSSU",
    "scopes": ["cards:send", "cards:read"]
  },
  "credits_available": 625,
  "can_send_cards": true
}

#GET/api/v1/designs

List your saved card designs. These ids are what design_id takes.

Requires scope cards:read or cards:send

200 OK
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "id": "1cba1acd-6988-443d-af00-46e64ef56d89",
      "object": "design",
      "name": "Holiday 2026 — clients",
      "kind": "card",
      "source": "catalog",
      "preview_url": null,
      "created_at": "2026-08-05T06:54:26.205Z",
      "updated_at": "2026-08-05T06:57:20.553Z"
    }
  ],
  "note": "Pass an `id` from this list as `design_id` on POST /api/v1/cards. Leave design_id out and the card is sent on plain stock."
}

#GET/api/v1/handwriting

List the handwritings on offer. These ids are what handwriting takes.

Requires scope cards:read or cards:send

200 OK (truncated)
{
  "object": "list",
  "has_more": false,
  "default": "miriam",
  "styles": ["Everyday", "Quick", "Flowing", "Print", "Classic", "Wildcard"],
  "data": [
    {
      "id": "miriam",
      "object": "handwriting",
      "name": "Miriam",
      "style": "Print",
      "is_default": true,
      "sample_font_url": "https://scribblecards.com/fonts/all_fonts/miriam.ttf"
    }
  ]
}

Every hand is named after a person, and there are around two hundred of them. Group your picker by style — two hundred first names in alphabetical order tells nobody whether Adelaide is a tidy print hand or a looping cursive. The styles array is the full set, in the order we show them.

#GET/api/v1/credits

How many cards you can still send.

Requires scope any valid key

200 OK
{
  "object": "credit_balance",
  "available": 625,
  "balance": 625,
  "reserved_for_campaigns": 0,
  "cards_you_can_send": 625,
  "top_up_url": "https://scribblecards.com/app/credits"
}

Read available, not balance. The difference is credits a scheduled campaign has already promised — spending those would leave the campaign short on the morning it runs.

Last checked against the product on . Something wrong or missing? Tell us.