@php /** @var string $openApiUrl */ $openApiUrl = route('v2.unidade-regional.api.openapi'); $pageTitle = 'API Unidades Regionais — Documentação'; @endphp @extends('v2-cms::layouts.app', ['title' => $pageTitle]) @push('css') @endpush @section('page-breadcrumbs') Conexões › Unidades Regionais › API Docs @endsection @section('page-actions') Voltar @endsection @section('content')
{{-- ============================================================ --}} {{-- COLUNA PRINCIPAL (ESQUERDA) --}} {{-- ============================================================ --}}
{{-- 1. Guia Prático --}}
Guia Prático
1
Gerar Token Acesse a edição de uma regional e gere um token de API
2
Copiar Token Salve em local seguro — exibido apenas uma vez
3
Configurar Header Adicione Authorization: Bearer asc_... em todas as requisições
4
Testar no Swagger Use a seção interativa abaixo para testar os endpoints
5
Integrar Use um dos exemplos de código como base para sua integração
6
Documentação Completa Consulte wiki/api/unidade-regional.md para detalhes avançados
{{-- 2. Rate Limiting --}}
Rate Limiting
Endpoint Operação Limite Janela
POST /noticias Criar notícia 30 req por minuto
POST /noticias/{id} Atualizar notícia /{id} 30 req por minuto
POST /associados Criar associado 30 req por minuto
POST /associados/{id} Atualizar associado /{id} 30 req por minuto
GET /noticias Listar notícias Sem limite —
GET /associados Listar associados Sem limite —
DELETE /noticias/{id} Arquivar notícia Sem limite —
DELETE /associados/{id} Arquivar associado Sem limite —
{{-- 3. Endpoints Disponíveis --}}
Endpoints Disponíveis
Método Rota Descrição Auth Throttle
GET /noticias Listar notícias da regional —
POST /noticias Criar notícia sem id 30/min
POST /noticias/{id} Atualizar notícia 30/min
DELETE /noticias/{id} Arquivar notícia (soft-delete) —
GET /associados Listar associados da regional —
POST /associados Criar associado sem id 30/min
POST /associados/{id} Atualizar associado 30/min
DELETE /associados/{id} Arquivar associado (soft-delete) —
{{-- 4. Exemplos de Código (colapsado) --}}

Cada exemplo abaixo é um REST client completo com todas as 8 operações da API: criar, atualizar, listar e arquivar tanto notícias quanto associados.

{{-- Tabs de linguagem --}} {{-- ── PHP Puro ─────────────────────────────────────────── --}}
<?php
// ============================================================
// Sucesu API Client — PHP Puro (cURL)
// Operações: Notícias (criar/atualizar/listar/arquivar)
//            Associados (criar/atualizar/listar/arquivar)
// ============================================================

$token   = 'asc_SEU_TOKEN';
$baseUrl = '{{ url("api/v2/unidaderegional") }}';

/**
 * Envia requisição HTTP para a API
 *
 * @param string $method   GET, POST ou DELETE
 * @param string $endpoint Rota (ex: /noticias)
 * @param string $token    Bearer token
 * @param string $baseUrl  URL base da API
 * @param array|null $data Dados do body (apenas para POST)
 * @return array
 */
function apiRequest($method, $endpoint, $token, $baseUrl, $data = null)
{
    $ch = curl_init($baseUrl . $endpoint);
    $options = [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'Authorization: Bearer ' . $token,
            'Content-Type: application/json',
        ],
    ];
    if ($method === 'POST') {
        $options[CURLOPT_POST]       = true;
        $options[CURLOPT_POSTFIELDS] = json_encode($data);
    } elseif ($method === 'DELETE') {
        $options[CURLOPT_CUSTOMREQUEST] = 'DELETE';
    }
    curl_setopt_array($ch, $options);
    $response = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $response;
}

// ════════════════════════════════════════════════════════════
//  NOTÍCIAS
// ════════════════════════════════════════════════════════════

