API documentation

The My-GR Link Directory REST API lets SEO administrators and agencies submit websites to the directory automatically. Access costs $50.00 per year and allows 20 submissions per day (resets at midnight, Europe/Athens).

  1. Create an account and buy API access.
  2. Open My Account → API Access and generate a token. It is shown only once — store it safely.
  3. Send it on every request: Authorization: Bearer ld_xxxxxxxx

Base URL

https://directory.my-gr.com/api/v1

Submit a link

POST /api/v1/links — JSON body:

FieldNotes
titlerequired3–100 characters
urlrequiredFull URL, must not already be listed
descriptionrequired50–1000 characters, unique text recommended
category_id or categoryrequiredNumeric id or slug from GET /categories
phone, email, addressoptionalShown on the listing page
icon_base64optionalBase64 PNG/JPG/WebP, square, ≥200×200
curl -X POST https://directory.my-gr.com/api/v1/links \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"title":"Example Studio","url":"https://example.com","category":"web-design-hosting",
       "description":"Example Studio designs fast, accessible websites for small businesses, with hosting and support included."}'

Response 201:

{
  "ok": true,
  "link": { "id": 123, "title": "Example Studio", "url": "https://example.com/", "status": "active",
            "listing_url": "https://directory.my-gr.com/site/123-example-studio", ... },
  "used_today": 1,
  "daily_limit": 20}

API submissions go live immediately (subject to later moderation).

Edit a link

PATCH /api/v1/links/{id} (or PUT) — send only the fields you want to change (same fields as above, plus "remove_icon": true). Edits do not count toward the daily limit. Edited links stay live. A rejected link can be fixed and resubmitted this way.

curl -X PATCH https://directory.my-gr.com/api/v1/links/123 \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"title":"Example Studio – Web Design","description":"Updated description of at least fifty characters about the website."}'

Response 200: {"ok": true, "link": { ... }}

Delete a link

DELETE /api/v1/links/{id} → {"ok": true, "deleted": 123}

Other endpoints

GET /api/v1/meAccount, subscription end, today's usage
GET /api/v1/categoriesAll categories (id, name, slug, parent_id)
GET /api/v1/links?page=1Your links, newest first, 100 per page
GET /api/v1/links/{id}One of your links with its status

Errors

HTTPerrorMeaning
404not_foundLink does not exist or is not yours
401unauthorizedMissing, invalid or revoked token
402subscription_requiredAPI access expired — renew on Packages
422validation_failedSee fields for per-field messages
429daily_limit / rate_limitedDaily quota used, or more than 120 requests/minute

PHP example

$ch = curl_init('https://directory.my-gr.com/api/v1/links');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $token, 'Content-Type: application/json'],
  CURLOPT_POSTFIELDS => json_encode(['title' => $title, 'url' => $url, 'category' => 'seo-digital-marketing', 'description' => $desc])]);
$res = json_decode(curl_exec($ch), true);

Python example

import requests
r = requests.post("https://directory.my-gr.com/api/v1/links", headers={"Authorization": f"Bearer {token}"},
                  json={"title": title, "url": url, "category_id": 12, "description": desc})
print(r.status_code, r.json())