---
title: "Verify your badge on demand"
method: POST
path: "/api/verify-badge"
tags: ["Badge"]
---

# Verify your badge on demand

`POST /api/verify-badge`

## Request

- Base URL: `https://curlship.com`
- URL: `https://curlship.com/api/verify-badge`
- Auth: none declared

Immediately re-fetch your listed site and check for a link back to `curlship.com`. This is the manual trigger for the otherwise-hourly badge cron — use it right after adding the badge. A qualifying link (not `rel=nofollow/ugc/sponsored`) upgrades a free listing to `dofollow`. Paid tiers are always `dofollow`. Rate limit: 30/hour per IP.

## Request body

- object
  - `url` string, uri, required

## Response `200`

Check completed

- object
  - `ok` boolean
  - `has_badge` boolean
  - `dofollow` boolean
  - `tier` string
  - `listing` object
    - `id` integer
    - `url` string, uri
    - `tier` 'free' | 'bronze' | 'silver' | 'gold' | 'platinum'
    - `title` string, nullable
    - `description` string, nullable
    - `image` string, uri, nullable
    - `has_badge` boolean: True if a dofollow link back to curlship.com was found on the site.
    - `created_at` string, date-time, nullable: When the listing was created, UTC.
  - `message` string

## Other responses

- `400`: Missing or malformed url
- `404`: No listing found for that URL
- `429`: Rate limit exceeded. Retry-After is the wait in seconds. RateLimit-Policy names the window that was hit. RateLimit repeats that name with r=0 and t equal to Retry-After. Windows: submit 10 per 3600s, verify 30 per 3600s, checkout 30 per 3600s, edit 5 per 3600s per IP, edit-listing 3 per 86400s per listing.

---

[API](https://skmtc.dev/curlship/apis/curlship-api.md) · [All operations](https://skmtc.dev/curlship/apis/curlship-api/llms.txt) · [OpenAPI document](https://skmtc.dev/curlship/apis/curlship-api/revisions/96fedc05adda?raw)