// 1. Criar notícia (Markdown → converte para Tiptap JSON)
$result = apiRequest('POST', '/noticias', $token, $baseUrl, [
    'title'   => 'SUCESU Participa de Fórum',
    'content' => "## Resumo\n\nA regional participou do fórum nacional.\n\n- Item 1\n- Item 2",
    'tags'    => ['forum', 'nacional'],
]);
$noticiaId = $result['data']['id'];
echo "Criado: $noticiaId\n";

// 2. Atualizar notícia (envie path + campos desejados)
$result = apiRequest('POST', "/noticias/$noticiaId", $token, $baseUrl, [
    'title' => 'Título Atualizado via API',
]);
echo $result['message'] . "\n";

// 3. Listar notícias (paginado)
$list = apiRequest('GET', '/noticias?per_page=10', $token, $baseUrl);
foreach ($list['data']['news'] as $n) {
    echo "  {$n['title']} [{$n['status']}]\n";
}

// 4. Arquivar notícia (soft-delete)
$result = apiRequest('DELETE', "/noticias/$noticiaId", $token, $baseUrl);
echo $result['message'] . "\n";

// ════════════════════════════════════════════════════════════
//  ASSOCIADOS
// ════════════════════════════════════════════════════════════

// 5. Criar associado (description em Markdown → rich text)
$result = apiRequest('POST', '/associados', $token, $baseUrl, [
    'name'        => 'Hospital São Lucas',
    'description' => "## Convênio\n\nDesconto de **15%** em consultas.\n\n### Benefícios\n\n- Consultas\n- Exames",
    'url'         => 'https://hospitalsaolucas.com.br',
    'tags'        => 'saúde, desconto, destaque',
]);
$empresaId = $result['data']['results'][0]['empresa_id'];
echo "Criado: $empresaId\n";

// 6. Atualizar associado
$result = apiRequest('POST', "/associados/$empresaId", $token, $baseUrl, [
    'name' => 'Hospital São Lucas - Atualizado',
]);
echo $result['message'] . "\n";

// 7. Listar associados
$list = apiRequest('GET', '/associados', $token, $baseUrl);
foreach ($list['data']['associados'] as $a) {
    echo "  {$a['nome']} [{$a['status']}]\n";
}

// 8. Arquivar associado (soft-delete do vínculo + registro)
$vinculoId = $list['data']['associados'][0]['id'];
$result = apiRequest('DELETE', "/associados/$vinculoId", $token, $baseUrl);
echo $result['message'] . "\n";

Arquivo completo: wiki/api/examples/sucusu_client.php

{{-- ── Laravel 5.5 ────────────────────────────────────── --}}
// ============================================================
// Sucesu API Client — Laravel 5.5 (Guzzle)
// Use dentro de um Artisan Command ou Controller
// ============================================================

use GuzzleHttp\Client;

$token = 'asc_SEU_TOKEN';
$client = new Client([
    'base_uri' => '{{ url("api/v2/unidaderegional") }}',
    'headers'  => [
        'Authorization' => 'Bearer ' . $token,
        'Content-Type'  => 'application/json',
    ],
]);

// ════════════════════════════════════════════════════════════
//  NOTÍCIAS
// ════════════════════════════════════════════════════════════

// 1. Criar notícia
$response = $client->post('/noticias', [
    'json' => [
        'title'   => 'Notícia via Laravel',
        'content' => '## Conteúdo em **Markdown**',
        'tags'    => ['laravel', 'api'],
    ],
]);
$result = json_decode($response->getBody(), true);
$noticiaId = $result['data']['id'];
echo "Criado: $noticiaId\n";

// 2. Atualizar notícia
$client->post("/noticias/$noticiaId", [
    'json' => [
        'title' => 'Título Atualizado',
    ],
]);

// 3. Listar notícias
$response = $client->get('/noticias', ['query' => ['per_page' => 10]]);
$news = json_decode($response->getBody(), true);
foreach ($news['data']['news'] as $n) {
    echo "  {$n['title']} [{$n['status']}]\n";
}

// 4. Arquivar notícia
$client->delete("/noticias/$noticiaId");

// ════════════════════════════════════════════════════════════
//  ASSOCIADOS
// ════════════════════════════════════════════════════════════

// 5. Criar associado
$response = $client->post('/associados', [
    'json' => [
        'name'        => 'Hospital São Lucas',
        'description' => '## Convênio\n\nDesconto de **15%**.',
        'tags'        => 'saúde, desconto',
    ],
]);
$result = json_decode($response->getBody(), true);
$empresaId = $result['data']['results'][0]['empresa_id'];

// 6. Atualizar associado
$client->post("/associados/$empresaId", [
    'json' => [
        'name' => 'Hospital - Atualizado',
    ],
]);

// 7. Listar associados
$response = $client->get('/associados');
$associados = json_decode($response->getBody(), true);
foreach ($associados['data']['associados'] as $a) {
    echo "  {$a['nome']} [{$a['status']}]\n";
}

// 8. Arquivar associado
$vinculoId = $associados['data']['associados'][0]['id'];
$client->delete("/associados/$vinculoId");

Arquivo completo: wiki/api/examples/SucesuApiClient.php

{{-- ── Node.js ────────────────────────────────────────── --}}
// ============================================================
// Sucesu API Client — Node.js 18+ (fetch nativo)
// Operações: Notícias + Associados (CRUD completo)
// ============================================================

const TOKEN = 'asc_SEU_TOKEN';
const BASE  = '{{ url("api/v2/unidaderegional") }}';

/** Envia requisição para a API */
async function api(method, endpoint, data = null) {
    const opts = {
        method,
        headers: {
            'Authorization': `Bearer ${TOKEN}`,
            'Content-Type':  'application/json',
        },
    };
    if (data) opts.body = JSON.stringify(data);
    const resp = await fetch(`${BASE}${endpoint}`, opts);
    return resp.json();
}

// ════════════════════════════════════════════════════════════
//  NOTÍCIAS
// ════════════════════════════════════════════════════════════

// 1. Criar notícia
const created = await api('POST', '/noticias', {
    title:   'Nova Matéria',
    content: '## Conteúdo em **Markdown**',
    tags:    ['exemplo', 'nodejs'],
});
const noticiaId = created.data.id;
console.log(`Criado: ${noticiaId}`);

// 2. Atualizar notícia
await api('POST', `/noticias/${noticiaId}`, {
    title: 'Título Atualizado',
});

// 3. Listar notícias
const news = await api('GET', '/noticias?per_page=10');
news.data.news.forEach(n =>
    console.log(`  ${n.title} [${n.status}]`));

// 4. Arquivar notícia
await api('DELETE', `/noticias/${noticiaId}`);

// ════════════════════════════════════════════════════════════
//  ASSOCIADOS
// ════════════════════════════════════════════════════════════

// 5. Criar associado
const emp = await api('POST', '/associados', {
    name:        'Hospital São Lucas',
    description: '## Convênio\n\nDesconto de **15%**.',
    tags:        'saúde, desconto',
});
const empresaId = emp.data.results[0].empresa_id;

// 6. Atualizar associado
await api('POST', `/associados/${empresaId}`, {
    name: 'Hospital - Atualizado',
});

// 7. Listar associados
const list = await api('GET', '/associados');
list.data.associados.forEach(a =>
    console.log(`  ${a.nome} [${a.status}]`));

// 8. Arquivar associado
const vinculoId = list.data.associados[0].id;
await api('DELETE', `/associados/${vinculoId}`);

Arquivo completo: wiki/api/examples/sucusu-client.js

{{-- ── Python ─────────────────────────────────────────── --}}
# ============================================================
# Sucesu API Client — Python (requests)
# Operações: Notícias + Associados (CRUD completo)
# ============================================================

import requests

TOKEN = 'asc_SEU_TOKEN'
BASE  = '{{ url("api/v2/unidaderegional") }}'
HEADERS = {'Authorization': f'Bearer {TOKEN}',
           'Content-Type': 'application/json'}


def api(method, endpoint, data=None):
    """Envia requisição para a API."""
    url = BASE + endpoint
    if method == 'POST':
        r = requests.post(url, headers=HEADERS, json=data)
    elif method == 'DELETE':
        r = requests.delete(url, headers=HEADERS)
    else:
        r = requests.get(url, headers=HEADERS)
    return r.json()


# ════════════════════════════════════════════════════════════
#  NOTÍCIAS
# ════════════════════════════════════════════════════════════

# 1. Criar notícia
result = api('POST', '/noticias', {
    'title':   'Nova Matéria',
    'content': '## Conteúdo em **Markdown**',
    'tags':    ['exemplo', 'python'],
})
noticia_id = result['data']['id']
print(f'Criado: {noticia_id}')

# 2. Atualizar notícia
api('POST', f'/noticias/{noticia_id}', {
    'title': 'Título Atualizado',
})

# 3. Listar notícias
news = api('GET', '/noticias?per_page=10')
for n in news['data']['news']:
    print(f'  {n["title"]} [{n["status"]}]')

# 4. Arquivar notícia
api('DELETE', f'/noticias/{noticia_id}')

# ════════════════════════════════════════════════════════════
#  ASSOCIADOS
# ════════════════════════════════════════════════════════════

# 5. Criar associado
result = api('POST', '/associados', {
    'name':        'Hospital São Lucas',
    'description': '## Convênio\n\nDesconto de **15%**.',
    'tags':        'saúde, desconto',
})
empresa_id = result['data']['results'][0]['empresa_id']

# 6. Atualizar associado
api('POST', f'/associados/{empresa_id}', {
    'name': 'Hospital - Atualizado',
})

# 7. Listar associados
assoc = api('GET', '/associados')
for a in assoc['data']['associados']:
    print(f'  {a["nome"]} [{a["status"]}]')

# 8. Arquivar associado
vinculo_id = assoc['data']['associados'][0]['id']
api('DELETE', f'/associados/{vinculo_id}')

Arquivo completo: wiki/api/examples/sucusu_client.py

{{-- ── Ruby on Rails ──────────────────────────────────── --}}
# ============================================================
# Sucesu API Client — Ruby (HTTParty)
# Operações: Notícias + Associados (CRUD completo)
# ============================================================

require 'httparty'

TOKEN = 'asc_SEU_TOKEN'
BASE  = '{{ url("api/v2/unidaderegional") }}'
HEADERS = { 'Authorization' => "Bearer #{TOKEN}",
            'Content-Type'  => 'application/json' }

def api(method, endpoint, data = nil)
  url = BASE + endpoint
  case method
  when 'POST'
    HTTParty.post(url, headers: HEADERS, body: data.to_json)
  when 'DELETE'
    HTTParty.delete(url, headers: HEADERS)
  else
    HTTParty.get(url, headers: HEADERS)
  end.parsed_response
end

# ════════════════════════════════════════════════════════════
#  NOTÍCIAS
# ════════════════════════════════════════════════════════════

# 1. Criar notícia
result = api('POST', '/noticias', {
  title:   'Nova Matéria',
  content: '## Conteúdo em **Markdown**',
  tags:    ['exemplo', 'ruby'],
})
noticia_id = result['data']['id']
puts "Criado: #{noticia_id}"

# 2. Atualizar notícia
api('POST', "/noticias/#{noticia_id}", {
  title: 'Título Atualizado',
})

# 3. Listar notícias
news = api('GET', '/noticias?per_page=10')
news['data']['news'].each do |n|
  puts "  #{n['title']} [#{n['status']}]"
end

# 4. Arquivar notícia
api('DELETE', "/noticias/#{noticia_id}")

# ════════════════════════════════════════════════════════════
#  ASSOCIADOS
# ════════════════════════════════════════════════════════════

# 5. Criar associado
result = api('POST', '/associados', {
  name:        'Hospital São Lucas',
  description: '## Convênio\n\nDesconto de **15%**.',
  tags:        'saúde, desconto',
})
empresa_id = result['data']['results'][0]['empresa_id']

# 6. Atualizar associado
api('POST', "/associados/#{empresa_id}", {
  name: 'Hospital - Atualizado',
})

# 7. Listar associados
assoc = api('GET', '/associados')
assoc['data']['associados'].each do |a|
  puts "  #{a['nome']} [#{a['status']}]"
end

# 8. Arquivar associado
vinculo_id = assoc['data']['associados'][0]['id']
api('DELETE', "/associados/#{vinculo_id}")

Arquivo completo: wiki/api/examples/sucusu_client.rb

{{-- ── Rust ───────────────────────────────────────────── --}}
// ============================================================
// Sucesu API Client — Rust (reqwest + tokio)
// Cargo.toml: reqwest, tokio, serde, serde_json
// ============================================================

use reqwest::Client;
use serde_json::{json, Value};

const TOKEN: &str = "asc_SEU_TOKEN";
const BASE: &str  = "{{ url("api/v2/unidaderegional") }}";

async fn api(client: &Client, method: &str, endpoint: &str,
            data: Option<Value>) -> Result<Value, Box<dyn std::error::Error>> {
    let url = format!("{}{}", BASE, endpoint);
    let mut req = match method {
        "POST"   => client.post(&url),
        "DELETE" => client.delete(&url),
        _        => client.get(&url),
    };
    req = req.bearer_auth(TOKEN);
    if let Some(body) = data {
        req = req.json(&body);
    }
    let resp = req.send().await?;
    let val: Value = resp.json().await?;
    Ok(val)
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    // ════════════════════════════════════════════════════════
    //  NOTÍCIAS
    // ════════════════════════════════════════════════════════

    // 1. Criar notícia
    let created = api(&client, "POST", "/noticias", Some(json!({
        "title":   "Nova Matéria",
        "content": "## Conteúdo em **Markdown**",
        "tags":    ["exemplo", "rust"],
    }))).await?;
    let noticia_id = created["data"]["id"].as_str().unwrap();
    println!("Criado: {}", noticia_id);

    // 2. Atualizar notícia
    api(&client, "POST", &format!("/noticias/{}", noticia_id), Some(json!({
        "title": "Título Atualizado",
    }))).await?;

    // 3. Listar notícias
    let news = api(&client, "GET", "/noticias?per_page=10", None).await?;
    if let Some(items) = news["data"]["news"].as_array() {
        for n in items {
            println!("  {} [{}]", n["title"], n["status"]);
        }
    }

    // 4. Arquivar notícia
    api(&client, "DELETE", &format!("/noticias/{}", noticia_id), None).await?;

    // ════════════════════════════════════════════════════════
    //  ASSOCIADOS
    // ════════════════════════════════════════════════════════

    // 5. Criar associado
    let emp = api(&client, "POST", "/associados", Some(json!({
        "name":        "Hospital São Lucas",
        "description": "## Convênio\n\nDesconto de **15%**.",
        "tags":        "saúde, desconto",
    }))).await?;
    let empresa_id = emp["data"]["results"][0]["empresa_id"]
        .as_str().unwrap();

    // 6. Atualizar associado
    api(&client, "POST", &format!("/associados/{}", empresa_id), Some(json!({
        "name": "Hospital - Atualizado",
    }))).await?;

    // 7. Listar associados
    let list = api(&client, "GET", "/associados", None).await?;
    if let Some(items) = list["data"]["associados"].as_array() {
        for a in items {
            println!("  {} [{}]", a["nome"], a["status"]);
        }
    }

    // 8. Arquivar associado
    let vinculo_id = list["data"]["associados"][0]["id"]
        .as_str().unwrap();
    api(&client, "DELETE", &format!("/associados/{}", vinculo_id), None).await?;

    Ok(())
}

Arquivo completo: wiki/api/examples/main.rs

{{-- 6. Swagger UI (colapsado) --}}
{{-- ============================================================ --}} {{-- COLUNA LATERAL (DIREITA) --}} {{-- ============================================================ --}}
{{-- Importar OpenAPI --}}
Importar OpenAPI

Importe a especificação OpenAPI em suas ferramentas favoritas:

URL do Spec
Abrir JSON

Ferramentas compatíveis:
Swagger UI Postman Bruno Insomnia Redoc VS Code
{{-- Autenticação --}}
Autenticação

Todas as requisições (exceto GET /openapi.json) exigem um Bearer Token válido.

Formato do Header Authorization: Bearer asc_...
Prefixo do Token asc_ + 60 caracteres aleatórios
Como obter Acesse a edição de uma regional → Seção "API de Integração" → "Gerar Token"
@endsection @push('scripts') @endpush